使用镜像部署后如何配置Nginx实现多站点共存?

使用镜像部署后配置 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_nameroot


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.conf vs /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)的专用配置模板吗?