我一直在对一个晦涩的 nginx 问题进行故障排除,其中我们有一个站点正确地提供证书并在端口 443 上建立了一个 ssl 连接,即使没有为该端口明确打开 ssl。您可以在下面看到该站点的配置,该站点正在侦听端口 443 但不使用ssl 指令。
server {
listen 443;
port_in_redirect off;
server_name xyz.abcd.com;
# websockets
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
client_max_body_size 1m;
proxy_set_header X-Request-Id $request_id;
proxy_set_header X-Request-Start $msec;
proxy_set_header X-Forwarded-Proto "https";
proxy_set_header Host $host;
location / {
proxy_pass http://xyz-svc;
}
}
此外,我们的 nginx.conf 没有明确提及端口 443 或 ssl,但它确实包含 abcd.com 证书的路径:
http {
..
ssl_certificate /etc/ssl/certs/abcd.pem;
ssl_certificate_key /etc/ssl/private/abcd.key;
..
}
最后,如果我们访问http://abcd.com:443,nginx 会抛出一个错误“The plain HTTP request was sent to HTTPS port”。因此,很明显,它将此站点的端口 443 解释为 ssl 端口,即使我们没有在配置中明确定义它。对于 nginx 版本 1.7.5 和 nginx 版本 1.13.8,此行为都是正确的。
如果配置中从未定义过,nginx 会在端口 443 上为具有适当证书的站点正确建立 ssl 连接的可能原因是什么?