Nginx反向代理Docker部署双Django应用8001端口访问异常如何解决
问题根源
你遇到的问题核心是Nginx的Host匹配规则、Docker服务配置、访问方式三者不匹配导致的,按以下步骤修改即可解决:
解决方案
1. 修正Nginx配置,补充代理头与匹配规则
你当前的配置缺少必要的代理请求头,且server_name匹配规则限制了访问方式,修改nginx.conf如下:
events { } http { server { listen 8000; # 如果你需要同时支持IP和域名访问,改为server_name _; server_name web.appli1.com; location / { proxy_pass http://web:8000; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } server { listen 8001; # 如果你需要同时支持IP和域名访问,改为server_name _; server_name web2.appli2.com; location / { proxy_pass http://web2:8001; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } }
修改后重启Nginx容器生效:docker compose restart reverse-proxy
2. 调整访问方式/匹配规则
- 如果你要使用域名访问:必须完整输入
http://web2.appli2.com:8001,不能用IP+端口访问,否则Host头匹配不到web2.appli2.com,会返回默认站点内容 - 如果你要使用IP+端口访问:把两个server块的
server_name改为_(代表匹配所有Host)即可
3. 校验web2服务配置
- 确认
web2服务使用的是appli2的代码:你当前配置中web和web2都用build: .构建,也就是用同一份代码构建镜像,如果你要部署两个不同的应用,需要把web2的build参数改为appli2的代码存放路径 - 检查web2服务运行状态:执行
docker compose logs web2确认服务没有启动报错,端口监听正常
可选优化(免端口访问)
如果希望不用带端口直接通过域名访问两个应用,调整配置如下:
- 修改
nginx.conf的两个server块监听端口都改为80,靠server_name区分站点 - 修改docker-compose中reverse-proxy的端口映射为
- 80:80 - 直接访问
http://web.appli1.com和http://web2.appli2.com即可
内容的提问来源于stack exchange,提问作者lanam
相关产品推荐
相关产品推荐

