uwsgi_param与proxy_set_header之间的差异

问题描述 投票:0回答:1

[当将Nginx用作uWSGI / Django的反向代理时,在Nginx配置中uwsgi_paramuwsgi_param有什么区别? uWSGI参数是像HTTP标头一样,还是完全不同?如果是,它的目的是什么?


背景:我正在对Django中与安全相关的HTTP标头进行一些修改。我有一个使用Nginx作为反向代理的设置,其中uWSGI服务于Django应用并成为代理服务器:

proxy_set_header

[http请求通过两种机制在此处成为https请求:

  1. Nginx将端口80请求重定向到443,例如请求历史记录链具有301重定向
  2. 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标头,还是完全不同?

python django nginx uwsgi
1个回答
1
投票

是,由于设置了uwsgi_paramvery little uwsgi_param标头(否则它将不存在),并且django应用程序(通过https代理后面的http工作)可以知道,原始请求是安全(通过https)。


Nginx将初始http请求转发到基础上游服务器。为此,它可能使用不同的协议-如果设置了proxy_set_header指令,则为uwsgi;如果设置了HTTP_X_Forwarded_Proto指令,则为http其中只有一个需要在块中设置。

默认情况下,nginx将所有原始请求标头转发到上游,这由uwsgi_passproxy_pass选项控制。使用proxy_pass_request_headersuwsgi_pass_request_headers标头,可以显式设置/添加其值。

带有proxy_set_header-请求作为HTTP请求转发到上游服务器。并且使用uwsgi_param标头及其要传递的值可以进行设置。

proxy_pass请求是通过uwsgi二进制协议转发的。它不是http,没有“标头”,而是具有要由proxy_set_header传递的参数(如果参数名称以uwsgi_pass开头-可以在wsgi应用程序中用作标头)。

Uwsgi是用于wsgi服务器的本机(但大多数也可以通过http来工作),并且允许对通过传递参数的wsgi服务器如何处理请求进行更精细的调整。并带有配置可以提高性能。但是,差异可能非常微妙。

需要http的几种情况(主要原因是它的普遍性:

  • 直接用于服务之间的内部通信
  • 您可能要使用或尝试使用除nginx以外的其他https代理(目前有很多),它可能不支持uwsgi
  • 采用微服务方法-nginx和uwsgi之间可能还有其他代理/附带工具(用于身份验证,日志记录等,它们仅适用于http)>
© www.soinside.com 2019 - 2024. All rights reserved.