使用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集成
- 静态文件缓存
五、安全建议
- 隔离用户权限:为每个站点创建独立系统用户
- 定期更新:保持WordPress核心、主题、插件更新
- 防火墙配置:使用UFW或firewalld限制访问
- 备份策略:定期备份数据库和文件
- 监控日志:设置日志轮转和监控
选择建议
- Nginx:性能更好,内存占用更低,适合高并发
- Apache:模块丰富,.htaccess支持更灵活
- Docker:提供最好的隔离性,便于迁移和扩展
两种方案都能有效实现多站点托管,选择取决于你的技术栈偏好和具体需求。建议从Nginx开始,它在性能和资源利用方面通常更优。
CLOUD技术笔记