У нас есть экземпляр 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;
для вашего частного хозяина