Nginx+uWSGI部署Flask服务本地正常远程无法访问问题咨询
故障原因分析
1. 域名访问无响应、无日志的可能原因
- 远程服务器安全组/防火墙未放行80、443端口:公网请求根本没到达服务器,自然不会产生Nginx日志
- DNS解析未生效:虽然配置了A记录,但本地DNS缓存或者解析链路还没同步,请求打到了错误IP上
- Nginx容器未映射443端口:原启动命令只配置了
-p 80:80端口映射,新增SSL监听443端口后没有补充-p 443:443配置,HTTPS请求直接被服务器拒绝,80端口如果被防火墙拦截也会出现无响应问题
2. 公网IP访问返回502的可能原因
- 请求未匹配到配置的Nginx规则:用公网IP访问时Host字段为IP,无法匹配
server_name develop.domainname.com的规则,会走Nginx默认server配置,如果默认server配置了HTTP转发到8080端口,而8080端口监听的是uwsgi协议,就会返回502 - 远程环境Docker网络异常:两个容器未实际加入同一个自定义网络,或是Flask容器未正常启动、端口监听异常,Nginx无法将请求转发到1.1.1.4:8080
- Nginx配置缺失upstream块:远程配置仅修改了server块,没有保留原来的
upstream app_dev配置,导致uwsgi_pass找不到目标转发地址
排查定位步骤
- 第一步:验证端口连通性
本地执行telnet 服务器公网IP 80和telnet 服务器公网IP 443,如果连接失败,先检查服务器安全组、iptables/firewalld是否放行80、443端口,再确认Nginx启动命令已经添加-p 443:443端口映射 - 第二步:验证DNS解析
本地执行nslookup develop.domainname.com,确认返回的IP和服务器公网IP一致,不一致则等待DNS生效或者清理本地DNS缓存 - 第三步:验证Nginx配置有效性
进入Nginx容器执行nginx -t,检查配置是否存在语法错误,同时确认配置文件里保留了upstream app_dev的完整配置 - 第四步:验证容器网络连通性
进入Nginx容器执行ping 1.1.1.4和nc -zv 1.1.1.4 8080,确认可以正常连通Flask容器的8080端口,不通则检查Flask容器是否正常运行、Docker网络配置是否正确 - 第五步:验证请求匹配规则
在服务器本地执行curl -H "Host: develop.domainname.com" http://127.0.0.1和curl -H "Host: develop.domainname.com" https://127.0.0.1 -k,查看Nginx是否有日志输出,如果有日志且返回正常,说明问题出在公网链路;如果本地请求也返回502,查看Nginx错误日志定位转发问题。
内容的提问来源于stack exchange,提问作者Archirk
相关产品推荐
相关产品推荐

