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的心路历程,这既是对未来自己的一个珍贵回顾,也是向有志于此道的同行者分享这一路上所积累的宝贵经验和实战心得,期待我们都能在回望时,清晰看见这段自我蜕变和成长的轨迹。
|
Java 关系型数据库 Linux
Linux|Java|jar包的解压和重新打包(更新配置)
Linux|Java|jar包的解压和重新打包(更新配置)
869 0
|
2月前
|
存储 NoSQL 项目管理
【2026最新】Notion中文版安装和使用图文教程
Notion是一款全能型AI工作台,集成笔记、文档、数据库、项目管理、知识库与日历看板于一体。支持多端同步、中文界面、丰富模板及团队协作,个人版完全免费,功能强大且易上手。(239字)
|
2月前
|
Java
Abaqus 2026 安装教程:JDK配置+汉化详解(64位)
Abaqus 2026 是一款专业非线性有限元分析软件,支持材料、几何及边界非线性问题。本教程详述离线安装全流程:含JDK21配置、License部署、CAE/Standard/Explicit模块安装、环境变量设置及简体中文界面启用,操作清晰、一步一图。(239字)
|
2月前
|
数据可视化 Linux Docker
给 Hermes Agent 装个可视化面板!Docker 一键部署 Hermes WebUI 完整教程(Win+Liunx)
用过 Hermes Agent 的朋友都知道,它的命令行模式虽然功能强大,但对新手和不想敲命令的朋友来说还是有点门槛。好消息是,它的 Web UI 终于来了!不用再对着黑框框敲命令,点一点就能配置、管理和使用,今天就给大家分享一下 Hermes WebUI 的完整部署教程。
4522 0
给 Hermes Agent 装个可视化面板!Docker 一键部署 Hermes WebUI 完整教程(Win+Liunx)
|
5月前
|
Kubernetes 应用服务中间件 API
应对 Nginx Ingress 退役,是时候理清这些易混淆的概念了
本文希望提供一种更简单的方式,来理解这些容易混淆的技术概念:Nginx、Ingress、Ingress Controller、Ingress API、Nginx Ingress、Higress、Gateway API。
2790 165
|
Java Linux 开发工具
Linux下解压修改jar包并运行
Linux下解压修改jar包并运行
2210 0
|
8月前
|
存储 人工智能 安全
《Confidential MaaS 技术指南》发布,从 0 到 1 构建可验证 AI 推理环境
Confidential MaaS 将从前沿探索逐步成为 AI 服务的安全标准配置。
|
弹性计算 负载均衡 Java
【上云基础系列 02-01】通过SLB+1台ECS+ESS弹性伸缩,搭建一个精简版的上云标准弹性架构(含方案及教程)
通常,构建一个弹性架构(即使是一个最基础的入门版),至少需要2台ECS。但是,很多小微企业刚开始上云的时候,为了节省成本不愿意购买更多的服务器。通过 “ALB+ESS弹性伸缩+1台ECS+RDS”方案,在保障低成本的同时,也不牺牲业务架构的弹性设计,更避免了很多人因为节省成本选择了单体架构后频繁改造架构的困局。 方案中的几个设计非常值得小微企业借鉴:(1)通过ALB/RDS的按量付费,节省了初期流量不大时的费用;(2)通过ESS弹性伸缩,不需要提前购买服务器资源,但是当业务增长或减少时却保持了资源弹性自动扩缩容。
|
弹性计算 架构师 Cloud Native
阿里云新版ACE考试通关经历回顾
阿里云新版ACE考试通关经历回顾