Ubuntu 16.04下Nginx+uWSGI部署Django项目mysite遇请求挂起问题
排查Nginx + uWSGI部署Django时请求挂起的问题
我帮你梳理下这个问题的排查思路——既然没启动uWSGI时访问8003能返回预期的502,说明Nginx的基础监听是正常的,问题基本出在Nginx和uWSGI的通信环节,或者uWSGI的运行配置上。
1. 先检查协议匹配性(最可能的原因)
你启动uWSGI用的是--http :8002参数,这会让uWSGI以HTTP协议监听8002端口,但如果你的Nginx配置里用的是uwsgi_pass指令(对应uWSGI专属协议)去连接8002,两者协议不兼容就会直接导致请求挂起。
- 检查你的Nginx配置:
- 如果配置里是
uwsgi_pass 127.0.0.1:8002;,那uWSGI应该改用--socket :8002启动(--socket是uWSGI协议模式,和Nginx的uwsgi_pass对应),修改后的启动命令:uwsgi --socket :8002 --module mysite.wsgi --logto /tmp/uwsgi.log --master - 如果你想继续用
--http参数,那Nginx里要改成HTTP反向代理模式,用proxy_pass http://127.0.0.1:8002;替换原来的uwsgi_pass配置。
- 如果配置里是
2. 确认uWSGI是否真的在监听8002端口
用这个命令检查端口占用情况:
netstat -tulpn | grep 8002
如果看不到uWSGI进程,说明uWSGI启动失败或者监听地址不对,赶紧去/tmp/uwsgi.log里找错误,比如是不是找不到mysite.wsgi模块(可能是你启动uWSGI的目录不是Django项目根目录),或者权限不足。
3. 深挖Nginx错误日志的细节
你提到已经看过/var/log/nginx/error.log,可以重点搜这些关键词:
upstream timed out:说明Nginx能连上uWSGI,但uWSGI一直没响应,协议不匹配会出现这个情况。no route to host或者connection refused:如果启动uWSGI后出现这个,可能是uWSGI只监听了127.0.0.1,但Nginx用了外网IP(192.168.0.17)访问?可以把uWSGI的监听地址改成0.0.0.0,比如--http 0.0.0.0:8002。
4. 绕过Nginx直接测试uWSGI
先直接访问http://192.168.0.17:8002,如果能正常加载Django页面,说明uWSGI本身没问题,问题肯定在Nginx配置上;如果直接访问也挂起,那就是uWSGI的配置问题,比如缺少项目目录指定,试试加上--chdir参数:
uwsgi --http :8002 --module mysite.wsgi --chdir /path/to/your/mysite-project-root --logto /tmp/uwsgi.log --master
5. 检查防火墙是否拦截端口
Ubuntu16.04默认的ufw防火墙可能会拦截8002端口,用ufw status查看防火墙状态,如果是开启的,先临时关闭测试:
ufw disable
如果关闭后访问正常,记得再添加规则开放8002端口:
ufw allow 8002/tcp
内容的提问来源于stack exchange,提问作者zoltar
相关产品推荐
相关产品推荐

