我有以下 Nginx 配置来平衡不同节点之间的负载。但是,当我尝试重定向流量时,我获得502错误的网关。
通过阅读错误日志,我发现问题与我的 Nginx 负载均衡器尝试验证 X509 证书的有效性有关不是对于各个节点(backend1.example.com,backend2.example.com
),但对于上游的名称backend.example.com
(无数字),导致出现如下所示的错误。
我如何告诉 nginx 使用转发节点的主机名,而不是上游的主机名?
错误日志:
upstream SSL certificate does not match "backend.example.com" while SSL handshaking to upstream...
配置:
upstream backend.example.com {
least_conn;
server backend1.example.com:443
server backend2.example.com:443
}
server {
listen [::]:443 ssl ipv6only=on;
listen 443 ssl;
server_name example.com;
location / {
proxy_pass https://backend.example.com;
proxy_ssl_trusted_certificate /etc/ssl/certs/ca-certificates.crt;
proxy_ssl_session_reuse on;
proxy_ssl_verify on;
proxy_ssl_verify_depth 2;
proxy_set_header Host $host;
}
ssl_certificate /etc/letsencrypt/.../fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/.../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
}
答案1
根据nginx
开发人员的说法,您需要在所有后端服务器之间共享相同的 TLS 证书。请参阅以下错误报告https://trac.nginx.org/nginx/ticket/1307#评论:5
答案2
您需要的 ngx_http_proxy_module 指令是proxy_ssl_name
您可以通过多种方式解决该问题:
尝试设置一下
proxy_ssl_name $proxy_host;
使用通配符 SSL 证书。
如果在内部网络中,使用 http 连接进行上游,无需过多的双重加密,并且仅允许从反向代理服务器进行上游端的 http 连接
在每个节点上放置相同的上游证书,并将其设置为一个预期名称
proxy_ssl_name backend.example.com;