Configurando páginas de erro personalizadas para nginx com https e hosts virtuais

2

Temos uma instância nginx (OpenResty 1.4.2.7) agindo como um balanceador de carga. Ele tem duas diretivas de servidor, uma para servir um site específico (vamos chamá-lo de www.our-special-host.com) e um curinga para todo o resto. Estamos tentando configurá-lo para que diferentes páginas de erro 502 sejam mostradas, dependendo de qual backend das diretivas de dois servidores está inativo.

Nossa configuração funciona para HTTP, mas não para HTTPS. Se encerrarmos os backends e clicarmos em www.our-special-host.com, obtemos o erro apropriado para HTTP e HTTPS. No entanto, se acertarmos qualquer outro site hospedado, obteremos a página de erro correta para HTTP, mas, para HTTPS, obtemos a página de erro para www.our-special-host.com.

Aqui está a configuração que temos (levemente editada):

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;
}

(Todos os hosts envolvidos são XXX.ourdomain.com e o certificado é para * .domínio.com.)

[ATUALIZAÇÃO] Após o comentário de Michael Hampton abaixo, adicionei uma regex pega-tudo explícita ao segundo bloco de servidores, ou seja,

    server_name ~^.*$;

O comportamento ainda está errado, mas diferente:

  • Site "especial" com link : obtemos a página de erro errada , loadbalancer_502_on_other_hosts.html
  • Site "especial" com link : obtemos a página de erro correta , loadbalancer_502_on_special_host.html
  • Site "não especial" com link : obtemos a página de erro correta , loadbalancer_502_on_other_hosts.html
  • Site "não especial" com link : obtemos a página de erro correta , loadbalancer_502_on_other_hosts.html
por Giles Thomas 26.09.2013 / 19:12

1 resposta

1

btw, o nome do servidor catch_all passa por server_name _; , não é necessário regex

da sua descrição do erro parece que o servidor errado {} - é usado, mas apenas em http, não em https.

você tem um IP separado para cada host SSL ou não? se não, o seu nginx está ciente do SNI? você checaria com 'nginx -V' e deveria dar uma linha como essa:

$ ~/nginx -V
nginx version: nginx/1.4.1
built by gcc 4.4.5 (Debian 4.4.5-8) 
TLS SNI support enabled
....

se o seu nginx é sensível ao SNI, então o seu navegador / SO pode ser o problema; Windows XP não é capaz de usar SNI - ciente. O SNI é um recurso do openssl, você precisa ter pelo menos 0.9.8f à mão

se o SNI for um problema para você: use um IP separado para cada host SSL.

mais dicas de depuração:

  • use um access_log separado para cada servidor, por exemplo, access_log /var/log/nginx/special_host.access.log; para seu host sepcial
  • faça uma solicitação e verifique em qual servidor você está realmente operando; garantir para http e https você está no servidor certo
  • se isso for correto depurar dentro do server_part
por 27.09.2013 / 10:13