Nginx与uWSGI协议不匹配?请求超时问题排查
问题分析与解决方案
核心问题是uWSGI启动命令和Nginx配置的协议不匹配:
- 你用
uwsgi --http :8000 --module myproject.wsgi启动时,uWSGI是以HTTP协议监听8000端口,只能处理HTTP请求; - 而Nginx配置里应该是用了
uwsgi_pass指令,会向后端发送uWSGI原生协议的请求,导致uWSGI无法识别,最终超时无响应。
两种修复方案
方案1:调整uWSGI启动命令(推荐,标准架构)
将uWSGI切换为监听uWSGI原生协议,替换--http参数为--socket或--uwsgi-socket:
# 用TCP端口监听uWSGI协议 uwsgi --socket :8000 --module myproject.wsgi # 或者用Unix套接字(性能更优,需保证Nginx有权限访问) uwsgi --socket /tmp/uwsgi.sock --module myproject.wsgi --chmod-socket=664
对应Nginx的配置(以TCP端口为例):
location / { uwsgi_pass 127.0.0.1:8000; include uwsgi_params; # 必须包含这个文件,提供uWSGI协议所需的请求头 }
如果用Unix套接字,把uwsgi_pass改成unix:/tmp/uwsgi.sock;即可。
方案2:调整Nginx配置(不推荐,性能较差)
如果要保留uWSGI的HTTP协议模式,Nginx不能用uwsgi_pass,改用proxy_pass转发HTTP请求:
location / { proxy_pass http://127.0.0.1:8000; # 传递必要的请求头,避免Django获取不到正确的请求信息 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; }
内容的提问来源于stack exchange,提问作者fadedbee
相关产品推荐
相关产品推荐

