在 Nginx 或 Apache 环境下配置两个 WordPress 站点,核心逻辑其实是一样的:利用虚拟主机(Virtual Host)机制,通过域名区分请求,将不同的域名映射到不同的网站根目录和数据库。
不管你是用 LNMP 一键包、宝塔面板还是手动编译,底层原理不变。下面我以生产环境最常用且性能较好的 Nginx 为主进行拆解,最后附带 Apache 的关键区别。假设你有两个域名:site1.com 和 site2.com,它们分别部署在不同的服务器 IP 上,或者在同一台服务器上通过不同端口/域名访问。
一、 前置准备(两者通用)
-
数据库隔离:
- 强烈建议为每个 WordPress 站点创建独立的 MySQL/MariaDB 用户和数据库。
- 不要共用同一个数据库名,否则权限管理混乱,且万一一个站被注入,另一个站的数据也可能受影响。
- 示例:
wp_site1_db和wp_site2_db。
-
文件目录隔离:
- 在网站根目录下建立独立文件夹,例如
/var/www/html/site1和/var/www/html/site2。 - 确保每个目录拥有正确的 PHP-FPM 运行用户权限(通常是
www-data或nginx)。
- 在网站根目录下建立独立文件夹,例如
-
SSL 证书:
- 每个域名都需要独立的 SSL 证书(除非使用通配符证书
*.example.com)。 - 推荐使用 Let’s Encrypt 自动续期。
- 每个域名都需要独立的 SSL 证书(除非使用通配符证书
二、 Nginx 配置详解(推荐)
Nginx 使用 server 块来定义虚拟主机。你需要为每个站点创建一个独立的配置文件。
1. 创建站点目录并上传 WordPress
mkdir -p /var/www/html/site1
mkdir -p /var/www/html/site2
# 解压 WordPress 到对应目录,并设置权限
chown -R www-data:www-data /var/www/html/site1
chown -R www-data:www-data /var/www/html/site2
2. 配置第一个站点 site1.com
新建文件 /etc/nginx/sites-available/site1.conf(路径依系统而定,如 Debian/Ubuntu 通常在 sites-available,CentOS 可能在 conf.d 或直接写在 nginx.conf 的 http 块内)。
server {
listen 80;
listen [::]:80;
server_name site1.com www.site1.com;
# 重定向 HTTP 到 HTTPS(可选,但推荐)
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name site1.com www.site1.com;
# SSL 证书路径
ssl_certificate /etc/letsencrypt/live/site1.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/site1.com/privkey.pem;
# 根目录
root /var/www/html/site1;
index index.php index.html index.htm;
# 日志
access_log /var/log/nginx/site1.access.log;
error_log /var/log/nginx/site1.error.log;
# 主要 location 块
location / {
try_files $uri $uri/ /index.php?$args;
}
# PHP 处理
location ~ .php$ {
fastcgi_pass unix:/run/php/php8.1-fpm.sock; # 根据实际 PHP 版本调整
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
# 禁止访问隐藏文件和敏感文件
location ~ /. {
deny all;
}
# WP 静态资源缓存优化(可选)
location ~* .(js|css|png|jpg|jpeg|gif|ico|svg)$ {
expires 30d;
add_header Cache-Control "public, immutable";
}
}
3. 配置第二个站点 site2.com
复制上述配置,修改以下关键部分:
server_name: 改为site2.com www.site2.comroot: 改为/var/www/html/site2ssl_certificate和ssl_certificate_key: 指向 site2 的证书access_log和error_log: 指向新的日志文件- 如果 PHP-FPM 是同一实例,sock 路径可以相同;如果是多 PHP 版本则需调整。
4. 启用配置并重启 Nginx
# 软链接到 sites-enabled(Debian/Ubuntu 风格)
ln -s /etc/nginx/sites-available/site1.conf /etc/nginx/sites-enabled/
ln -s /etc/nginx/sites-available/site2.conf /etc/nginx/sites-enabled/
# 测试配置语法
nginx -t
# 重载配置
systemctl reload nginx
注意:如果你使用的是 CentOS/RHEL,通常将配置放在
/etc/nginx/conf.d/site1.conf和/etc/nginx/conf.d/site2.conf,然后直接nginx -s reload即可。
三、 Apache 配置详解
Apache 使用 VirtualHost 指令。配置相对直观,但默认可能加载所有 vhost 文件。
1. 创建站点目录
同上,确保 /var/www/html/site1 和 /var/www/html/site2 存在且有正确权限。
2. 配置第一个站点
新建文件 /etc/apache2/sites-available/site1.conf(Debian/Ubuntu)或 /etc/httpd/conf.d/site1.conf(CentOS)。
<VirtualHost *:80>
ServerName site1.com
ServerAlias www.site1.com
DocumentRoot /var/www/html/site1
# 重定向到 HTTPS
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
</VirtualHost>
<VirtualHost *:443>
ServerName site1.com
ServerAlias www.site1.com
DocumentRoot /var/www/html/site1
SSLEngine on
SSLCertificateFile /path/to/cert.pem
SSLCertificateKeyFile /path/to/key.pem
<Directory /var/www/html/site1>
AllowOverride All
Require all granted
</Directory>
# PHP 处理(根据 Apache 版本可能是 php7_module, php8_module 等)
<FilesMatch ".php$">
SetHandler application/x-httpd-php
</FilesMatch>
</VirtualHost>
3. 配置第二个站点
同样复制,修改 ServerName, DocumentRoot, SSLCertificate... 等路径。
4. 启用站点并重启
# Debian/Ubuntu
a2ensite site1.conf
a2ensite site2.conf
systemctl restart apache2
# CentOS
# 无需额外启用,只要文件在 conf.d 下,重启 httpd 即可
systemctl restart httpd
四、 WordPress 内部配置关键点
配置好 Web 服务器后,还需要在 WordPress 后台做相应调整:
-
安装 WordPress:
- 分别访问
https://site1.com和https://site2.com,按照向导安装。 - 安装时,数据库选择各自独立的库和用户。
- 分别访问
-
固定链接(Permalinks):
- 进入 设置 > 固定链接,选择“文章名”或其他结构。
- Nginx:会自动生成
.htaccess风格的规则(虽然 Nginx 不读 .htaccess,但 WP 会写入用于兼容),实际上 Nginx 的try_files已经处理了伪静态,无需额外操作。 - Apache:必须确保
.htaccess文件有写入权限,WP 会自动生成重写规则。如果没有生效,检查AllowOverride All是否已设置。
-
站点地址(URL):
- 在 设置 > 常规 中,确保“WordPress 地址(URL)”和“站点地址(URL)”与当前域名一致。
- 如果使用 CDN 或反向XX,可能需要额外配置
WP_HOME和WP_SITEURL常量在wp-config.php中。
-
媒体库路径:
- 如果两个站点共用同一台服务器但不同域名,媒体文件存储在各自的
wp-content/uploads目录下,互不影响。
- 如果两个站点共用同一台服务器但不同域名,媒体文件存储在各自的
五、 常见问题与排查
-
502 Bad Gateway:
- 检查 PHP-FPM 是否运行:
systemctl status php8.1-fpm - 检查 Nginx 配置的
fastcgi_pass是否正确(socket 路径 vs TCP 端口)。
- 检查 PHP-FPM 是否运行:
-
403 Forbidden:
- 权限问题:确保
root目录及其子文件对 Web 服务器用户(如www-data)可读可执行。 - SELinux:如果在 CentOS 上,可能需执行
setsebool -P httpd_can_network_connect 1或调整上下文。
- 权限问题:确保
-
永久链接失效:
- Nginx:确认
try_files $uri $uri/ /index.php?$args;是否存在于location /块中。 - Apache:确认
.htaccess文件存在且包含RewriteEngine On等规则。
- Nginx:确认
-
跨站脚本攻击(XSS)或 SQL 注入防护:
- 建议使用 Wordfence 或 Sucuri 插件。
- 定期更新 WordPress 核心、主题和插件。
- 限制 wp-admin 访问 IP(通过 Nginx
allow/deny实现)。
六、 进阶建议
- 使用容器化(Docker):现代运维更倾向于用 Docker Compose 管理多个 WordPress 站点。每个站点一个容器,共享数据库服务,配置更清晰,迁移更方便。
- CDN 提速:如果站点面向全球用户,接入 Cloudflare 或阿里云 CDN,不仅能提速,还能隐藏源站 IP,提升安全性。
- 监控与备份:配置定时备份脚本,将数据库和文件同步到 OSS/S3 或远程服务器。使用 Prometheus + Grafana 监控 Nginx/Apache 状态。
通过以上步骤,你可以在一台服务器上稳定运行多个独立的 WordPress 站点。关键在于隔离——数据库隔离、文件系统隔离、配置隔离。
云技术博客