香港服务器WordPress外贸站如何部署?从环境搭建到CDN加速上线
香港服务器上的 WordPress 外贸站,建议采用“Ubuntu 24.04 LTS + Nginx + PHP 8.3-FPM + MySQL + HTTPS + CDN”的部署组合。先让域名直接指向香港服务器完成源站安装和证书配置,再接入 CDN;这样能够把 DNS、PHP、数据库、证书和缓存问题分层验证,避免一开始就把故障混在一起。

以下示例使用 example.com 作为站点域名,服务器公网 IPv4 使用 203.0.113.10,网站目录为 /var/www/example.com。实际操作时需要替换为自己的域名、IP、邮箱和数据库信息。上线目标是:域名可以通过 HTTPS 访问,WordPress 后台、登录、媒体上传正常,静态资源由 CDN 缓存,动态请求仍由香港服务器处理。
一、部署环境与前置条件
1. 推荐环境
| 项目 | 本教程采用的示例 |
|---|---|
| 服务器系统 | Ubuntu Server 24.04 LTS,64 位 |
| Web 服务 | Nginx |
| PHP 运行方式 | PHP 8.3-FPM |
| 数据库 | MySQL Server |
| 网站程序 | WordPress |
| 站点协议 | HTTPS |
| CDN 使用方式 | CDN 作为边缘入口,HTTPS 回源到香港服务器 |
| 网站目录 | /var/www/example.com |
| PHP-FPM Socket | /run/php/php8.3-fpm.sock |
PHP、MySQL 和 WordPress 的版本应保持在经过测试的组合内。本文不使用容器,适合希望直接通过系统服务管理网站的站长或技术负责人。
2. 上线前需要准备的内容
开始安装前,确认已经具备以下条件:
- 一台可以通过 SSH 登录的 Ubuntu 24.04 LTS 香港服务器。
- 一个准备绑定到网站的域名,例如
example.com和www.example.com。 - 服务器公网 IPv4 地址。
- 服务器 SSH 登录权限,建议使用密钥认证。
- 一个用于接收证书续期和异常通知的邮箱。
- CDN 服务商后台账号,并确认其支持自定义源站地址、HTTPS 回源和缓存规则。
- 服务器至少开放 SSH、HTTP、HTTPS 三类访问。
- 站点名称、管理员用户名、管理员邮箱和强密码已经准备好。
如果服务器中已有网站、Nginx 配置或数据库,不要直接覆盖本文中的文件。应先执行备份,并在维护窗口内操作。
3. 先确认系统和网络状态
登录服务器后,先确认系统版本、磁盘空间、内存和当前监听端口。
lsb_release -a
uname -m
df -h
free -h
ss -lntp
Ubuntu 24.04 通常会显示 x86_64 或 aarch64 架构。磁盘空间应预留给 WordPress 核心文件、媒体、数据库备份和日志。一个刚安装的站点通常不需要很大的系统空间,但外贸站后续媒体文件和备份可能持续增长。
确认当前没有其他程序占用 80 和 443 端口。如果已经存在旧的 Nginx、Apache 或其他 Web 服务,应先记录配置,不要直接停止生产服务。
检查服务器时间:
timedatectl status
如果时间未同步,可以启用系统时间同步:
sudo timedatectl set-ntp true
时间错误可能导致 HTTPS 证书校验、日志排序和定时任务出现异常。
二、安装 Nginx、PHP、MySQL 和依赖
1. 更新软件索引并安装组件
以下命令适用于 Ubuntu 24.04。安装前应确认当前系统没有正在运行的关键业务。
sudo apt update
sudo apt install -y \
nginx \
mysql-server \
php8.3-fpm \
php8.3-cli \
php8.3-mysql \
php8.3-curl \
php8.3-gd \
php8.3-mbstring \
php8.3-xml \
php8.3-zip \
php8.3-intl \
php8.3-opcache \
curl \
ca-certificates \
unzip \
rsync \
certbot \
python3-certbot-nginx \
ufw
确认关键版本和服务状态:
php8.3 -v
nginx -v
mysql --version
sudo systemctl status nginx --no-pager
sudo systemctl status php8.3-fpm --no-pager
sudo systemctl status mysql --no-pager
预期结果是 Nginx、PHP-FPM 和 MySQL 均处于 active (running) 状态。
如果系统提示找不到 php8.3-fpm 或其他 PHP 8.3 软件包,不要随意混用其他版本的 PHP 配置。先确认系统版本和软件源:
apt-cache policy php8.3-fpm
cat /etc/os-release
2. 设置服务开机启动
sudo systemctl enable nginx
sudo systemctl enable php8.3-fpm
sudo systemctl enable mysql
此时先不要急着把域名切到 CDN。源站必须先单独访问正常。
3. 配置防火墙
先确认 SSH 端口,避免启用防火墙后被锁在服务器外面。如果 SSH 使用默认 22 端口,可以执行:
sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw status
确认 SSH 规则已经存在后再启用:
sudo ufw enable
sudo ufw status verbose
如果 SSH 使用其他端口,应将 22/tcp 替换为实际端口。执行 ufw enable 前,最好保留当前 SSH 会话,并准备服务器控制台或带外管理入口。若启用后无法连接,应通过服务器控制台执行回滚:
sudo ufw disable
三、创建网站目录和 MySQL 数据库
1. 创建网站目录
sudo mkdir -p /var/www/example.com
sudo chown -R www-www-data /var/www/example.com
这里的 www-data 是 Ubuntu 中常见的 Nginx/PHP-FPM 运行用户。后续 PHP 进程需要读取 WordPress 文件,并写入 wp-content/uploads 等目录。
2. 创建数据库和独立数据库用户
不要让 WordPress 使用 MySQL 的 root 账户。先生成一组随机数据库密码,并保存到只有 root 可读的文件中:
DB_NAME="wp_site"
DB_USER="wp_user"
DB_PASS="$(openssl rand -hex 24)"
printf 'DB_NAME=%s\nDB_USER=%s\nDB_PASS=%s\n' \
"$DB_NAME" "$DB_USER" "$DB_PASS" | \
sudo tee /root/wp-site-db.env >/dev/null
sudo chmod 600 /root/wp-site-db.env
创建数据库和用户:
sudo mysql <检查数据库是否创建成功:
sudo mysql -e "SHOW DATABASES;"
sudo mysql -e "SELECT User, Host FROM mysql.user WHERE User='wp_user';"
预期能够看到 wp_site 数据库和 wp_user@localhost 用户。
数据库用户只允许从 localhost 登录,适合 Web 服务和数据库位于同一台香港服务器的场景。不要在没有明确需求时开放 MySQL 公网端口。
3. 可选的 MySQL 基础清理
新安装的 MySQL 可以运行交互式安全配置:
sudo mysql_secure_installation
根据提示删除匿名用户、测试数据库和不必要的远程 root 登录。这个命令会修改数据库安全配置,已经存在业务数据库时应先确认每个提示的影响。
四、下载 WordPress 并配置 PHP
1. 下载并解压 WordPress
下面命令会下载 WordPress 当前发布包。正式环境建议先在测试环境验证插件和主题兼容性,再固定使用经过验证的版本,不要在生产环境随意执行升级。
cd /tmp
curl -fL https://wordpress.org/latest.tar.gz -o wordpress.tar.gz
tar -xzf wordpress.tar.gz
将文件复制到网站目录:
sudo rsync -a /tmp/wordpress/ /var/www/example.com/
sudo chown -R www-www-data /var/www/example.com
检查目录:
ls -la /var/www/example.com
正常情况下,应看到 wp-admin、wp-content、wp-includes、wp-config-sample.php 和 index.php。
2. 调整 WordPress 常用 PHP 参数
先备份 PHP 配置文件:
PHP_INI="/etc/php/8.3/fpm/php.ini"
sudo cp -a "$PHP_INI" "${PHP_INI}.bak.$(date +%Y%m%d%H%M%S)"
外贸站常见的图片上传和插件操作可能需要比默认值更高的限制。以下是一个适合中小型站点的参考值:
sudo sed -i -E 's/^memory_limit\s*=.*/memory_limit = 256M/' "$PHP_INI"
sudo sed -i -E 's/^upload_max_filesize\s*=.*/upload_max_filesize = 64M/' "$PHP_INI"
sudo sed -i -E 's/^post_max_size\s*=.*/post_max_size = 64M/' "$PHP_INI"
sudo sed -i -E 's/^max_execution_time\s*=.*/max_execution_time = 120/' "$PHP_INI"
sudo sed -i -E 's/^max_input_time\s*=.*/max_input_time = 120/' "$PHP_INI"
post_max_size 应不小于 upload_max_filesize。如果只上传小图片,可以使用更低的值;如果站点有大文件上传需求,应同时评估服务器磁盘、备份和 CDN 处理方式。
检查 PHP-FPM 配置并重启:
sudo php-fpm8.3 -t
sudo systemctl restart php8.3-fpm
sudo systemctl status php8.3-fpm --no-pager
预期 php-fpm8.3 -t 显示配置测试成功,服务状态为 active (running)。
五、配置 Nginx 和 WordPress 伪静态
1. 创建 Nginx 站点配置
先创建配置文件:
sudo nano /etc/nginx/sites-available/example.com
填入以下内容:
server {
listen 80;
listen [::]:80;
server_name example.com www.example.com;
root /var/www/example.com;
index index.php index.html;
client_max_body_size 64m;
access_log /var/log/nginx/example.com.access.log;
error_log /var/log/nginx/example.com.error.log warn;
location ^~ /.well-known/acme-challenge/ {
allow all;
try_files $uri =404;
}
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~* ^/wp-content/uploads/.*\.php$ {
deny all;
}
location ~ \.php$ {
try_files $uri =404;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param HTTPS $https if_not_empty;
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
fastcgi_read_timeout 120;
}
location ~* \.(css|js|jpg|jpeg|png|gif|svg|webp|ico|woff|woff2|ttf)$ {
try_files $uri =404;
expires 7d;
add_header Cache-Control "public";
}
location ~ /\.(?!well-known).* {
deny all;
}
}
这份配置完成了几个关键动作:
try_files将不存在的路径交给 WordPress 的index.php处理。- PHP 文件只交给 PHP-FPM 执行。
wp-content/uploads下的 PHP 文件禁止执行,降低上传目录被利用的风险。- 静态资源设置浏览器缓存,但没有在源站直接缓存 HTML。
- 隐藏文件默认拒绝访问,同时保留证书验证目录。
2. 启用站点配置
如果是全新 Nginx,可以先备份默认配置,再停用默认站点:
if [ -e /etc/nginx/sites-enabled/default ]; then
sudo mv /etc/nginx/sites-enabled/default \
/etc/nginx/sites-enabled/default.disabled
fi
sudo ln -s /etc/nginx/sites-available/example.com \
/etc/nginx/sites-enabled/example.com
检查配置:
sudo nginx -t
只有看到 syntax is ok 和 test is successful 后,才执行重载:
sudo systemctl reload nginx
如果检查失败,不要重载。查看具体错误:
sudo nginx -t
sudo tail -n 50 /var/log/nginx/error.log
常见原因包括括号缺失、配置文件路径错误、PHP-FPM Socket 名称不匹配。可以确认 Socket:
ls -l /run/php/
如果实际 Socket 不是 php8.3-fpm.sock,应以该目录中的实际文件名为准修改 fastcgi_pass,不要直接猜测。
六、生成 wp-config.php 并完成 WordPress 初始化
1. 创建数据库配置文件
复制示例配置:
sudo cp /var/www/example.com/wp-config-sample.php \
/var/www/example.com/wp-config.php
读取数据库密码:
sudo cat /root/wp-site-db.env
编辑配置文件:
sudo nano /var/www/example.com/wp-config.php
将数据库相关部分改为以下形式,密码替换为 /root/wp-site-db.env 中的实际值:
define( 'DB_NAME', 'wp_site' );
define( 'DB_USER', 'wp_user' );
define( 'DB_PASSWORD', '替换为随机数据库密码' );
define( 'DB_HOST', 'localhost' );
define( 'DB_CHARSET', 'utf8mb4' );
define( 'DB_COLLATE', '' );
在 / That's all, stop editing! Happy publishing. / 之前加入安全密钥。可以从 WordPress 密钥接口获取一组随机值:
curl -fsSL https://api.wordpress.org/secret-key/1.1/salt/
将命令输出的多行 define() 内容复制到 wp-config.php 中。如果接口暂时无法访问,不要使用网上公开的固定密钥,应改用本地随机字符串生成多组不同的密钥:
for name in AUTH_KEY SECURE_AUTH_KEY LOGGED_IN_KEY NONCE_KEY AUTH_SALT SECURE_AUTH_SALT LOGGED_IN_SALT NONCE_SALT; do
printf "define( '%s', '%s' );\n" "$name" "$(openssl rand -base64 48)"
done
在配置文件中继续加入:
define( 'WP_MEMORY_LIMIT', '256M' );
define( 'DISALLOW_FILE_EDIT', true );
证书配置完成后,再加入固定的 HTTPS 地址:
define( 'WP_HOME', 'https://example.com' );
define( 'WP_SITEURL', 'https://example.com' );
如果需要同时支持 www.example.com,应统一选择一个规范域名,并通过 Nginx 或 CDN 做 301 跳转,不要让两个域名长期分别运行同一套站点。
设置权限:
sudo chown www-www-data /var/www/example.com/wp-config.php
sudo chmod 640 /var/www/example.com/wp-config.php
sudo find /var/www/example.com -type d -exec chmod 755 {} \;
sudo find /var/www/example.com -type f -exec chmod 644 {} \;
sudo chmod 755 /var/www/example.com
sudo chmod 755 /var/www/example.com/wp-content
sudo chmod 755 /var/www/example.com/wp-content/uploads
如果 uploads 目录尚不存在,可以创建:
sudo mkdir -p /var/www/example.com/wp-content/uploads
sudo chown -R www-www-data /var/www/example.com/wp-content
2. 先用服务器本机验证 PHP
在证书配置前,先确认 Nginx 能执行 PHP。访问域名之前,可以使用本机 Host 头测试:
curl -I -H "Host: example.com" http://127.0.0.1/
预期状态通常为 200,也可能因为 WordPress 初始化状态返回 302。如果返回 502,重点检查 PHP-FPM;如果返回 404,重点检查网站根目录和 Nginx root 配置。
查看服务日志:
sudo tail -n 50 /var/log/nginx/example.com.error.log
sudo journalctl -u php8.3-fpm -n 50 --no-pager
不要把 phpinfo() 文件长期放在公网目录中。如果为了临时调试创建了测试 PHP 文件,验证后应立即删除。
3. 浏览器完成 WordPress 安装
将域名临时解析到香港服务器 IP 后访问:
http://example.com/wp-admin/install.php
填写:
- 网站标题;
- 管理员用户名,避免使用
admin; - 高强度管理员密码;
- 管理员邮箱;
- 是否允许搜索引擎索引。
证书配置完成并切换 HTTPS 后,最终应通过:
https://example.com/wp-admin/
登录后台。首次安装时可以先关闭不必要的插件和主题,减少后续排错变量。
七、配置 HTTPS 证书并验证源站
1. 让域名先直连香港服务器
在接入 CDN 前,先将以下 DNS 记录指向服务器:
A example.com 203.0.113.10
A www 203.0.113.10
如果服务器没有配置 IPv6,不要添加 AAAA 记录。错误的 AAAA 记录可能使部分访客优先访问不可用的 IPv6 地址。
检查解析:
dig +short example.com A
dig +short www.example.com A
预期返回服务器 IPv4。还可以绕过本地 DNS,直接测试服务器:
curl --resolve example.com:80:203.0.113.10 \
-I http://example.com/
2. 使用 Certbot 配置证书
确认域名已经解析到源站、80 端口可以访问后执行:
sudo certbot --nginx \
-d example.com \
-d www.example.com \
--redirect \
--agree-tos \
-m admin@example.com \
--no-eff-email
将 admin@example.com 替换为实际邮箱。Certbot 会申请证书,并尝试修改 Nginx 配置,将 HTTP 请求跳转到 HTTPS。
完成后检查:
sudo nginx -t
sudo systemctl reload nginx
curl -I https://example.com/
预期 HTTPS 请求返回 200 或合理的 3xx 跳转,不应出现证书不匹配或 502。
检查证书续期:
sudo certbot renew --dry-run
如果续期测试失败,重点查看:
- 域名是否仍解析到源站;
- 80 端口是否被防火墙拦截;
- CDN 是否阻断了 HTTP-01 验证;
- Nginx 是否保留了
/.well-known/acme-challenge/路径; - 证书中的域名是否包含实际访问的主域名。
证书成功后,确认 wp-config.php 中的 WP_HOME 和 WP_SITEURL 使用 HTTPS,再通过 HTTPS 完成安装或登录。
八、接入 CDN 并设置缓存策略
1. CDN 的正确接入顺序
推荐按照以下顺序操作:

- 香港服务器直连访问正常;
- 源站 HTTPS 证书有效;
- WordPress 后台和媒体上传正常;
- 在 CDN 后台添加域名;
- 将源站地址设置为香港服务器 IP;
- 配置 HTTPS 回源;
- 验证 CDN 到源站的连接;
- 最后切换 DNS 到 CDN 分配的记录。
CDN 源站建议使用:
- 源站地址:香港服务器公网 IP;
- 回源端口:443;
- 回源协议:HTTPS;
- Host 头:
example.com; - TLS SNI:
example.com; - 证书校验:开启。
如果 CDN 后台要求填写源站域名而不是 IP,应使用能够解析到源站的独立源站域名,并确保该域名的证书名称匹配。不要把 CDN 的加速域名再次填写为源站地址,否则容易形成回源循环。
2. DNS 切换到 CDN
CDN 通常会提供 CNAME 或 NS 接入方式,具体以其控制台显示的记录为准。切换前可以降低 DNS TTL,但 TTL 只影响后续解析缓存,不能强制所有网络立即刷新。
切换后检查:
dig +short example.com
dig +short www.example.com
curl -I https://example.com/
不同 CDN 返回的响应头名称可能不同。可以观察是否出现 CDN 控制台定义的命中、回源或边缘节点标识,但不能只凭某一个自定义响应头判断加速是否生效。
3. CDN 缓存规则
WordPress 外贸站不应把所有页面都设置为公开缓存。建议采用以下规则:
| 请求对象 | 建议处理 |
|---|---|
| CSS、JS、图片、字体 | 允许 CDN 缓存 |
/wp-admin/ | 不缓存 |
/wp-login.php | 不缓存 |
/wp-cron.php | 不缓存 |
| 带登录 Cookie 的请求 | 不缓存 |
POST、PUT、DELETE 请求 | 不缓存 |
| 购物、表单、搜索等动态请求 | 默认不缓存 |
带 preview=1 的预览请求 | 不缓存 |
| 后台发布内容后的旧缓存 | 主动清理 |
缓存静态资源时,可以使用文件扩展名作为初始匹配条件,例如:
.css
.js
.jpg
.jpeg
.png
.gif
.svg
.webp
.ico
.woff
.woff2
后台路径建议配置为绕过缓存:
/wp-admin/*
/wp-login.php
/wp-cron.php
如果 CDN 支持 Cookie 条件,还应对包含以下类型 Cookie 的请求绕过缓存:
wordpress_logged_in_
wordpress_sec_
wp-settings-
comment_author_
不要把登录页、结账页、报价表单或个性化页面设置成公共缓存。缓存规则生效后,应使用测试账号检查登录、退出、发布、表单提交和媒体上传。
4. CDN 与 HTTPS 跳转循环
如果 CDN 到源站使用 HTTP,而源站又强制 HTTP 跳转 HTTPS,某些配置会产生循环跳转。推荐直接设置 HTTPS 回源,避免依赖 CDN 传递协议头。
出现循环时执行:
curl -IL https://example.com/
观察 Location 是否在同一组 HTTP/HTTPS 地址之间反复切换。处理顺序如下:
- 确认 CDN 回源协议为 HTTPS;
- 确认源站证书包含访问域名;
- 确认 CDN 向源站发送的 Host 和 SNI 正确;
- 暂时关闭边缘强制跳转,只保留源站 HTTPS 跳转;
- 清理 CDN 规则缓存后重新测试。
九、优化 WordPress 定时任务
WordPress 默认可能通过访客请求触发 wp-cron.php。接入 CDN 后,如果该路径被缓存或请求量不稳定,定时任务可能延迟。可以选择由系统定时任务执行,但必须二选一,不能重复触发。
在 wp-config.php 中加入:
define( 'DISABLE_WP_CRON', true );
为 www-data 用户创建定时任务:
sudo -u www-data crontab -e
加入:
*/5 * * * * /usr/bin/php8.3 /var/www/example.com/wp-cron.php >/dev/null 2>&1
验证 PHP 路径:
command -v php8.3
如果输出路径不是 /usr/bin/php8.3,应使用实际路径。定时任务只适用于服务器时间正常、PHP-FPM 和 WordPress 文件均已部署完成的情况。
十、上线验证清单
1. DNS 和 HTTPS 验证
dig +short example.com
dig +short www.example.com
curl -I https://example.com/
curl -I https://www.example.com/
需要确认:
- 主域名和
www是否按预期跳转; - 证书域名是否匹配;
- 是否出现 301 循环;
- 页面是否混入 HTTP 资源;
- CDN 是否能够回源。
查看证书基本信息:
openssl s_client \
-connect example.com:443 \
-servername example.com /dev/null |
openssl x509 -noout -subject -issuer -dates
2. WordPress 功能验证
至少完成以下测试:
- 首页打开正常;
- 文章详情页正常;
- 后台登录和退出正常;
- 新建文章并发布;
- 上传 JPG、PNG 或 WebP 图片;
- 访问媒体文件;
- 修改固定链接后重新打开文章;
- 提交站内搜索或联系表单;
- 检查移动端页面;
- 清理 CDN 缓存后确认新内容可见。
固定链接保存后,如果文章地址返回 404,先检查 Nginx 的:
try_files $uri $uri/ /index.php?$args;
然后执行:
sudo nginx -t
sudo systemctl reload nginx
3. PHP、数据库和日志验证
sudo systemctl is-active nginx
sudo systemctl is-active php8.3-fpm
sudo systemctl is-active mysql
sudo nginx -t
sudo tail -n 50 /var/log/nginx/example.com.error.log
sudo journalctl -u php8.3-fpm -n 50 --no-pager
数据库连接可以从 WordPress 后台功能间接验证,也可以检查数据库用户:
sudo mysql -e "SHOW GRANTS FOR 'wp_user'@'localhost';"
不要把数据库密码、Cookie、管理员令牌或完整的 wp-config.php 粘贴到公开工单或日志中。
4. CDN 验证
通过两次请求观察 CDN 行为:
curl -I https://example.com/wp-content/themes/当前主题目录/style.css
curl -I https://example.com/
静态资源通常可以被 CDN 缓存,HTML 首页则应根据缓存策略决定是否缓存。若 CDN 控制台提供命中率、回源状态或缓存状态,可以结合控制台记录判断;如果响应中没有缓存标识,不代表 CDN 一定没有工作。
后台登录时应重点验证:
https://example.com/wp-login.php
https://example.com/wp-admin/
如果登录后仍看到旧页面,清理 CDN 缓存,并确认带登录 Cookie 的请求已绕过缓存。
十一、常见失败处理
1. 域名解析正确但访问超时
按由外到内的顺序检查:

dig +short example.com
sudo ufw status
sudo ss -lntp | grep -E ':80|:443'
- DNS 没有返回源站或 CDN 地址:检查 DNS 记录;
- DNS 正确但 80/443 未监听:检查 Nginx;
- 端口监听正常但外部超时:检查 UFW、安全组或 CDN 回源设置;
- 只有 CDN 访问失败:检查 CDN 源站 IP、Host、SNI 和 HTTPS 回源端口。
2. 出现 502 Bad Gateway
502 通常表示 Nginx 无法连接 PHP-FPM。检查:
sudo systemctl status php8.3-fpm --no-pager
ls -l /run/php/
sudo tail -n 50 /var/log/nginx/example.com.error.log
如果 Socket 文件是 /run/php/php8.3-fpm.sock,应确认 Nginx 配置完全一致。如果 PHP-FPM 服务停止,可以先重启并观察日志:
sudo systemctl restart php8.3-fpm
sudo systemctl reload nginx
如果重启后仍然 502,不要反复重启,应检查 PHP 配置语法和系统资源:
sudo php-fpm8.3 -t
free -h
df -h
3. 出现 403 或 404
重点检查网站目录、文件权限和 server_name:
ls -ld /var/www/example.com
ls -l /var/www/example.com/index.php
sudo nginx -T | grep -A20 -B5 "server_name example.com"
常见原因包括:
- Nginx
root指向了错误目录; - 站点配置没有建立软链接;
index.php不存在;- WordPress 固定链接缺少
try_files; - 目录被设置成 Nginx 运行用户无法读取;
- CDN 缓存了旧的 404 响应。
4. 上传时报 413 或 PHP 超限
确认 Nginx 和 PHP 两边的限制:
grep -R "client_max_body_size" /etc/nginx/sites-available/example.com
grep -E "memory_limit|upload_max_filesize|post_max_size" \
/etc/php/8.3/fpm/php.ini
修改后执行:
sudo php-fpm8.3 -t
sudo nginx -t
sudo systemctl restart php8.3-fpm
sudo systemctl reload nginx
如果通过 CDN 上传,还要检查 CDN 的请求体大小限制。源站配置正确并不代表边缘节点一定允许同样大小的请求。
5. HTTPS 后出现混合内容
如果页面已经是 HTTPS,但浏览器提示图片、脚本或样式仍通过 HTTP 加载,先确认:
WP_HOME和WP_SITEURL是否为 HTTPS;- 主题和插件是否写死了
http://example.com; - CDN 是否修改了资源 URL;
- 浏览器是否缓存旧页面。
修改数据库 URL 前必须先备份数据库:
sudo mysqldump --single-transaction wp_site \
> /root/wp_site-before-url-change-$(date +%Y%m%d%H%M%S).sql
不要直接对数据库执行未经验证的全局替换。优先使用 WordPress 兼容的管理工具或经过测试的迁移工具,避免破坏序列化数据。
6. CDN 提示源站证书错误
检查源站证书:
openssl s_client \
-connect 203.0.113.10:443 \
-servername example.com /dev/null |
openssl x509 -noout -subject -dates
重点确认:
- 证书包含
example.com; - CDN 使用 443 端口回源;
- CDN 的 SNI 是访问域名;
- CDN 发送的 Host 与证书名称一致;
- 源站防火墙没有误拦 CDN 回源地址。
不要为了绕过证书错误而长期关闭 CDN 的证书校验。应先修正证书、SNI 或 Host 配置。
十二、备份、回滚与恢复顺序
1. 上线前创建备份
在切换 CDN 或修改重要配置前,备份数据库、网站文件和 Nginx/PHP 配置:
sudo mkdir -p /root/wp-backups
sudo mysqldump --single-transaction \
--routines --triggers wp_site \
> /root/wp-backups/wp_site-$(date +%Y%m%d%H%M%S).sql
sudo tar -czf \
/root/wp-backups/example.com-files-$(date +%Y%m%d%H%M%S).tar.gz \
-C /var/www example.com
sudo cp -a \
/etc/nginx/sites-available/example.com \
/root/wp-backups/
sudo cp -a \
/etc/php/8.3/fpm/php.ini \
/root/wp-backups/
检查备份文件是否存在且大小合理:
sudo ls -lh /root/wp-backups
数据库备份不能替代文件备份。WordPress 的媒体、主题、插件和配置文件通常都位于网站目录中。
2. CDN 接入失败时的回滚
如果接入 CDN 后出现大面积打不开、后台登录失败或源站证书错误,可以先将 DNS 切回香港服务器源站地址:
A example.com 203.0.113.10
A www 203.0.113.10
然后在 CDN 后台暂停代理或加速,保留源站 HTTPS。DNS 切换不会立即影响所有本地缓存,因此应同时清理 CDN 配置和缓存,并使用多个网络环境验证。
3. Nginx 配置失败时的回滚
如果修改 Nginx 后 nginx -t 失败,先恢复备份:
sudo cp -a \
/root/wp-backups/example.com \
/etc/nginx/sites-available/example.com
sudo nginx -t
sudo systemctl reload nginx
只有在 nginx -t 成功后才允许重载。不要在配置无法解析时强行重启 Nginx。
4. WordPress 文件或数据库损坏时的恢复
恢复数据库前,确认备份对应的是当前站点,并安排维护窗口。数据库恢复会覆盖备份时点之后的内容:
sudo mysql wp_site < /root/wp-backups/wp_site-YYYYMMDDHHMMSS.sql
恢复文件前,应先保留当前目录,避免误删无法找回:
sudo mv /var/www/example.com \
/var/www/example.com.failed.$(date +%Y%m%d%H%M%S)
sudo mkdir -p /var/www/example.com
sudo tar -xzf \
/root/wp-backups/example.com-files-YYYYMMDDHHMMSS.tar.gz \
-C /var/www
sudo chown -R www-www-data /var/www/example.com
sudo nginx -t
sudo systemctl reload nginx
如果恢复后访问仍异常,依次检查 PHP-FPM、Nginx 日志、数据库凭据和 wp-config.php,不要连续执行删除或重装命令。
上线验收与回滚检查清单
正式宣布上线前,至少确认以下项目:
- [ ] Ubuntu、Nginx、PHP-FPM、MySQL 服务均能开机启动。
- [ ] 80 和 443 端口可从公网访问,SSH 端口未被防火墙误封。
- [ ] 域名解析指向预期的 CDN 或香港服务器地址。
- [ ] 源站 HTTPS 证书有效,CDN 使用 HTTPS 回源。
- [ ] WordPress 首页、文章页、后台和登录页正常。
- [ ] 图片上传成功,上传目录中的 PHP 文件不会被执行。
- [ ] PHP 上传限制、Nginx 上传限制和 CDN 请求体限制相互匹配。
- [ ] CDN 只缓存安全的静态资源,后台、登录和动态提交请求已绕过缓存。
- [ ] CDN 缓存清理后,新发布内容能够正常显示。
- [ ] 数据库备份、网站文件备份和配置备份均已生成。
- [ ] 已完成一次证书续期测试。
- [ ] 已记录当前 DNS、Nginx、PHP 和 CDN 配置,便于故障时恢复。
- [ ] CDN 异常时可以将 DNS 切回香港服务器源站。
- [ ] Nginx 配置异常时可以通过备份恢复,并在
nginx -t成功后重载。 - [ ] 数据库恢复命令和备份文件位置已由维护人员确认。