使用 https 和虚拟主机为 nginx 设置自定义错误页面

使用 https 和虚拟主机为 nginx 设置自定义错误页面

我们有一个 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 内的正确调试

相关内容