
1. 为什么我还在用这套“老掉牙”的组合来部署WordPress先把结论摆在前面CentOS 7 MySQL Nginx PHP 7 这套组合放到今天来看确实不算新网上甚至有一堆人说“CentOS 7 都停止维护了还折腾它干嘛”。但如果你手上有几台跑着老业务的老机器或者你所在的环境就是要求用这套稳定到不能再稳定的栈那这套方案依然是能打的选择。我自己前前后后在不同环境里部署过不下几十次 WordPress从最早的 Apache 到后来的 Nginx从 PHP 5.6 一路升到 7.x踩过的坑能写满一个笔记本。这篇内容就是把这些年积累下来的实操经验按照一套完整的部署流程重新梳理出来尽量做到你拿着就能照着做做完就能跑起来。WordPress 本身是什么不用多介绍全球装机量最大的内容管理系统小到个人博客大到企业官网、电商站点都能用它搭起来。而 Nginx 作为 Web 服务器处理静态资源和高并发的能力比 Apache 更轻快MySQL 负责数据存储PHP 7 则是 WordPress 的运行环境。这套组合的核心优势在于资源占用相对可控性能表现稳定社区资料极其丰富遇到问题基本都能搜到答案。适合谁看适合有一定 Linux 基础、想自己动手把 WordPress 跑起来的人也适合那些用惯了面板、想搞清楚底层到底发生了什么的运维新手。我见过太多人一上来就装宝塔面板点几下确实能跑起来但一旦出问题就完全不知道从哪里查起。所以这篇内容会尽量把每一步背后的逻辑讲清楚让你不仅知道怎么敲命令还知道为什么要敲这条命令。2. 部署前的整体思路与环境规划2.1 为什么选 Nginx 而不是 Apache很多人第一次接触 WordPress 部署时教程里用的都是 Apache因为 Apache 配置简单.htaccess文件直接扔上去就能用。但 Nginx 在高并发场景下的表现明显更好尤其是处理静态文件时Nginx 的异步非阻塞模型比 Apache 的同步阻塞模型效率高出一大截。WordPress 虽然是个动态程序但页面上大量的图片、CSS、JS 都是静态资源Nginx 在这方面的优势非常明显。另一个原因是 Nginx 的内存占用更低。同样一台 1GB 内存的小机器跑 Apache 可能光 Web 服务器就吃掉两三百兆而 Nginx 通常只占几十兆剩下的内存留给 MySQL 和 PHP 更宽裕。当然Nginx 也不是没有缺点它不支持.htaccess所有重写规则必须写在配置文件里这对新手来说稍微麻烦一点但一旦配置好性能和维护性都更好。2.2 PHP 7 相比 PHP 5.6 的提升到底有多大这个问题我专门做过对比测试。同一台机器同一个 WordPress 站点PHP 5.6 和 PHP 7.0 的页面生成时间差距接近一倍。PHP 7 引入了全新的 Zend 引擎数据结构做了大量优化函数调用开销显著降低。官方给出的数据是性能提升两倍左右我实测下来虽然没有那么夸张但 50% 以上的提升是有的。更重要的是PHP 7 对内存的利用效率更高同样的并发请求数PHP 7 占用的内存更少。对于小内存机器来说这意味着能扛住更多的访问量。另外PHP 7 还改进了错误处理机制很多在 PHP 5.6 下只是警告的问题在 PHP 7 里会直接报错虽然初期调试会麻烦一点但长远来看能帮你更早发现代码里的隐患。2.3 MySQL 版本选择与字符集规划MySQL 我建议用 5.7 版本这个版本在 CentOS 7 上非常成熟兼容性好性能也足够。虽然 MySQL 8.0 出来了很久但 8.0 默认的认证插件和字符集跟老版本的 PHP 驱动有时候会打架尤其是 PHP 7.0 搭配 MySQL 8.0 时经常出现连接认证失败的问题。如果你不是特别需要 8.0 的新特性5.7 是更稳妥的选择。字符集方面一定要用utf8mb4不要用utf8。WordPress 从 4.2 版本开始就全面支持utf8mb4了这个字符集能存储 emoji 表情和更多特殊字符。如果你用utf8用户评论里发个 emoji 就会变成问号或者直接截断。建库的时候就要指定好后期再改非常麻烦需要导出数据、修改表结构、再导入数据量大的话能折腾好几个小时。2.4 目录结构与权限规划在开始装之前先想清楚文件放哪里。我习惯把 WordPress 放在/var/www/html目录下这是 Nginx 默认的站点根目录。但如果你要跑多个站点建议用/var/www/站点名的方式分开管理。比如/var/www/blog、/var/www/shop这样后期扩展和维护都方便。权限方面Nginx 和 PHP 通常以nginx或www-data用户运行而 WordPress 的文件所有者应该是你的登录用户。这样你上传文件、更新插件时不需要每次都输密码同时 Nginx 也有读取权限。具体做法是把 WordPress 目录的所有者设为你自己所属组设为 Nginx 的运行组然后目录权限 755文件权限 644。不要图省事直接给 777那是给自己挖坑。3. 系统环境准备与基础配置3.1 系统更新与必要工具安装拿到一台干净的 CentOS 7 机器后第一件事是更新系统。虽然 CentOS 7 已经停止维护但如果你用的是内网源或者本地镜像更新依然能正常进行。执行yum update -y把已有的软件包升级到最新版本这一步可能需要几分钟取决于网络和更新量。更新完成后安装一些后续会用到的工具。wget用来下载文件vim用来编辑配置文件unzip用来解压 WordPress 安装包net-tools用来查看网络状态。这些工具虽然小但缺了任何一个都会在后续步骤里卡住。一条命令搞定yum install -y wget vim unzip net-tools epel-releaseepel-release是 Extra Packages for Enterprise Linux 的源很多第三方软件包都在这里面后面装 PHP 7 的时候会用到。3.2 关闭 SELinux 还是配置它SELinux 是 CentOS 上让人又爱又恨的东西。爱它是因为它确实能提升系统安全性恨它是因为它经常在你不知道的时候拦住 Nginx 访问文件或者 PHP 连接数据库。对于新手来说我建议先把它关掉等站点跑起来之后再慢慢研究怎么配置。临时关闭用setenforce 0永久关闭需要编辑/etc/selinux/config文件把SELINUXenforcing改成SELINUXdisabled然后重启生效。如果你不想重启临时关闭加上永久关闭的配置修改下次重启后也会保持关闭状态。注意如果你的环境有严格的安全合规要求不能关闭 SELinux那就需要配置相应的策略。比如允许 Nginx 访问网络、允许 PHP 连接数据库、允许写入上传目录等。这部分内容比较复杂建议单独查阅 SELinux 相关文档。3.3 防火墙配置与端口开放CentOS 7 默认用的是firewalld不是iptables。你需要把 HTTP 的 80 端口和 HTTPS 的 443 端口开放出来否则外部访问不了。命令如下firewall-cmd --permanent --add-servicehttp firewall-cmd --permanent --add-servicehttps firewall-cmd --reload如果你改了 SSH 端口记得把新端口也加进去不然重载防火墙后自己就被关在外面了。这个坑我踩过当时在远程机器上改完防火墙规则直接 reloadSSH 连接瞬间断开最后只能通过控制台进去救火。3.4 创建专用用户与目录规划我不建议直接用 root 跑 WordPress虽然方便但风险太高。创建一个专用用户比如叫webuser把 WordPress 目录的所有权给它。Nginx 和 PHP 以nginx用户运行把webuser加入nginx组这样文件权限就理顺了。useradd -m -s /bin/bash webuser mkdir -p /var/www/html chown -R webuser:nginx /var/www/html chmod -R 755 /var/www/html这样webuser可以自由读写站点文件Nginx 也有读取权限其他用户没有任何权限。安全性和便利性都兼顾到了。4. 编译安装 Nginx 与 PHP 7 的完整过程4.1 Nginx 的安装方式选择yum 还是编译Nginx 的安装有两种方式直接用 yum 装或者下载源码编译。yum 装的好处是简单快捷一条命令搞定升级也方便。编译安装的好处是可以自定义模块比如你需要某些特定的第三方模块或者想优化编译参数。对于大多数场景我建议直接用 yum 装。CentOS 7 的 EPEL 源里有 Nginx版本虽然不算最新但稳定够用。如果你非要最新版本可以去 Nginx 官网添加官方源。编译安装虽然灵活但后期升级麻烦每次都要重新编译而且容易因为依赖问题卡住。yum install -y nginx systemctl start nginx systemctl enable nginx装完后用浏览器访问服务器 IP看到 Nginx 的欢迎页面就说明成功了。如果访问不了检查防火墙和 SELinux 是否放行。4.2 PHP 7 的源配置与安装CentOS 7 自带的 PHP 版本是 5.4太老了必须换源。常用的 PHP 源有 Remi 源和 Webtatic 源我用 Remi 比较多更新及时包也全。先安装 Remi 源yum install -y https://rpms.remirepo.net/enterprise/remi-release-7.rpm yum install -y yum-utils yum-config-manager --enable remi-php74然后安装 PHP 7.4 以及 WordPress 需要的扩展yum install -y php php-fpm php-mysql php-gd php-mbstring php-xml php-json php-curl php-zip php-opcache这里解释一下每个扩展的作用。php-mysql是连接 MySQL 数据库的没有它 WordPress 连数据库都连不上。php-gd用于图片处理比如生成缩略图。php-mbstring处理多字节字符串中文环境下必不可少。php-xml和php-json是很多插件依赖的。php-curl用于外部请求比如调用第三方 API。php-zip用于解压插件和主题包。php-opcache是缓存加速扩展能显著提升 PHP 执行效率。4.3 PHP-FPM 配置调优与 Nginx 对接PHP 装好后需要配置 PHP-FPM 和 Nginx 的对接。PHP-FPM 的配置文件在/etc/php-fpm.d/www.conf重点改几个地方。把运行用户和组改成nginxuser nginx group nginx然后调整进程管理方式。默认是dynamic对于小站点够用。如果你的站点访问量比较大可以改成static并固定进程数减少进程频繁创建销毁的开销。但静态模式占内存多要根据机器配置来定。pm dynamic pm.max_children 50 pm.start_servers 5 pm.min_spare_servers 5 pm.max_spare_servers 35这几个参数的含义是最多同时跑 50 个 PHP 进程启动时先开 5 个最少保持 5 个空闲进程最多保持 35 个空闲进程。具体数值要根据你的内存来算每个 PHP 进程大概占 30-50MB 内存50 个进程就是 1.5-2.5GB内存小的机器要适当调低。Nginx 这边需要配置一个 server 块来对接 PHP-FPM。在/etc/nginx/conf.d/下新建一个wordpress.confserver { listen 80; server_name your_domain.com; root /var/www/html; index index.php index.html; location / { try_files $uri $uri/ /index.php?$args; } location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } }try_files那行是 WordPress 固定链接的关键没有它除了首页以外的所有页面都会 404。fastcgi_pass指向 PHP-FPM 的监听地址默认是 9000 端口。4.4 MySQL 安装与安全初始化MySQL 直接用 yum 装yum install -y mysql-server systemctl start mysqld systemctl enable mysqld装完后执行安全初始化脚本mysql_secure_installation这个脚本会引导你设置 root 密码、删除匿名用户、禁止 root 远程登录、删除测试数据库。每一步都选 yes除非你有特殊需求。root 密码设复杂一点别用 123456 这种。然后创建 WordPress 专用的数据库和用户CREATE DATABASE wordpress DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE USER wpuserlocalhost IDENTIFIED BY 强密码; GRANT ALL PRIVILEGES ON wordpress.* TO wpuserlocalhost; FLUSH PRIVILEGES;注意字符集一定要指定utf8mb4排序规则用utf8mb4_unicode_ci。用户权限只给wordpress库不要给全局权限这是最小权限原则。5. WordPress 部署与站点上线实操5.1 下载与解压 WordPress去 WordPress 官网下载最新版本用wget直接拉下来cd /tmp wget https://wordpress.org/latest.tar.gz tar -xzf latest.tar.gz解压后会得到一个wordpress目录把它里面的所有文件复制到/var/www/htmlcp -r /tmp/wordpress/* /var/www/html/ chown -R webuser:nginx /var/www/html如果你之前已经在/var/www/html里放了测试文件先清空再复制。复制完成后目录结构应该是index.php、wp-admin、wp-content、wp-includes这些直接躺在/var/www/html下面。5.2 配置 wp-config.php 的关键参数WordPress 的配置文件需要手动创建。把wp-config-sample.php复制一份改名为wp-config.php然后编辑define(DB_NAME, wordpress); define(DB_USER, wpuser); define(DB_PASSWORD, 你设置的强密码); define(DB_HOST, localhost); define(DB_CHARSET, utf8mb4); define(DB_COLLATE, );这几个参数对应之前创建的数据库信息。DB_HOST用localhost走本地 socket 连接比走 TCP 快一点点。DB_CHARSET和DB_COLLATE保持utf8mb4相关设置。接下来是认证密钥去 WordPress 官方密钥生成页面拿一组新的替换掉配置文件里那八行define语句。这些密钥用于加密用户登录信息每站独立不要跟别人共用。最后在文件末尾加上$table_prefix wp_; define(WP_DEBUG, false); define(WP_MEMORY_LIMIT, 256M); define(WP_MAX_MEMORY_LIMIT, 512M); define(DISALLOW_FILE_EDIT, true);WP_DEBUG生产环境一定要关掉不然错误信息会暴露给访客。WP_MEMORY_LIMIT设 256M 给前台用WP_MAX_MEMORY_LIMIT设 512M 给后台用后台操作比较吃内存。DISALLOW_FILE_EDIT禁止在后台直接编辑主题和插件文件防止被攻击后直接改代码。5.3 Nginx 伪静态规则与上传目录保护WordPress 的固定链接需要 Nginx 配合重写规则。前面try_files那行已经处理了大部分情况但还需要加一些安全规则。在wordpress.conf的 server 块里补充location /favicon.ico { log_not_found off; access_log off; } location /robots.txt { allow all; log_not_found off; access_log off; } location ~* /wp-content/.*\.php$ { deny all; } location ~* /wp-includes/.*\.php$ { deny all; } location ~ /\.ht { deny all; }这几条规则的作用是禁止执行wp-content和wp-includes目录下的 PHP 文件防止恶意脚本被上传后执行禁止访问.ht开头的文件防止配置文件泄露。这些是基本的安全加固生产环境必须加。5.4 完成安装与后台初始化配置都改完后重启 Nginx 和 PHP-FPMsystemctl restart nginx systemctl restart php-fpm然后浏览器访问你的域名或 IP应该能看到 WordPress 的安装向导。选择语言、填写站点标题、管理员用户名、密码、邮箱点安装几十秒后就能看到登录页面了。管理员用户名不要用admin这是被暴力破解最多的用户名。密码要复杂大小写字母加数字加特殊符号长度至少 12 位。邮箱填真实的找回密码要用。登录后台后第一件事是去“设置”-“固定链接”选“文章名”或者自定义结构。我习惯用/%postname%/简洁对 SEO 也友好。保存后 Nginx 的重写规则才会真正生效。6. 部署后的性能优化与安全加固6.1 开启 OPcache 与对象缓存PHP 7 自带的 OPcache 扩展能缓存编译后的 PHP 脚本避免每次请求都重新编译。在/etc/php.d/下找到 OPcache 的配置文件确认opcache.enable1。然后调整几个关键参数opcache.memory_consumption128 opcache.interned_strings_buffer8 opcache.max_accelerated_files4000 opcache.revalidate_freq60memory_consumption是 OPcache 占用的内存大小128MB 对于大多数站点够用。max_accelerated_files是能缓存的最大文件数WordPress 加上插件大概有几千个文件设 4000 比较保险。revalidate_freq是检查文件更新的频率设 60 秒意味着每分钟检查一次生产环境可以设大一点比如 300 秒。对象缓存方面如果机器内存充裕可以装 Redis 或者 Memcached配合 WordPress 的缓存插件使用。但小机器上不建议因为 Redis 本身也要占几十兆内存效果不一定比 OPcache 好多少。6.2 Nginx 层面的缓存与压缩配置Nginx 可以开启 gzip 压缩减少传输数据量。在nginx.conf的http块里加上gzip on; gzip_vary on; gzip_min_length 1024; gzip_types text/plain text/css text/xml text/javascript application/json application/javascript application/xmlrss image/svgxml; gzip_comp_level 6;gzip_min_length设 1024 字节太小的文件压缩反而浪费 CPU。gzip_comp_level设 6压缩率和 CPU 消耗比较平衡设 9 虽然压缩率更高但 CPU 消耗明显增加。静态资源缓存也可以加上location ~* \.(jpg|jpeg|png|gif|ico|css|js|svg|woff|woff2)$ { expires 30d; add_header Cache-Control public, immutable; }这样图片、CSS、JS 这些不常变的文件会在浏览器端缓存 30 天减少重复请求。6.3 数据库定期备份与优化MySQL 的数据是站点的核心必须定期备份。写一个简单的备份脚本用mysqldump导出数据库然后用gzip压缩最后删掉七天前的旧备份#!/bin/bash BACKUP_DIR/backup/mysql DATE$(date %Y%m%d) mysqldump -u wpuser -p密码 wordpress | gzip $BACKUP_DIR/wordpress_$DATE.sql.gz find $BACKUP_DIR -name wordpress_*.sql.gz -mtime 7 -delete把这个脚本加到 crontab 里每天凌晨三点执行。备份文件最好再同步到另一台机器或者对象存储防止本机磁盘故障导致备份也丢了。数据库优化方面可以定期执行OPTIMIZE TABLE清理碎片但 WordPress 的表不多效果有限。更重要的是控制文章修订版本数量在wp-config.php里加上define(WP_POST_REVISIONS, 5);这样每篇文章最多保留 5 个修订版本不会把数据库撑爆。6.4 常见安全加固措施清单安全方面除了前面提到的目录权限和文件执行限制还有几件事要做。首先是限制后台登录尝试次数可以装一个 Limit Login Attempts 类的插件防止暴力破解。其次是修改后台登录地址把/wp-admin改成自定义路径减少被扫描的概率。然后是定期更新 WordPress 核心、主题和插件。很多漏洞都是因为版本太老被利用的。但更新前一定要先备份我见过太多次更新后白屏的情况有备份就能快速回滚。最后是隐藏 WordPress 版本号在functions.php里加上remove_action(wp_head, wp_generator);这样页面源码里就不会出现 WordPress 版本信息攻击者少了一个判断依据。7. 踩坑实录与常见问题排查7.1 上传文件大小限制怎么改WordPress 后台上传主题或插件时经常遇到“上传的文件尺寸超过 upload_max_filesize 限制”的报错。这个限制涉及三个地方PHP 的upload_max_filesize和post_max_size以及 Nginx 的client_max_body_size。PHP 这边改/etc/php.iniupload_max_filesize 64M post_max_size 64M max_execution_time 300 max_input_time 300Nginx 这边在nginx.conf的http块或者 server 块里加client_max_body_size 64M;三个值要协调post_max_size要大于等于upload_max_filesizeNginx 的client_max_body_size也要大于等于upload_max_filesize。改完重启 PHP-FPM 和 Nginx。7.2 固定链接 404 的排查思路固定链接 404 是最常见的问题原因通常是 Nginx 的try_files没配好或者.htaccess文件不存在Nginx 不读.htaccess但 WordPress 会检查。先确认wordpress.conf里有try_files $uri $uri/ /index.php?$args;这行。然后确认 Nginx 配置加载正确用nginx -t测试语法。如果配置没问题但还是 404检查 PHP-FPM 是否正常运行systemctl status php-fpm看状态。还有一种可能是 WordPress 的固定链接设置没保存去后台重新保存一次让重写规则刷新。7.3 数据库连接错误的几种可能“Error establishing a database connection”这个错误提示很笼统可能的原因有好几种。首先是wp-config.php里的数据库信息填错了仔细核对DB_NAME、DB_USER、DB_PASSWORD、DB_HOST。其次是 MySQL 服务没启动systemctl status mysqld看一下。还有可能是 MySQL 的 socket 路径不对PHP 默认找/var/lib/mysql/mysql.sock如果 MySQL 配置改了路径需要在wp-config.php里指定DB_HOST为localhost:/新路径/mysql.sock。另外SELinux 如果没关也可能阻止 PHP 连接 MySQL。用setenforce 0临时关闭测试一下如果问题解决说明是 SELinux 的问题需要配置相应策略或者永久关闭。7.4 权限问题导致无法上传或更新WordPress 后台更新插件或上传文件时提示“无法创建目录”或“权限不足”基本都是文件权限问题。确认/var/www/html及其子目录的所有者是webuser所属组是nginx目录权限 755文件权限 644。wp-content/uploads目录需要可写权限也是 755。如果权限都对但还是不行检查 PHP-FPM 的运行用户。/etc/php-fpm.d/www.conf里的user和group必须是nginx如果设成了apache或者其他用户就会因为权限不匹配导致无法写入。7.5 常见问题速查表问题现象可能原因排查方法解决方案访问显示 Nginx 欢迎页站点配置未生效检查conf.d下是否有配置文件添加 server 块并重启 Nginx首页正常其他页面 404重写规则缺失检查try_files配置添加try_files $uri $uri/ /index.php?$args;数据库连接错误配置信息错误或 MySQL 未启动核对wp-config.php检查 MySQL 状态修正配置或启动 MySQL上传文件失败上传大小限制或权限不足检查 PHP 和 Nginx 的大小限制检查目录权限调整限制参数修正目录所有者后台更新提示输入 FTP 信息文件权限不正确检查 WordPress 目录所有者将所有者改为 Web 运行用户页面空白无报错PHP 内存不足或致命错误开启WP_DEBUG查看错误增加内存限制排查插件冲突中文显示乱码字符集不是 utf8mb4检查数据库和表的字符集修改数据库字符集为 utf8mb48. 我个人的一些实操心得这套部署流程我反复用过很多次每次都会遇到一些新的小问题但整体框架是稳定的。有几个点我觉得值得单独拿出来说。第一不要迷信“一键脚本”。网上有很多一键部署 WordPress 的脚本确实省事但出了问题你完全不知道从哪里查。自己一步步走一遍每个环节都搞清楚后面维护起来心里有底。第二备份比什么都重要。我见过太多人因为没备份一次误操作把站点搞没了数据全丢。数据库每天自动备份网站文件每周备份一次备份文件存到不同的地方这是底线。第三PHP 版本不要盲目追新。PHP 7.4 是目前跟 WordPress 兼容性最好的版本PHP 8.x 虽然性能更好但很多老插件还没适配贸然升级可能导致站点崩溃。升级前先在测试环境跑一遍确认所有插件和主题都兼容再动生产环境。第四Nginx 的配置改完一定要用nginx -t测试语法没问题再 reload。直接 restart 如果配置有错Nginx 会启动失败站点直接挂掉。nginx -t能提前发现大部分语法错误。第五MySQL 的utf8mb4字符集在建库时就要定好后期改非常痛苦。我吃过这个亏一个客户的站点跑了半年评论里全是问号最后花了一整天才把字符集迁移完。这套组合虽然老但胜在稳定、资料多、可控性强。你把它跑通一次以后遇到类似的环境部署基本就是复制粘贴改改配置的事。