Nginx通过location块配合include uwsgi_params和uwsgi_pass实现对Python应用的动态请求转发,其中uwsgi_params负责协议变量映射,uwsgi_pass指定uWSGI后端地址(IP端口或Unix套接字),并需分离静态资源、校验权限与协议一致性。

直接用 location 把动态请求转给 uWSGI,是 Nginx 部署 Python 后端最核心、最常用的做法。关键不是写对语法,而是理清“谁处理什么”——Nginx 负责接用户请求、分发、管静态资源;uWSGI 只管跑 Python 代码、返回数据。
location 块里必须配的三样东西
在 server 块中写一个 location,比如匹配所有 API 请求:
location /api/ {
include uwsgi_params;
uwsgi_pass 127.0.0.1:8001;
}
-
include uwsgi_params:这是 Nginx 自带的配置片段(通常在
/etc/nginx/uwsgi_params),它把 HTTP 请求头、路径、方法等关键信息,按 uWSGI 协议要求打包成变量传过去。漏掉这行,Django/Flask 就收不到PATH_INFO或QUERY_STRING,路由全乱。 -
uwsgi_pass:指定 uWSGI 监听的地址。可以是
127.0.0.1:8001(TCP socket),也可以是unix:///tmp/myapp.sock(Unix socket,性能略高、更安全)。确保和 uWSGI 启动时的--socket或配置文件里的socket=完全一致。 -
location 路径要和后端路由对齐:比如你写
location /api/,那 Python 应用里就不该再重复写/api前缀(如 Flask 的@app.route('/api/users')应改为@app.route('/users')),否则实际访问变成/api/api/users。也可加uwsgi_modifier1 30;让 uWSGI 自动剥离前缀,但初学者建议统一由 Nginx 控制入口路径。
静态资源别让 uWSGI 处理
Nginx 必须自己扛住静态文件,否则每次 js/css/image 请求都绕一圈到 Python,既慢又浪费。典型写法:
快速生成专业的 Python 脚本和应用代码。一键创建完整项目结构,支持CLI、API、爬虫、Bot、Django等多种项目类型,包含完整的项目结构、配置文件、依赖管理、测试、README和文档。
location /static/ {
alias /var/www/myapp/static/;
expires 1h;
}
-
用 alias 而非 root:如果项目静态目录是
/var/www/myapp/static/,那么alias /var/www/myapp/static/;表示把/static/xxx映射到该目录下;若用root,就得写root /var/www/myapp;,否则路径会多拼一层。 - 加 expires 缓存头:避免浏览器反复请求不变的文件,提升加载速度。
常见陷阱与绕过方式
部署失败,八成卡在这几处:
立即学习“Python免费学习笔记(深入)”;
-
权限问题:Nginx 工作进程(通常是
www-data或nginx用户)必须有权限读取 uWSGI socket 文件(如果是 Unix socket)或连通目标端口。检查ls -l /tmp/myapp.sock,必要时在 uWSGI 配置中加chmod-socket = 664和chown-socket = www-data:www-data。 -
协议混淆:别把
uwsgi_pass和proxy_pass搞混。前者专用于 uWSGI 协议,后者是通用 HTTP 代理。用错会导致 502 Bad Gateway 或空响应。 -
缺少必要参数:某些框架(如 Django)需要额外环境变量,可在 location 内加:
uwsgi_param UWSGI_SCRIPT myproject.wsgi:application;
uwsgi_param DJANGO_SETTINGS_MODULE myproject.settings;
这些参数会被传进 uWSGI 进程环境,比硬编码在 Python 里更灵活。
验证是否走通的最快办法
不用重启整个 Nginx,分步确认链路:
- 先确保 uWSGI 已运行:
uwsgi --ini myapp.ini,看日志是否有spawned uWSGI worker; - 用 curl 测试 uWSGI 是否响应:
curl http://127.0.0.1:8001/health(如果暴露了健康接口)或直接 telnet 端口; - 检查 Nginx 错误日志:
tail -f /var/log/nginx/error.log,502 通常意味着 uWSGI 没起来或地址不通; - 临时在 location 里加
return 200 "from nginx";,确认 Nginx 确实进了这个 block。

















