努力
加油

在Nginx或Apache环境下如何配置两个WordPress站点?

在 Nginx 或 Apache 环境下配置两个 WordPress 站点,核心逻辑其实是一样的:利用虚拟主机(Virtual Host)机制,通过域名区分请求,将不同的域名映射到不同的网站根目录和数据库。

不管你是用 LNMP 一键包、宝塔面板还是手动编译,底层原理不变。下面我以生产环境最常用且性能较好的 Nginx 为主进行拆解,最后附带 Apache 的关键区别。假设你有两个域名:site1.com 和 site2.com,它们分别部署在不同的服务器 IP 上,或者在同一台服务器上通过不同端口/域名访问。


一、 前置准备(两者通用)

  1. 数据库隔离:

    • 强烈建议为每个 WordPress 站点创建独立的 MySQL/MariaDB 用户和数据库。
    • 不要共用同一个数据库名,否则权限管理混乱,且万一一个站被注入,另一个站的数据也可能受影响。
    • 示例:wp_site1_db 和 wp_site2_db。
  2. 文件目录隔离:

    • 在网站根目录下建立独立文件夹,例如 /var/www/html/site1 和 /var/www/html/site2。
    • 确保每个目录拥有正确的 PHP-FPM 运行用户权限(通常是 www-data 或 nginx)。
  3. SSL 证书:

    • 每个域名都需要独立的 SSL 证书(除非使用通配符证书 *.example.com)。
    • 推荐使用 Let’s Encrypt 自动续期。

二、 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.com
  • root: 改为 /var/www/html/site2
  • ssl_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 后台做相应调整:

  1. 安装 WordPress:

    • 分别访问 https://site1.com 和 https://site2.com,按照向导安装。
    • 安装时,数据库选择各自独立的库和用户。
  2. 固定链接(Permalinks):

    • 进入 设置 > 固定链接,选择“文章名”或其他结构。
    • Nginx:会自动生成 .htaccess 风格的规则(虽然 Nginx 不读 .htaccess,但 WP 会写入用于兼容),实际上 Nginx 的 try_files 已经处理了伪静态,无需额外操作。
    • Apache:必须确保 .htaccess 文件有写入权限,WP 会自动生成重写规则。如果没有生效,检查 AllowOverride All 是否已设置。
  3. 站点地址(URL):

    • 在 设置 > 常规 中,确保“WordPress 地址(URL)”和“站点地址(URL)”与当前域名一致。
    • 如果使用 CDN 或反向XX,可能需要额外配置 WP_HOME 和 WP_SITEURL 常量在 wp-config.php 中。
  4. 媒体库路径:

    • 如果两个站点共用同一台服务器但不同域名,媒体文件存储在各自的 wp-content/uploads 目录下,互不影响。

五、 常见问题与排查

  1. 502 Bad Gateway:

    • 检查 PHP-FPM 是否运行:systemctl status php8.1-fpm
    • 检查 Nginx 配置的 fastcgi_pass 是否正确(socket 路径 vs TCP 端口)。
  2. 403 Forbidden:

    • 权限问题:确保 root 目录及其子文件对 Web 服务器用户(如 www-data)可读可执行。
    • SELinux:如果在 CentOS 上,可能需执行 setsebool -P httpd_can_network_connect 1 或调整上下文。
  3. 永久链接失效:

    • Nginx:确认 try_files $uri $uri/ /index.php?$args; 是否存在于 location / 块中。
    • Apache:确认 .htaccess 文件存在且包含 RewriteEngine On 等规则。
  4. 跨站脚本攻击(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 站点。关键在于隔离——数据库隔离、文件系统隔离、配置隔离。