You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Docker与Nginx在同一服务器部署多个Django站点并解决配置异常

存在的配置问题

  • 端口冲突:第二个站点.env中设置的PORT=8008、WSGI_PORT=8008,与第一个站点Nginx代理的后端端口冲突,同时第二个站点容器内Nginx映射的81/444端口没有被公网请求命中,访问第二个IP的80/443端口默认会走到宿主机器的Nginx服务,不会进入第二个站点的容器Nginx。
  • 代理目标不匹配:第二个站点容器内的default.conf写的proxy_pass http://backend:8010,但Django实际启动的WSGI端口是8008,请求根本无法到达后端服务。
  • 容器网络隔离:两个docker-compose项目默认使用独立的网桥网络,宿主Nginx配置中的backend服务名只能解析到第一个站点的后端容器,无法找到第二个站点的后端容器。
  • 域名匹配逻辑错误:第一个站点的宿主Nginx的80端口有两个监听规则,一个是匹配www.site1/site1跳转HTTPS,另一个是default_server匹配ip_site2/site2,如果你访问的第二个IP不在ip_site2的配置值内,Nginx会优先匹配到第一个跳转规则,自然就重定向到第一个站点。

解决步骤

  1. 删掉第二个站点docker-compose.yml中的nginx服务配置,不需要多跑一个Nginx实例,统一用宿主Nginx处理所有公网请求。修改第二个站点的backend端口映射为不冲突的端口:
ports:
  - "8009:8000"
  1. 调整第二个站点的.env参数,避免端口冲突:
PORT=8009
WSGI_PORT=8000
  1. 修改第二个站点的Django配置,ALLOWED_HOSTS中加入第二个站点的IP/域名,避免Django本身抛出重定向错误。
  2. 调整宿主Nginx(即第一个站点的default.conf)中对应第二个站点的server块配置:
server {
    listen 80 default_server;
    # 此处替换为你的第二个站点实际IP/域名
    server_name 183.22.332.12 site2;

    location /static/ {
        # 替换为第二个站点静态文件实际挂载的宿主路径
        root /var/www/second_site;
    }

    location /media/ {
        # 替换为第二个站点媒体文件实际挂载的宿主路径
        root /var/www/second_site;
    }

    location / {
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        # 直接代理到宿主机的8009端口,即第二个站点后端映射的端口
        proxy_pass http://127.0.0.1:8009;
    }
}
  1. 执行netstat -tulpn检查80、443、8008、8009端口没有异常占用,依次重启第二个站点的docker-compose服务、宿主Nginx服务即可。

内容的提问来源于stack exchange,提问作者Oleksandr

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 16:30:01