![使用 https 和虚拟主机为 nginx 设置自定义错误页面](https://linux22.com/image/804409/%E4%BD%BF%E7%94%A8%20https%20%E5%92%8C%E8%99%9A%E6%8B%9F%E4%B8%BB%E6%9C%BA%E4%B8%BA%20nginx%20%E8%AE%BE%E7%BD%AE%E8%87%AA%E5%AE%9A%E4%B9%89%E9%94%99%E8%AF%AF%E9%A1%B5%E9%9D%A2.png)
我们有一个 nginx(OpenResty 1.4.2.7)实例充当负载平衡器。它有两个服务器指令,一个用于服务一个特定站点(我们称之为 www.our-special-host.com),另一个用于其他所有站点。我们正在尝试对其进行配置,以便根据两个服务器指令中的哪个后端发生故障来显示不同的 502 错误页面。
我们的配置适用于 HTTP,但不适用于 HTTPS。如果我们关闭后端并访问 www.our-special-host.com,我们会收到 HTTP 和 HTTPS 的相应错误。但是,如果我们访问任何其他托管网站,我们会收到 HTTP 的正确错误页面,但对于 HTTPS,我们会收到 www.our-special-host.com 的错误页面。
这是我们的配置(略作编辑):
server {
server_name www.our-special-host.com
listen 80;
listen 443 ssl;
error_page 502 /nginx_errors/loadbalancer_502_on_special_host.html;
location /nginx_errors/ {
alias /path/to/nginx_errors/;
}
location / {
proxy_pass x.x.x.x;
...
}
ssl_certificate certificate.crt;
ssl_certificate_key pk.key;
}
server {
listen 80;
listen 443 ssl;
error_page 502 /nginx_errors/loadbalancer_502_on_other_hosts.html;
location /nginx_errors/ {
alias /path/to/nginx_errors/;
}
location / {
proxy_pass y.y.y.y;
...
}
ssl_certificate certificate.crt;
ssl_certificate_key pk.key;
}
(所有涉及的主机都是 XXX.ourdomain.com,并且证书是针对 *.ourdomain.com。)
[更新] 在 Michael Hampton 发表下面的评论后,我在第二个服务器块中添加了一个明确的捕获所有正则表达式,即。
server_name ~^.*$;
该行为仍然是错误的,但是有所不同:
- “特别”网站http:我们得到错误的错误页面,loadbalancer_502_on_other_hosts.html
- “特别”网站https:我们得到正确的错误页面,loadbalancer_502_on_special_host.html
- “非特殊”网站http:我们得到正确的错误页面,loadbalancer_502_on_other_hosts.html
- “非特殊”网站https:我们得到正确的错误页面,loadbalancer_502_on_other_hosts.html
答案1
顺便说一句,catch_all 服务器名称经过server_name _;
,不需要正则表达式
从您对错误的描述来看,似乎使用了错误的服务器 {} -,但仅限于 http,而不是 https。
您是否为每个 SSL 主机设置了单独的 IP?如果没有,您的 nginx 是否支持 SNI?您可以使用“nginx -V”进行检查,它应该给出如下一行:
$ ~/nginx -V
nginx version: nginx/1.4.1
built by gcc 4.4.5 (Debian 4.4.5-8)
TLS SNI support enabled
....
如果你的 nginx 支持 SNI,那么问题可能出在你的浏览器/操作系统上;Windows XP 无法使用 SNI 感知。SNI 是一个 openssl 功能,你至少需要有 0.9.8f
如果 SNI 对您来说是一个问题:请为每个 SSL 主机使用单独的 IP。
更多调试提示:
- 为每个服务器使用单独的 access_log,例如
access_log /var/log/nginx/special_host.access.log;
为您的特殊主机 - 发出请求并检查你实际在哪个服务器上运行;确保 http 和 https 都在正确的服务器上
- 如果这是 server_part 内的正确调试