如何使用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会优先匹配到第一个跳转规则,自然就重定向到第一个站点。
解决步骤
- 删掉第二个站点docker-compose.yml中的nginx服务配置,不需要多跑一个Nginx实例,统一用宿主Nginx处理所有公网请求。修改第二个站点的backend端口映射为不冲突的端口:
ports: - "8009:8000"
- 调整第二个站点的.env参数,避免端口冲突:
PORT=8009 WSGI_PORT=8000
- 修改第二个站点的Django配置,
ALLOWED_HOSTS中加入第二个站点的IP/域名,避免Django本身抛出重定向错误。 - 调整宿主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; } }
- 执行
netstat -tulpn检查80、443、8008、8009端口没有异常占用,依次重启第二个站点的docker-compose服务、宿主Nginx服务即可。
内容的提问来源于stack exchange,提问作者Oleksandr
相关产品推荐
相关产品推荐

