[当将Nginx用作uWSGI / Django的反向代理时,在Nginx配置中uwsgi_param
和uwsgi_param
有什么区别? uWSGI参数是像HTTP标头一样,还是完全不同?如果是,它的目的是什么?
背景:我正在对Django中与安全相关的HTTP标头进行一些修改。我有一个使用Nginx作为反向代理的设置,其中uWSGI服务于Django应用并成为代理服务器:
proxy_set_header
[http请求通过两种机制在此处成为https请求:
proxy_set_header
响应标头;在这种情况下,永远不会有302重定向;浏览器立即接受客户端的HTTP请求,并立即将其强制为等效的https。也就是说,相关的Django设置如下:
_____________________________________
| |
http or https* | uwsgi |
browser --------------> | nginx --------------> uWSGI/Django |
|____________________________________|
* http 301-redirects to https equivalent;
https response returns Strict-Transport-Security header
和Nginx配置:
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
因此,当Django应用通过# tail -n4 project/settings.py
SECURE_HSTS_SECONDS = 31536000 # Seconds; *USE A SMALLER VALUE FOR TESTING FIRST!*
SECURE_HSTS_PRELOAD = True
SECURE_HSTS_INCLUDE_SUBDOMAINS = True
SECURE_PROXY_SSL_HEADER = ("HTTP_X_FORWARDED_PROTO", "https")
得知原始连接是HTTPs时,是否需要感谢server {
server_name .mydomain.com;
listen 80;
return 301 https://$host$request_uri;
}
server {
location / {
uwsgi_pass localhost:8000;
include uwsgi_params;
uwsgi_param X-Forwarded-Proto "https";
proxy_set_header X-Forwarded-Proto "https";
}
listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/mydomain.com/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/mydomain.com/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}
或SECURE_PROXY_SSL_HEADER
?因为协议是uwsgi而不是uwsgi_param
,实际上仍然使用proxy_set_header
吗? proxy_set_header
有什么作用?我在协议说明中看到了proxy_pass: http://localhost:8000
。它的行为类似于HTTP标头,还是完全不同?
是,由于设置了uwsgi_param
或very little uwsgi_param
标头(否则它将不存在),并且django应用程序(通过https代理后面的http工作)可以知道,原始请求是安全(通过https)。
Nginx将初始http请求转发到基础上游服务器。为此,它可能使用不同的协议-如果设置了proxy_set_header
指令,则为uwsgi;如果设置了HTTP_X_Forwarded_Proto
指令,则为http。 其中只有一个需要在块中设置。
默认情况下,nginx将所有原始请求标头转发到上游,这由uwsgi_pass
和proxy_pass
选项控制。使用proxy_pass_request_headers
或uwsgi_pass_request_headers
标头,可以显式设置/添加其值。
带有proxy_set_header
-请求作为HTTP请求转发到上游服务器。并且使用uwsgi_param
标头及其要传递的值可以进行设置。
带proxy_pass
请求是通过uwsgi二进制协议转发的。它不是http,没有“标头”,而是具有要由proxy_set_header
传递的参数(如果参数名称以uwsgi_pass
开头-可以在wsgi应用程序中用作标头)。
Uwsgi是用于wsgi服务器的本机(但大多数也可以通过http来工作),并且允许对通过传递参数的wsgi服务器如何处理请求进行更精细的调整。并带有配置可以提高性能。但是,差异可能非常微妙。
需要http的几种情况(主要原因是它的普遍性: