我有以下配置:
server {
listen: 8080;
location / {
proxy_pass https://somehost.abc.xyz;
proxy_redirect off;
proxy_set_header Host somehost.abc.xyz;
proxy_set_header X-Real-IP somehost.abc.xyz;
proxy_set_header X-Forwarded-For somehost.abc.xyz;
proxy_set_header X-Forwarded-Host somehost.abc.xyz;
proxy_set_header HELLO pizza;
}
}
每当我访问代理时,比如说我访问 http://localhost:8080/home,我都会收到 503 服务不可用(不是来自 nginx 服务,而是来自我尝试访问的应用程序https://somehost.abc.xyz/home)。
但如果我只是去https://somehost.abc.xyz/home或者进行重定向,return 301 https://somehost.abc.xyz/home;
一切都很好,我进入了应用程序。虽然这对我没有帮助,因为我想通过代理到达那里,这样我就可以为每个通过的请求添加一个请求标头。
有什么想法可能导致这种情况以及如何解决?
答案1
尝试在 proxy_pass 地址上使用后端端口,并且其标头“HELLO”对后端应用程序有效吗?
server {
listen: 8080;
location / {
proxy_pass https://somehost.abc.xyz:443;
proxy_redirect off;
proxy_set_header Host somehost.abc.xyz;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host your.host.address;
proxy_set_header HELLO pizza;
proxy_ssl_server_name on;
proxy_ssl_name somehost.abc.xyz;
# Optional
proxy_ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
proxy_ssl_ciphers 'Required SSL Ciphers';
proxy_ssl_trusted_certificate "/path/to/your/ca-cetificates.crt";
}
}
编辑:使用 SSL 后端你应该定义代理 SSL 名称如果你没有后端 SSL 证书
答案2
我遇到过类似的问题,我发现以下语句导致了 503 错误:
proxy_set_header Host $host; # same for $http_host;
由于它对于我们的用例来说不是必需的,所以我可以直接将其删除,这样就可以摆脱 503 并让 nginx 最终向上游服务器发出请求。
我后来还了解到,似乎是$host
变量的使用而不是语句本身导致了这个问题,这意味着我的回答可能不是重点。
设置固定值(在本例中是在server
块内)不会产生问题。
不过,我没有解释,我希望其他人可以对此有所解释。这在 nginx 1.14 中曾经有效,我相信在 1.16 中也有效,但在 1.18 及更高版本中不再有效。