生产环境配置的核心目标是安全、稳定、可追溯、易维护;需分层管理不可变代码、可变配置和动态数据,严格执行数据库连接规范、禁用文件编辑、静态资源代理及敏感目录防护。

WP项目部署环境并不天然复杂,关键在于把几个核心环节理清楚。CI/CD 流程本身不是负担,而是让 WordPress 从开发到上线更可控、可重复的保障机制。生产环境配置规范的核心目标是:安全、稳定、可追溯、易维护。
CI/CD 流程中 WP 项目的合理分层
不要把 WordPress 当作“黑盒”直接打包发布。应按职责拆解为三类资产:
-
不可变代码层:主题(
wp-content/themes/xxx)、插件(wp-content/plugins/xxx)——这些需纳入 Git 版本控制,通过 CI 构建镜像或同步到服务器 -
可变配置层:数据库连接、密钥(
wp-config.php中的define('AUTH_KEY', ...)等)、环境开关(WP_DEBUG、WP_HOME)——必须从容器环境变量或挂载的配置文件注入,严禁硬编码进 Git -
动态数据层:上传文件(
wp-content/uploads/)、缓存、用户生成内容——全部通过 Docker volume 或对象存储(如 S3 兼容服务)持久化,与容器生命周期解耦
生产环境配置的硬性规范
这些不是建议,而是上线前必须满足的底线要求:
-
数据库连接不走 localhost:WordPress 容器内用服务名(如
db)连接 MySQL 容器;禁止使用127.0.0.1或localhost,否则 Apache+PHP-FPM 模式下会绕过 Docker DNS -
禁用文件编辑功能:在
wp-config.php中强制添加define('DISALLOW_FILE_EDIT', true);,防止后台任意修改主题/插件 PHP 文件 -
静态资源由反向代理托管:Nginx 应直接提供
/wp-content/uploads/和主题 CSS/JS 资源,不经过 PHP;同时设置expires 1y;和add_header Cache-Control "public, immutable"; -
敏感目录禁止 Web 访问:Nginx 配置中明确拒绝访问
.env、wp-config.php、wp-includes/下非入口文件等路径
CI 流水线的关键检查点
每次提交触发 CI 时,至少执行以下验证:
- 扫描
wp-content下所有 PHP 文件,确保无eval(、system(、exec(等危险函数调用(可用php -l+ 自定义正则脚本) - 校验
wp-config.php模板是否包含占位符(如%%DB_HOST%%),而非真实密码;真实凭据只存在于 CI 的 secret 变量或 Vault 中 - 运行轻量级健康检查:启动临时容器,用
curl -f http://wordpress:80/wp-admin/install.php | head -n1验证基础服务可达且无 500 错误 - 比对当前部署的插件列表与
composer.lock或plugins.txt清单,发现未声明插件立即阻断发布
Docker Compose 生产就绪最小配置示例
这是精简但符合规范的 docker-compose.prod.yml 片段:
version: '3.8'
services:
db:
image: mariadb:10.11
environment:
MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
MYSQL_DATABASE: wordpress
MYSQL_USER: wpuser
MYSQL_PASSWORD: ${DB_PASSWORD}
volumes:
- db_data:/var/lib/mysql
restart: unless-stopped
<p>wordpress:
image: wordpress:php8.2-apache
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wpuser
WORDPRESS_DB_PASSWORD: ${DB_PASSWORD}
WORDPRESS_DB_NAME: wordpress
WORDPRESS_CONFIG_EXTRA: |
define('DISALLOW_FILE_EDIT', true);
define('WP_MEMORY_LIMIT', '256M');
if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') {
$_SERVER['HTTPS'] = 'on';
}
volumes:</p><ul><li>wp_content:/var/www/html/wp-content</li><li>./config/php.ini:/usr/local/etc/php/php.ini:ro
depends_on:</li><li>db
restart: unless-stopped</li></ul><p>nginx:
image: nginx:alpine
ports:</p><ul><li>"80:80"</li><li>"443:443"
volumes:</li><li>wp_content:/var/www/html/wp-content:ro</li><li>./nginx/conf.d:/etc/nginx/conf.d:ro</li><li>./nginx/ssl:/etc/nginx/ssl:ro
depends_on:</li><li>wordpress</li></ul><p>volumes:
db_data:
wp_content:
注意:${DB_PASSWORD} 这类变量必须由 CI 环境注入,本地 .env 文件仅用于开发,不得提交。

















