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的心路历程,这既是对未来自己的一个珍贵回顾,也是向有志于此道的同行者分享这一路上所积累的宝贵经验和实战心得,期待我们都能在回望时,清晰看见这段自我蜕变和成长的轨迹。
|
5月前
|
人工智能 运维 Prometheus
从 API 到 AI Agent:阿里云云监控 CLI + Agent Skill 实战
阿里云推出云监控CLI与Agent Skill,将运维能力转化为AI可执行工作流。用户通过自然语言指令,即可由Agent自动完成资源接入、告警管理及数据查询等任务,实现可控、可审计的智能化运维自动化。
968 148
|
3月前
|
弹性计算 缓存 Kubernetes
wordpressHPA
本方案基于Kubernetes部署高可用WordPress:采用NFS PV优化挂载参数(nolock/vers3/缓存策略等)提升IO性能;Secret安全管理数据库凭证;HPA实现CPU驱动的弹性伸缩(1–16副本,40%/70%阈值);Deployment配置资源限制与虚拟节点亲和;UnitedDeployment支持多可用区+ECI混合调度,保障业务稳定与成本优化。
|
5月前
|
存储 弹性计算 文件存储
阿里云文件存储NAS对接完全指南:从零搭建到生产级调优
本文系统讲解阿里云文件存储NAS的完整对接流程。从NAS的核心概念与产品优势入手,深入解析通用型与极速型NAS的选型策略。详细演示通过控制台一键挂载、Linux手动mount、Windows SMB映射、容器CSI插件等多种对接方式,并给出/etc/fstab自动挂载配置。在权限管理方面,完整覆盖权限组白名单、NFS ACL细粒度控制与RAM访问控制三层安全体系。针对高并发场景,提供nconnect参数调优、NFS缓存参数优化、NFSv4.1升级等性能提升方案。同时涵盖跨VPC访问、云企业网互通、VPN网关连接本地数据中心等高级网络场景。最后给出监控告警配置、成本优化策略与常见问题排查方法,帮
623 1
|
5月前
|
安全 API 数据安全/隐私保护
Ollama 本地大模型外网安全访问最佳实践:ZeroNews 内网穿透完整方案
企业本地部署 Ollama 大模型,出差、异地团队想远程调用 API 十分麻烦,开 VPN 流程复杂,直接暴露 11434 端口极易被扫描攻击。本文分享 ZeroNews 内网穿透完整实践,不用公网 IP、不用客户端,通过独立隧道隔离不同访问人群,搭配账号认证、IP 拦截、接口路由过滤缩小暴露面,兼顾外勤开发、外协对接、对外开放 API 等需求,兼顾易用性与数据安全,完整讲解流量架构、分场景安全配置与落地价值,解决私有化本地大模型外网访问难题。
Ollama 本地大模型外网安全访问最佳实践:ZeroNews 内网穿透完整方案
|
9月前
|
Kubernetes 应用服务中间件 nginx
最全的kubectl命令用法
本文系统讲解kubectl命令行工具:详解所有子命令(创建、查询、部署、调试等)、API资源列表、自动补全配置,并通过大量实操示例(如创建/查看/编辑/删除资源、扩缩容、回滚、标签管理等)助你快速掌握Kubernetes集群管理核心技能。(239字)
1238 143
|
5月前
|
人工智能 架构师 API
AI 编程的“不可能三角”突围:从订阅困局到自主掌控
运营人亲测:用VS Code+Continue插件+api.cumob.com聚合网关,以极低成本(国内直连、按量付费)自由调度全球各大厂商的顶尖模型,打破订阅贵、网络差、体验碎的“不可能三角”,重掌AI编程主动权。(239字)
|
7月前
|
网络协议 Java 数据格式
【赵渝强老师】Docker容器的跨节点通信
本文详解Docker容器跨主机通信的三种方案,重点介绍基于Overlay网络的实现:通过ZooKeeper注册中心配置Docker集群,创建overlay网络,使不同主机上的容器能用虚拟IP直接互通,并提供完整部署步骤与验证方法。(239字)
588 3
|
7月前
|
存储 NoSQL 项目管理
【2026最新】Notion中文版安装和使用图文教程
Notion是一款全能型AI工作台,集成笔记、文档、数据库、项目管理、知识库与日历看板于一体。支持多端同步、中文界面、丰富模板及团队协作,个人版完全免费,功能强大且易上手。(239字)
|
云栖大会
阿里云云栖大会2025年9月24日开启,免费申请大会门票,速度领取~
2025云栖大会将于9月24-26日举行,官网免费预约畅享票,审核后短信通知,持证件入场
4081 13