uwsgi启动必备socket、module和callable参数;module需填模块名:实例名(如app:app),非文件名;socket须用绝对路径并设chmod-socket=666;需启用master=true和processes=2;nginx须用uwsgi_pass直连unix socket,正确设置proxy_set_header和proxy_buffering off。

uWSGI配置里module和socket写错,服务根本起不来
最常见的启动失败,就是module填成文件名(比如app.py:app),实际它要的是模块路径+实例名。假设你的Flask应用在app.py里定义了app = Flask(__name__),那module必须写成app:app,不是app.py:app——否则报ImportError: No module named 'app.py'。
socket也必须用绝对路径,例如/tmp/myapp.sock。写相对路径(如./myapp.sock)会导致uWSGI在不可控的工作目录下创建文件,Nginx连都找不到。
这几个参数缺一不可:
socket = /tmp/myapp.sock-
module = app:app(按你实际模块名和变量名调整) -
chmod-socket = 666(否则Nginx worker用户(如www-data)无权读写) -
master = true和processes = 2(单进程扛不住真实流量,且没主进程就无法热重载)
Nginx用proxy_pass还是uwsgi_pass?别混用
必须用uwsgi_pass直连uWSGI的Unix socket,不是proxy_pass http://...。后者是走HTTP协议栈,要额外开http-socket,性能差、绕过优势、还容易冲突。
正确写法是:
location / {
include uwsgi_params;
uwsgi_pass unix:/tmp/myapp.sock;
uwsgi_read_timeout 30;
proxy_buffering off;
}
关键点:
-
include uwsgi_params不能少,它预置了UWSGI_SCRIPT等必要头字段 -
uwsgi_read_timeout建议设为30或更高,防止uWSGI处理慢请求时Nginx先断连返回504 -
proxy_buffering off对流式响应(SSE、大文件下载)是刚需,否则卡住
502 Bad Gateway?三步定位比改配置快得多
别急着调参数,先查这三项:
- 运行
ls -l /tmp/myapp.sock:看文件是否存在、权限是否为srw-rw-rw-;不存在说明uWSGI根本没跑起来,去journalctl -u myapp或日志文件里看启动报错 - 运行
ps aux | grep uwsgi:确认uWSGI进程用户(如www-data)和Nginx worker用户一致;不一致会导致socket权限拒绝 - 运行
netstat -lnp | grep :80:确认Nginx确实在监听80端口,且没被其他服务(如Apache)占着
90%的502来自这三处,而不是配置语法错误。
静态文件404或remote_addr全是127.0.0.1?header没传对
Flask收不到原始域名和用户IP,八成是因为Nginx没透传关键header。仅靠proxy_set_header Host $host不够。
必须显式加这两行:
proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr;
如果还用到request.environ.get('HTTP_X_FORWARDED_FOR'),再补一行:
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
另外,静态文件404常因Nginx没接管静态路由。要么在Nginx里用location /static直接serve,要么确保Flask的static_url_path和Nginx中alias路径严格匹配——大小写、末尾斜杠、拼写,错一个就404。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











