使用Nginx或Apache如何实现一台服务器托管多个WordPress网站?

使用Nginx或Apache在一台服务器上托管多个WordPress网站(虚拟主机)是常见需求。以下是两种方案的实现方法:

一、Nginx方案(推荐)

1. 目录结构

/var/www/
├── site1/
│   ├── public_html/     # WordPress文件
│   └── .env或配置文件
├── site2/
│   ├── public_html/
│   └── .env
└── logs/
    ├── site1.access.log
    └── site2.access.log

2. 配置步骤

A. 创建Nginx配置文件

/etc/nginx/sites-available/ 创建每个站点的配置文件:

site1.conf:

server {
    listen 80;
    server_name site1.com www.site1.com;
    root /var/www/site1/public_html;
    index index.php index.html index.htm;

    access_log /var/www/logs/site1.access.log;
    error_log /var/www/logs/site1.error.log;

    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    location ~ .php$ {
        include fastcgi_params;
        fastcgi_pass unix:/run/php/php8.1-fpm.sock; # 根据PHP版本调整
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }

    location ~ /.ht {
        deny all;
    }

    location ~* .(js|css|png|jpg|jpeg|gif|ico|svg)$ {
        expires max;
        log_not_found off;
    }
}

B. 启用站点

# 创建符号链接
sudo ln -s /etc/nginx/sites-available/site1.conf /etc/nginx/sites-enabled/
sudo ln -s /etc/nginx/sites-available/site2.conf /etc/nginx/sites-enabled/

# 测试配置
sudo nginx -t

# 重启Nginx
sudo systemctl reload nginx

3. PHP-FPM池配置(可选但推荐)

为每个站点创建独立的PHP-FPM池:

/etc/php/8.1/fpm/pool.d/site1.conf:

[site1]
user = site1_user
group = site1_user
listen = /run/php/php8.1-fpm-site1.sock

pm = dynamic
pm.max_children = 10
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 5

env[WP_HOME] = http://site1.com
env[WP_SITEURL] = http://site1.com

二、Apache方案

1. 启用必要模块

sudo a2enmod rewrite
sudo a2enmod vhost_alias  # 用于虚拟主机

2. 配置虚拟主机

/etc/apache2/sites-available/site1.conf:

<VirtualHost *:80>
    ServerName site1.com
    ServerAlias www.site1.com
    DocumentRoot /var/www/site1/public_html

    ErrorLog ${APACHE_LOG_DIR}/site1-error.log
    CustomLog ${APACHE_LOG_DIR}/site1-access.log combined

    <Directory /var/www/site1/public_html>
        Options FollowSymLinks
        AllowOverride All
        Require all granted

        # WordPress重写规则
        <IfModule mod_rewrite.c>
            RewriteEngine On
            RewriteBase /
            RewriteRule ^index.php$ - [L]
            RewriteCond %{REQUEST_FILENAME} !-f
            RewriteCond %{REQUEST_FILENAME} !-d
            RewriteRule . /index.php [L]
        </IfModule>
    </Directory>

    # PHP配置
    <FilesMatch .php$>
        SetHandler "proxy:unix:/run/php/php8.1-fpm.sock|fcgi://localhost"
    </FilesMatch>
</VirtualHost>

3. 启用站点

sudo a2ensite site1.conf
sudo a2ensite site2.conf
sudo systemctl reload apache2

三、通用配置步骤

1. 数据库配置

为每个WordPress创建独立数据库:

CREATE DATABASE wp_site1;
CREATE USER 'wp_site1_user'@'localhost' IDENTIFIED BY '强密码';
GRANT ALL ON wp_site1.* TO 'wp_site1_user'@'localhost';
FLUSH PRIVILEGES;

2. WordPress安装

# 下载WordPress
cd /var/www/site1/public_html
wget https://wordpress.org/latest.tar.gz
tar -xzvf latest.tar.gz --strip-components=1
rm latest.tar.gz

# 设置权限
chown -R www-data:www-data /var/www/site1/public_html
find /var/www/site1/public_html -type d -exec chmod 755 {} ;
find /var/www/site1/public_html -type f -exec chmod 644 {} ;

3. WordPress配置文件

wp-config.php 调整:

define('WP_HOME', 'http://site1.com');
define('WP_SITEURL', 'http://site1.com');
define('DB_NAME', 'wp_site1');
define('DB_USER', 'wp_site1_user');
define('DB_PASSWORD', '你的密码');

// 每个站点使用不同的表前缀
$table_prefix = 'wp_site1_';

// 每个站点唯一的密钥(从https://api.wordpress.org/secret-key/1.1/salt/生成)
define('AUTH_KEY', '唯一密钥');

四、高级配置

1. SSL/TLS配置(Nginx示例)

server {
    listen 443 ssl http2;
    server_name site1.com www.site1.com;

    ssl_certificate /etc/letsencrypt/live/site1.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/site1.com/privkey.pem;

    # ... 其他配置同上
}

# HTTP重定向到HTTPS
server {
    listen 80;
    server_name site1.com www.site1.com;
    return 301 https://$server_name$request_uri;
}

2. 使用Docker容器化(更隔离的方案)

# docker-compose.yml
version: '3'
services:
  wordpress-site1:
    image: wordpress:latest
    container_name: wp-site1
    volumes:
      - ./site1:/var/www/html
    environment:
      WORDPRESS_DB_HOST: db-site1
      WORDPRESS_DB_NAME: wp_site1
      WORDPRESS_DB_USER: wp_user
      WORDPRESS_DB_PASSWORD: password
    networks:
      - wp-network
    labels:
      - "traefik.http.routers.site1.rule=Host(`site1.com`)"

3. 性能优化

  • 每个站点独立的OPcache配置
  • 对象缓存(Redis/Memcached)
  • CDN集成
  • 静态文件缓存

五、安全建议

  1. 隔离用户权限:为每个站点创建独立系统用户
  2. 定期更新:保持WordPress核心、主题、插件更新
  3. 防火墙配置:使用UFW或firewalld限制访问
  4. 备份策略:定期备份数据库和文件
  5. 监控日志:设置日志轮转和监控

选择建议

  • Nginx:性能更好,内存占用更低,适合高并发
  • Apache:模块丰富,.htaccess支持更灵活
  • Docker:提供最好的隔离性,便于迁移和扩展

两种方案都能有效实现多站点托管,选择取决于你的技术栈偏好和具体需求。建议从Nginx开始,它在性能和资源利用方面通常更优。

云服务器