uwsgi_params是nginx专用于uwsgi协议的静态变量映射表,将nginx请求变量(如$request_method、$uri)按uwsgi协议标准转为后端可识别的字段(如request_method、path_info),不控制超时或缓冲,也不支持动态修改,需通过include引入并在同级location中后置uwsgi_param指令覆盖或补充。

uwsgi_params 是 Nginx 自带的一个配置片段文件,作用是把客户端请求的常用 HTTP 头、方法、路径等变量,按 uWSGI 协议要求的格式,打包成键值对传给后端 uWSGI 进程。它不专属于 Django,但和 Django 配合时,是让 Nginx 正确转发动态请求的关键“翻译器”。
uwsgi_params 文件在哪?长什么样?
通常位于:/etc/nginx/uwsgi_params(Ubuntu/Debian)或 /usr/share/nginx/uwsgi_params(CentOS/RHEL)。
它本身不含业务逻辑,只定义了一组 uwsgi_param 指令,例如:
uwsgi_param QUERY_STRING $query_string;uwsgi_param REQUEST_METHOD $request_method;-
uwsgi_param PATH_INFO $fastcgi_script_name;(注意:Django 依赖这个传入视图路由) -
uwsgi_param UWSGI_SCRIPT $pythonpath.wsgi:application;(实际由 Nginx 配置中uwsgi_param UWSGI_MODULE等覆盖)
这些参数确保 uWSGI 能拿到原始请求的完整上下文,Django 的 request 对象才能正确解析 URL、POST 数据、headers 等。
在 server 块里怎么引用它?
你不需要手动复制粘贴内容,只需在 Nginx 的 location / 或其他动态路由块中用 include 引入:
location / {
include uwsgi_params;
uwsgi_pass unix:/run/uwsgi/myproject.sock;
}
这行 include uwsgi_params; 就相当于把全部标准参数一次性加载进来。Nginx 会自动查找系统默认路径,无需写全路径(除非你自定义存放位置)。
为什么 Django 特别需要它?
Django 的 WSGI 入口(myproject/wsgi.py)依赖环境变量和请求元数据来初始化 HttpRequest。如果漏掉关键参数,可能出现:
- 404:因为
PATH_INFO或SCRIPT_NAME错误,Django 路由匹配失败 - CSRF 失败:
HTTP_ORIGIN或HTTP_REFERER缺失 - 静态文件 404(当用
django.contrib.staticfiles开发模式调试时):因REQUEST_URI解析异常 - 登录态丢失:
HTTP_COOKIE未传入
而 uwsgi_params 默认已包含这些字段的映射,只要引入就基本覆盖 Django 所需。
要不要改它?什么情况下要加参数?
绝大多数情况不用改。但如果你做了以下操作,可能需要补充:
- 使用子路径部署(如网站跑在
https://example.com/myapp/):需额外加uwsgi_param SCRIPT_NAME /myapp; - Django 设置了
FORCE_SCRIPT_NAME:Nginx 中应同步设置对应SCRIPT_NAME - 需要透传自定义 header(如
X-Real-IP):可追加uwsgi_param HTTP_X_REAL_IP $remote_addr;
注意:新增参数要放在 include uwsgi_params; 之后,否则会被覆盖。











