WordPressACK

简介: 本项目提供WordPress 6.9中文版的ECS一键部署脚本与Docker镜像(PHP 8.5-Alpine),集成Redis缓存(Tair)、RDS数据库及对象缓存插件,目录结构清晰区分静态核心与动态用户数据,支持高并发与安全生产环境。

Deploy WordPress on ACK

ConfigMap

apiVersion: v1
data:
  wp-config.php: |
    <?php

    if (!function_exists('getenv_docker')) {
   

      function getenv_docker($env, $default) {
   

        if ($fileEnv = getenv($env . '_FILE')) {
   

          return rtrim(file_get_contents($fileEnv), "\r\n");
        }
        else if (($val = getenv($env)) !== false) {
   

          return $val;
        }
        else {
   

          return $default;
        }
      }
    }

    // ** Database settings - You can get this info from your web host ** //
    define( 'DB_NAME', getenv_docker('WORDPRESS_DB_NAME', 'ace-prod-wordpress') );
    define( 'DB_USER', getenv_docker('WORDPRESS_DB_USER', 'ace_prod_wordpress') );
    define( 'DB_PASSWORD', getenv_docker('WORDPRESS_DB_PASSWORD', 'example password') );
    define( 'DB_HOST', getenv_docker('WORDPRESS_DB_HOST', 'mysql') );

    define( 'DB_CHARSET', getenv_docker('WORDPRESS_DB_CHARSET', 'utf8mb4') );
    define( 'DB_COLLATE', getenv_docker('WORDPRESS_DB_COLLATE', '') );

    // add Redis Config
    define( 'WP_REDIS_HOST', getenv_docker('WORDPRESS_REDIS_HOST', '127.0.0.1') );
    define( 'WP_REDIS_PORT', getenv_docker('WORDPRESS_REDIS_PORT', 6379) );
    define( 'WP_REDIS_PREFIX', getenv_docker('WORDPRESS_REDIS_PREFIX', 'my-moms-site') );
    define( 'WP_REDIS_DATABASE', getenv_docker('WORDPRESS_REDIS_DATABASE', 0) ); // 0-15
    define( 'WP_REDIS_PASSWORD', getenv_docker('WORDPRESS_REDIS_PASSWORD', '') );

    define( 'WP_REDIS_TIMEOUT', getenv_docker('WORDPRESS_REDIS_TIMEOUT', 1) );
    define( 'WP_REDIS_READ_TIMEOUT', getenv_docker('WORDPRESS_REDIS_READ_TIMEOUT', 1) );

    define( 'AUTH_KEY',         getenv_docker('WORDPRESS_AUTH_KEY',         '99abd1e9ffdd9cc126605bcdf6639a3caa8c0b27') );
    define( 'SECURE_AUTH_KEY',  getenv_docker('WORDPRESS_SECURE_AUTH_KEY',  'f222517f366c8c42226b4f76f5b067f2503bc955') );
    define( 'LOGGED_IN_KEY',    getenv_docker('WORDPRESS_LOGGED_IN_KEY',    '6196f322c499139d1df4d83c579601bc414e0a91') );
    define( 'NONCE_KEY',        getenv_docker('WORDPRESS_NONCE_KEY',        'a5ef87362a979a62d7ec68b6196c3bab2a1255ec') );
    define( 'AUTH_SALT',        getenv_docker('WORDPRESS_AUTH_SALT',        '1ddc6c8a9c62ba56c2273fee355659c05ef7e865') );
    define( 'SECURE_AUTH_SALT', getenv_docker('WORDPRESS_SECURE_AUTH_SALT', '4d3fdc62605c320ba88bc2c063565aeeb30b13c7') );
    define( 'LOGGED_IN_SALT',   getenv_docker('WORDPRESS_LOGGED_IN_SALT',   'a61ec326f3b07c1fb5519566faf3cef3f07b14c0') );
    define( 'NONCE_SALT',       getenv_docker('WORDPRESS_NONCE_SALT',       '5dc5449d278131e72660f3b2419d4fea56473174') );

    $table_prefix = getenv_docker('WORDPRESS_TABLE_PREFIX', 'wp_');

    define( 'WP_DEBUG', !!getenv_docker('WORDPRESS_DEBUG', '') );

    if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && strpos($_SERVER['HTTP_X_FORWARDED_PROTO'], 'https') !== false) {
   

      $_SERVER['HTTPS'] = 'on';
    }

    if ($configExtra = getenv_docker('WORDPRESS_CONFIG_EXTRA', '')) {
   

      eval($configExtra);
    }

    /* That's all, stop editing! Happy publishing. */

    /** Absolute path to the WordPress directory. */
    if ( ! defined( 'ABSPATH' ) ) {
   

      define( 'ABSPATH', __DIR__ . '/' );
    }

    define( 'AUTOMATIC_UPDATER_DISABLED', true );

    require_once ABSPATH . 'wp-settings.php';
kind: ConfigMap
metadata:
  name: ace-prod-wp-config
  namespace: ace

Secret

apiVersion: v1
data:
  WORDPRESS_DB_HOST: XXX
  WORDPRESS_DB_PASSWORD: XXX
  WORDPRESS_REDIS_HOST: XXX
  WORDPRESS_REDIS_PASSWORD: XXX
kind: Secret
metadata:
  name: ace-prod-sc-wordpress
  namespace: ace
type: Opaque

UnitedDeployment

apiVersion: apps.kruise.io/v1alpha1
kind: UnitedDeployment
metadata:
  name: ace-prod-ud-wordpress
spec:
  replicas: 1
  selector:
    matchLabels:
      env: prod
      project: ace
      app: ace-prod-wordpress
  template:
    deploymentTemplate:
      metadata:
        labels:
          app: ace-prod-wordpress
          env: prod
          project: ace
        name: ace-prod-wordpress
      spec:
        selector:
          matchLabels:
            app: ace-prod-wordpress
            env: prod
            project: ace
        strategy:
          rollingUpdate:
            maxSurge: 25%
            maxUnavailable: 25%
          type: RollingUpdate
        template:
          metadata:
            labels:
              app: ace-prod-wordpress
              env: prod
              project: ace
          spec:
            containers:
            - env:
              - name: WORDPRESS_DB_HOST
                valueFrom:
                  secretKeyRef:
                    key: WORDPRESS_DB_HOST
                    name: ace-prod-sc-wordpress
              - name: WORDPRESS_DB_PASSWORD
                valueFrom:
                  secretKeyRef:
                    key: WORDPRESS_DB_PASSWORD
                    name: ace-prod-sc-wordpress
              - name: WORDPRESS_REDIS_HOST
                valueFrom:
                  secretKeyRef:
                    key: WORDPRESS_REDIS_HOST
                    name: ace-prod-sc-wordpress
              - name: WORDPRESS_REDIS_PASSWORD
                valueFrom:
                  secretKeyRef:
                    key: WORDPRESS_REDIS_PASSWORD
                    name: ace-prod-sc-wordpress
              - name: aliyun_logs_ace-prod-wordpress
                value: stdout
              image: crpi-35tjd6nv3bx5haji.cn-shanghai.personal.cr.aliyuncs.com/rocdove/wordpress:6.9.4
              imagePullPolicy: IfNotPresent
              name: ace-prod-wordpress
              ports:
              - containerPort: 80
                name: app-tcp-80
                protocol: TCP
              resources:
                limits:
                  cpu: "1"
                  ephemeral-storage: 20Gi
                  memory: 2Gi
                requests:
                  cpu: 250m
                  ephemeral-storage: 10Gi
                  memory: 512Mi
              terminationMessagePath: /dev/termination-log
              terminationMessagePolicy: File
              volumeMounts:
              - mountPath: /etc/localtime
                name: volume-localtime
              - mountPath: /var/www/html/wp-content
                name: volume-ace-prod-wordpress
              - mountPath: /var/www/html/wp-config.php
                name: volume-wp-config
                subPath: wp-config.php
            volumes:
            - hostPath:
                path: /etc/localtime
                type: ""
              name: volume-localtime
            - name: volume-ace-prod-wordpress
              persistentVolumeClaim:
                claimName: ace-prod-pvc-wordpress
            - configMap:
                defaultMode: 420
                name: ace-prod-wp-config
              name: volume-wp-config
  topology:
    subsets:
    - name: subset-a
      nodeSelectorTerm:
        matchExpressions:
        - key: alibabacloud.com/nodepool-id
          operator: In
          values:
          - npxxx  # 需要替换为节点池A的ID。
      maxReplicas: 2
      minReplicas: 1
    - name: subset-b
      nodeSelectorTerm:
        matchExpressions:
        - key: alibabacloud.com/nodepool-id
          operator: In
          values:
          - npxxx # 需要替换为节点池B的ID。
      maxReplicas: 2
      minReplicas: 0
    - name: subset-c
      nodeSelectorTerm:
        matchExpressions:
        - key: type
          operator: In
          values:
          - virtual-kubelet
      tolerations:
      - key: virtual-kubelet.io/provider
        operator: Exists
      minReplicas: 0

HorizontalPodAutoscaler

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: ace-prod-hpa-wordpress
  namespace: ace
spec:
  minReplicas: 1
  maxReplicas: 5
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 20
  scaleTargetRef:
    apiVersion: apps.kruise.io/v1alpha1
    kind: UnitedDeployment
    name: ace-prod-ud-wordpress

Base Tools

# redis
FLUSHALL;
# 消耗CPU
openssl speed &

# Install dig and ab
sudo dnf install bind-utils httpd-tools

dig <域名> [txt]
ab -t <测试时长> -s <访问超时时间> -c <并发量> <url>

On ECS

部署

WordPress 6.9 目录树结构说明

/var/www/html/
├── wp-admin/                 # WordPress 管理后台核心文件
├── wp-content/               # 用户内容目录
│   ├── plugins/              # 插件目录
│   │   └── redis-cache/      # Redis 缓存插件
│   ├── themes/               # 主题目录
│   ├── uploads/              # 上传文件目录
│   └── object-cache.php      # Redis 对象缓存文件
├── wp-includes/              # WordPress 核心包含文件
├── wp-config.php             # WordPress 配置文件(数据库、Redis 等)
├── wp-settings.php           # WordPress 设置入口
├── index.php                 # WordPress 前端入口
└── .htaccess                 # Apache 重写规则

WordPress 目录结构分类

静态目录(运行过程中不变化)

  • /wp-admin - WordPress 管理界面文件
  • /wp-includes - WordPress 核心库和函数文件
  • /wp-content/plugins - 插件目录(插件文件本身不变)
  • /wp-content/themes - 主题目录(主题文件本身不变)

动态目录(用户使用过程中数据更新)

  • /wp-content/uploads - 用户上传的媒体文件(图片、视频等)
  • /wp-content/backup - 备份数据(如果存在)
  • 数据库目录 - 存储所有文章、评论、用户等数据

说明

  • 静态目录主要包含 WordPress 系统代码和主题/插件程序文件
  • 动态目录会因用户操作(发布文章、上传图片、评论等)而产生新数据
    这些文件夹和文件结构
function log_prefix() {
   
    echo "[$(date +'%Y-%m-%d %H:%M:%S')]"
}

sudo su - ecs-user

# install php
sudo dnf install -y httpd php php-mysqlnd php-gd php-ldap php-odbc php-pear php-xml php-xmlrpc

# install wordpress
echo "$(log_prefix) installing wordpress..."
wget https://cn.wordpress.org/wordpress-6.9-zh_CN.tar.gz -O wordpress-6.9-zh_CN.tar.gz
tar -zxf wordpress-6.9-zh_CN.tar.gz

## config wordpress
echo "$(log_prefix) config wordpress..."
sudo cat << 'EOF' > wordpress/wp-config.php
<?php

if (!function_exists('getenv_docker')) {
   

  function getenv_docker($env, $default) {
   

    if ($fileEnv = getenv($env . '_FILE')) {
   

      return rtrim(file_get_contents($fileEnv), "\r\n");
    }
    else if (($val = getenv($env)) !== false) {
   

      return $val;
    }
    else {
   

      return $default;
    }
  }
}

// ** Database settings - You can get this info from your web host ** //
define( 'DB_NAME', getenv_docker('WORDPRESS_DB_NAME', 'ace-prod-wordpress') );
define( 'DB_USER', getenv_docker('WORDPRESS_DB_USER', 'ace_prod_wordpress') );
define( 'DB_PASSWORD', getenv_docker('WORDPRESS_DB_PASSWORD', 'example password') );
define( 'DB_HOST', getenv_docker('WORDPRESS_DB_HOST', 'mysql') );

define( 'DB_CHARSET', getenv_docker('WORDPRESS_DB_CHARSET', 'utf8mb4') );
define( 'DB_COLLATE', getenv_docker('WORDPRESS_DB_COLLATE', '') );

// add Redis Config
define( 'WP_REDIS_HOST', getenv_docker('WORDPRESS_REDIS_HOST', '127.0.0.1') );
define( 'WP_REDIS_PORT', getenv_docker('WORDPRESS_REDIS_PORT', 6379) );
define( 'WP_REDIS_PREFIX', getenv_docker('WORDPRESS_REDIS_PREFIX', 'my-moms-site') );
define( 'WP_REDIS_DATABASE', getenv_docker('WORDPRESS_REDIS_DATABASE', 0) ); // 0-15
define( 'WP_REDIS_PASSWORD', getenv_docker('WORDPRESS_REDIS_PASSWORD', '') );

define( 'WP_REDIS_TIMEOUT', getenv_docker('WORDPRESS_REDIS_TIMEOUT', 1) );
define( 'WP_REDIS_READ_TIMEOUT', getenv_docker('WORDPRESS_REDIS_READ_TIMEOUT', 1) );

define( 'AUTH_KEY',         getenv_docker('WORDPRESS_AUTH_KEY',         '99abd1e9ffdd9cc126605bcdf6639a3caa8c0b27') );
define( 'SECURE_AUTH_KEY',  getenv_docker('WORDPRESS_SECURE_AUTH_KEY',  'f222517f366c8c42226b4f76f5b067f2503bc955') );
define( 'LOGGED_IN_KEY',    getenv_docker('WORDPRESS_LOGGED_IN_KEY',    '6196f322c499139d1df4d83c579601bc414e0a91') );
define( 'NONCE_KEY',        getenv_docker('WORDPRESS_NONCE_KEY',        'a5ef87362a979a62d7ec68b6196c3bab2a1255ec') );
define( 'AUTH_SALT',        getenv_docker('WORDPRESS_AUTH_SALT',        '1ddc6c8a9c62ba56c2273fee355659c05ef7e865') );
define( 'SECURE_AUTH_SALT', getenv_docker('WORDPRESS_SECURE_AUTH_SALT', '4d3fdc62605c320ba88bc2c063565aeeb30b13c7') );
define( 'LOGGED_IN_SALT',   getenv_docker('WORDPRESS_LOGGED_IN_SALT',   'a61ec326f3b07c1fb5519566faf3cef3f07b14c0') );
define( 'NONCE_SALT',       getenv_docker('WORDPRESS_NONCE_SALT',       '5dc5449d278131e72660f3b2419d4fea56473174') );

$table_prefix = getenv_docker('WORDPRESS_TABLE_PREFIX', 'wp_');

define( 'WP_DEBUG', !!getenv_docker('WORDPRESS_DEBUG', '') );

if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && strpos($_SERVER['HTTP_X_FORWARDED_PROTO'], 'https') !== false) {
   

  $_SERVER['HTTPS'] = 'on';
}

if ($configExtra = getenv_docker('WORDPRESS_CONFIG_EXTRA', '')) {
   

  eval($configExtra);
}

/* That's all, stop editing! Happy publishing. */

/** Absolute path to the WordPress directory. */
if ( ! defined( 'ABSPATH' ) ) {

  define( 'ABSPATH', __DIR__ . '/' );
}

define( 'AUTOMATIC_UPDATER_DISABLED', true );

require_once ABSPATH . 'wp-settings.php';

EOF

sudo cp -arf wordpress/* /var/www/html/

# install plugin redis-cache
echo "$(log_prefix) installing plugin redis-cache..."
wget https://github.com/rhubarbgroup/redis-cache/archive/refs/tags/2.6.5.tar.gz -O redis-cache.2.6.5.tar.gz
tar -zxf redis-cache.2.6.5.tar.gz
sudo cp -arf redis-cache-2.6.5 /var/www/html/wp-content/plugins/redis-cache
sudo cp /var/www/html/wp-content/plugins/redis-cache/includes/object-cache.php /var/www/html/wp-content/

# start httpd
echo "$(log_prefix) starting httpd..."
sudo systemctl restart httpd
sudo systemctl enable httpd
echo "$(log_prefix) done"
相关文章
|
运维 架构师 Linux
2024年阿里云ACE复习计划
作者目前已考取阿里云的ACP,可以说对阿里云的产品有了基础的了解,出于个人能力规划,还是计划继续备考ACE考试,但是重点不一定是突出在考试上,而是希望通过学习的过程能够查漏补缺,强化自己的云计算架构设计和实践能力,以及对复杂业务场景的解决能力。撰写本系列文的主要目的在于记录从零起步直至全面备战ACE的心路历程,这既是对未来自己的一个珍贵回顾,也是向有志于此道的同行者分享这一路上所积累的宝贵经验和实战心得,期待我们都能在回望时,清晰看见这段自我蜕变和成长的轨迹。
|
API 开发者
工作日和节假日api
节假日api核心服务托管在阿里云之上,API天然分布式、高可用。
|
Cloud Native Serverless 容器
袋鼠:云原生底层系统探索和实践
随着云计算的发展,云原生概念已经开始成为一种被广泛接受的开发理念。本文将概述我们面向云原生场景在底层技术方面做的探索以及实践。文章根据云栖大会系统软件专场内容整理,演讲者:韩伟东
5473 1
|
3月前
|
弹性计算 缓存 Kubernetes
wordpressHPA
本方案基于Kubernetes部署高可用WordPress:采用NFS PV优化挂载参数(nolock/vers3/缓存策略等)提升IO性能;Secret安全管理数据库凭证;HPA实现CPU驱动的弹性伸缩(1–16副本,40%/70%阈值);Deployment配置资源限制与虚拟节点亲和;UnitedDeployment支持多可用区+ECI混合调度,保障业务稳定与成本优化。
|
2月前
|
弹性计算 固态存储 前端开发
阿里云服务器多少钱一年?2026年9月最新价格38元、99元和199元配置详解
2026年阿里云三大入门价:38元/年(轻量服务器,适合新手博客)、99元/年(经济型ECS,4GB内存,性价比之选)、199元/年(通用u1实例,5Mbps带宽,商用首选)。三档覆盖学习、开发到生产场景,需重点关注首年优惠与续费价格差异。(239字)
538 0
|
4月前
|
SQL 分布式计算 对象存储
Lake Search:ES x Paimon 让湖上多模态数据可搜可用
当图片、视频、文本和向量在 Paimon 中增长到 PB 级,传统“同步到湖外再建索引”的方式,会让搜索面临数据就绪慢、第二份事实数据成本高和版本治理复杂等问题。本文介绍阿里云 Elasticsearch 9.4 Search Lake 如何直接挂载与 Paimon 表版本关联的 Global Index,在不复制事实数据的前提下提供 BM25、kNN、结构化过滤、排序与聚合能力,并结合多模态样本湖场景拆解方案架构、Demo 及性能与成本取舍。 关键词:Search Lake、Apache Paimon、Elasticsearch 9.4、Global Index、OpenLake、多模态检索
683 0
|
10月前
|
存储 人工智能 专有云
中智集团接入飞天企业版,行业云成果入选国资委AI标杆!
近日,中智集团接入阿里云飞天企业版打造的“中智行业云”成功入选国务院国资委首批“AI战略性高价值场景”。同时,该成果凭借先进的技术架构与场景赋能价值,还获评中国信息通信研究院“面向AI的智能化专有云底座”创新应用实践,成为AI与云计算在人力资源领域的标杆应用。
675 0
|
8月前
|
存储 人工智能 开发工具
OSS 向量 Bucket 最佳实践:快速构建多模态图片语义检索
本文介绍基于 OSS 向量 Bucket 和阿里云大模型服务平台百炼的多模态 Embedding 模型,搭建海量图片的智能语义检索系统,实现基于自然语言描述的文搜图能力的最佳实践,适用于电商商品搜索、智能相册、媒体资产管理、AI 语义检索、图片知识库等场景。
781 5
|
存储 人工智能 安全
《Confidential MaaS 技术指南》发布,从 0 到 1 构建可验证 AI 推理环境
Confidential MaaS 将从前沿探索逐步成为 AI 服务的安全标准配置。
|
云栖大会
阿里云云栖大会2025年9月24日开启,免费申请大会门票,速度领取~
2025云栖大会将于9月24-26日举行,官网免费预约畅享票,审核后短信通知,持证件入场
4108 13