使用镜像部署后配置 Nginx 实现多站点共存,核心思路是:每个站点独立配置文件 + 通过 server_name 区分域名 + 共享或隔离静态资源目录。以下是标准操作流程(以 Linux + Docker 为例):
✅ 前提条件
- 已启动 Nginx 容器(如
nginx:alpine或自定义镜像) - 各站点代码已挂载到容器内对应目录(如
/var/www/site1,/var/www/site2) - 域名已解析到服务器 IP(测试可用 hosts 或本地 DNS)
🔧 步骤详解
1️⃣ 创建站点配置文件模板
在宿主机创建配置目录(避免直接修改容器内文件):
mkdir -p ~/nginx-config/sites-available
mkdir -p ~/nginx-config/sites-enabled
为每个站点编写独立 .conf 文件,例如 site1.conf:
# ~/nginx-config/sites-available/site1.conf
server {
listen 80;
server_name site1.example.com www.site1.example.com;
root /var/www/site1/public; # 指向容器内挂载路径
index index.html index.php;
location / {
try_files $uri $uri/ =404;
}
# PHP 支持示例(如 Laravel/WordPress)
location ~ .php$ {
fastcgi_pass php-fpm:9000; # 若 PHP-FPM 同容器需调整
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
# 可选:开启 gzip、缓存等优化
gzip on;
gzip_types text/plain application/json;
}
同理创建 site2.conf,仅修改 server_name 和 root。
2️⃣ 启用站点并关联主配置
在主 Nginx 配置中引入 sites-enabled:
# ~/nginx-config/nginx.conf 中的 http 块内添加:
include /etc/nginx/conf.d/*.conf; # 默认包含 conf.d/
# 或显式包含 sites-enabled(推荐):
include /etc/nginx/sites-enabled/*.conf;
💡 注意:不同镜像默认入口可能不同(如
/etc/nginx/nginx.confvs/etc/nginx/conf.d/default.conf),请根据实际镜像调整。
3️⃣ 挂载配置到容器
运行或重启容器时,将配置目录映射进容器:
docker run -d
--name nginx-multi
-p 80:80 -p 443:443
-v ~/nginx-config/sites-available:/etc/nginx/sites-available:ro
-v ~/nginx-config/sites-enabled:/etc/nginx/sites-enabled:ro
-v ~/nginx-config/nginx.conf:/etc/nginx/nginx.conf:ro
-v ~/www/site1:/var/www/site1:ro
-v ~/www/site2:/var/www/site2:ro
nginx:alpine
✅ 关键:
sites-enabled建议用软链接指向sites-available的生效文件(模拟 Debian 风格):ln -s ../sites-available/site1.conf ../sites-enabled/site1.conf- 所有
root路径必须与挂载卷一致(容器内路径!)
4️⃣ 重载配置(无需重启容器)
进入容器执行:
docker exec -it nginx-multi nginx -t && docker exec -it nginx-multi nginx -s reload
验证是否成功:
curl -H "Host: site1.example.com" http://localhost
curl -H "Host: site2.example.com" http://localhost
🌐 进阶建议
| 场景 | 方案 |
|---|---|
| HTTPS | 使用 Let’s Encrypt 自动签发证书,每个站点单独配置 ssl_certificate |
| PHP-FPM 分离 | 将 PHP-FPM 作为独立容器,Nginx 通过 fastcgi_pass 172.17.0.3:9000 转发 |
| 动态配置生成 | 结合 Traefik/Caddy 或脚本自动从 docker-compose.yml 生成 Nginx 配置 |
| 日志隔离 | 每个站点配独立 access_log / error_log 便于排查 |
⚠️ 常见错误排查
502 Bad Gateway→ 检查root路径是否存在、权限是否正确(chmod -R 755)403 Forbidden→ 确认index文件存在且目录有读权限- 配置不生效 → 检查
include路径是否匹配、配置文件语法(nginx -t) - 多站点冲突 → 确保
server_name无重复,优先匹配最长前缀规则
需要我提供 docker-compose.yml 完整示例或某框架(如 WordPress/Laravel)的专用配置模板吗?
PHPWP博客