Назад | Перейти на главную страницу

Настройка пользовательских страниц ошибок для nginx с https и виртуальными хостами

У нас есть экземпляр 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.)

[ОБНОВЛЕНИЕ] После комментария Майкла Хэмптона ниже я добавил явное универсальное регулярное выражение во второй серверный блок, т.е.

    server_name ~^.*$;

Поведение все еще неправильное, но другое:

кстати, catch_all servername проходит мимо server_name _; , регулярное выражение не требуется

из вашего описания ошибки похоже, что используется неправильный сервер {} - но только в http, а не https.

у вас есть отдельный IP для каждого ssl-хоста или нет? если нет, знает ли ваш SNI nginx? вы бы проверили это с помощью `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: используйте отдельный IP-адрес для каждого SSL-хоста.

больше советов по отладке:

  • используйте отдельный журнал доступа для каждого сервера, например access_log /var/log/nginx/special_host.access.log; для вашего частного хозяина
  • сделайте запрос и проверьте, на каком сервере вы действительно работаете; убедитесь, что для http и https вы находитесь на правильном сервере
  • если это правильная отладка в server_part