我使用 Nginx 服务器作为反向代理。它同时为 HTTP 和 HTTPS 流量提供服务,并将调用分派到多个仅支持 HTTP 的网站。
最近,我希望能够加密 Nginx 和底层服务器之间的流量。Nginx 仍然像以前一样解密它从 Internet 接收到的 HTTPS 流量,但随后应该使用带有不同证书的 HTTPS 来访问底层服务器。
我开始按照官方文档更改配置。但是,proxy_ssl on
只能在一个stream
级别内设置,而不能http
。这可以通过nginx -t
which 显示包含proxy_ssl on;
以下错误的行来确认:
此处不允许使用“proxy_ssl”指令 [...]
我的困难是我使用 Nginx 来记录流量、添加标题等,所以我必须使用http
. 如果我的理解是正确的,那么stream
当 Nginx 用于直接传输 HTTPS 流量时需要级别,没有解密它的能力(即 SSL Pass-thru),这不是我的情况。
我可以让 Nginx 通过 HTTPS 连接到底层服务器,同时仍然使用http
级别及其所有好处,例如日志记录和更改标头吗?
当前配置:
http {
proxy_set_header ... # Logging and custom headers.
...
upstream demo-failover {
server demo1.example.com:443 weight=1000 max_fails=0;
server demo2.example.com:443 backup;
}
server {
listen 80 proxy_protocol;
listen 443 ssl http2 proxy_protocol;
server_name demo.example.com;
# HTTPS configuration for public exchange (Internet <-> Nginx).
ssl_certificate /.../fullchain.pem;
ssl_certificate_key /.../privkey.pem;
ssl_stapling on;
ssl_stapling_verify on;
# HTTPS configuration for private exchange (Nginx <-> underlying server).
proxy_ssl on; # This is the line which is invalid.
proxy_ssl_trusted_certificate /.../ca.pem;
proxy_ssl_certificate /.../demo.pem;
proxy_ssl_certificate_key /.../demo.key;
proxy_ssl_verify on;
proxy_ssl_verify_depth 2;
proxy_ssl_session_reuse on;
if ($scheme = http) {
return 301 https://$server_name$request_uri;
}
location / {
proxy_pass http://demo-failover;
proxy_next_upstream error timeout invalid_header;
proxy_connect_timeout 2;
proxy_redirect off;
proxy_http_version 1.1;
}
}
}
找到了。
无需切换到
stream
,也无需使用proxy_ssl on
。与官方文档不同的示例显示了如何在
http
级别上使用 HTTPS。诀窍(当我尝试删除proxy_ssl on
并发现自己使用 Nginx 尝试使用 HTTP 调用底层服务器时,这是我的错误)是proxy_pass
值。就我而言,我保留了原始值:相反,我应该将其更改为
https
: