samodum
@samodum
Какой вопрос - такой и ответ

Как настроить HTTPS на Nginx-балансировщике?

Всем привет!
Помогите настроить конфиг для Nginx-балансировщика.
Структура у меня такая: есть основной сервер (IIS) с IP-адресом xxx.xxx.xxx.xxx с небольшой нагрузкой, на нём установлены все необходимые сертификаты. И есть ещё дополнительные серверы (NodeJs) yyy.yyy.yyy.yyy и zzz.zzz.zzz.zzz, отрабатывающие некую backend-логику.
Запросы между ними распределяет nginx-балансировщик.
Проблема в том, что сайт, расположенный на ip-адресе xxx.xxx.xxx.xxx не открывается по httpS://domain.name
Но зато он открывается по https://xxx.xxx.xxx.xxx (ругается, конечно, на то, что сертификат не соответстует доменному имени, но это в данном случае нормально).
Очевидно, что проблема в конфиге nginx, вот её я не могу победить.
Помогите настроить.

Вот полный конфиг файла /etc/nginx/sites-available/default :

server {
        listen 80 default_server;
        listen [::]:80 default_server;

        # SSL configuration
        #
        listen 443 ssl;# default_server;
#        listen [::]:443 ssl default_server;

        server_name my_site.com;

        #/etc/letsencrypt/live/my_site.com/
        ssl_certificate            /etc/letsencrypt/live/my_site.com/fullchain.pem;
        ssl_certificate_key        /etc/letsencrypt/live/my_site.com/privkey.pem;
        ssl_trusted_certificate    /etc/letsencrypt/live/my_site.com/chain.pem;

        proxy_ssl_certificate /etc/letsencrypt/live/my_site.com/fullchain.pem;
        proxy_ssl_certificate_key  /etc/letsencrypt/live/my_site.com/privkey.pem;
        proxy_ssl_trusted_certificate /etc/letsencrypt/live/my_site.com/chain.pem;

        proxy_ssl_verify        on;
        proxy_ssl_verify_depth  2;
        proxy_ssl_session_reuse on;

        location ~ upload|put|get$ {
                proxy_pass http://backend;
        }

        location / {
                proxy_set_header HOST $host;
                proxy_set_header X-Forwarded-Proto $scheme;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

                proxy_pass https://static_server;
                proxy_ssl_server_name on;
        }

}


upstream backend {
        server yyy.yyy.yyy.yyy;
        server zzz.zzz.zzz.zzz;
}

upstream static_server {
        server xxx.xxx.xxx.xxx;
}


в логах error.log такая ошибка:
*3 SSL_do_handshake() failed (SSL: error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol) while SSL handshaking to upstream, client: iii.iii.iii.iii, server: _, $2

До этого на http всё балансировалось правильно.
  • Вопрос задан
  • 2456 просмотров
Решения вопроса 1
samodum
@samodum Автор вопроса
Какой вопрос - такой и ответ
Победил 502-ю, и затем и 404-ю ошибки. Рабочий конфиг для работы nginx-балансировщика по HTPPS с сервером статики и API-бэкендом такой:

server {
        listen 80 default_server;
        listen [::]:80 default_server;

        # SSL configuration
        listen 443 ssl;# default_server;
        listen [::]:443 ssl;# default_server;

        server_name my_site.com www.my_site.com;

        ssl_certificate            /etc/letsencrypt/live/my_site.com/fullchain.pem;
        ssl_certificate_key        /etc/letsencrypt/live/my_site.com/privkey.pem;
        ssl_trusted_certificate    /etc/letsencrypt/live/my_site.com/chain.pem;

        proxy_ssl_certificate /etc/letsencrypt/live/my_site.com/fullchain.pem;
        proxy_ssl_certificate_key  /etc/letsencrypt/live/my_site.com/privkey.pem;
        proxy_ssl_trusted_certificate /etc/letsencrypt/live/my_site.com/chain.pem;

        proxy_ssl_verify        on;
        proxy_ssl_session_reuse off;

        ssl_verify_client off;
        ssl_protocols        SSLv3 TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers RC4:HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers on;

        location ~ api|put|get$ {
                proxy_pass http://backend;
        }

        location ~ \.well-known {
                default_type "text/plain";
                try_files $uri $uri/ =404;
        }

        location / {
                proxy_http_version 1.0;
                proxy_set_header   Connection "";

                proxy_set_header HOST $host;
                proxy_set_header X-Forwarded-Proto $scheme;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

                proxy_buffering off;
                proxy_pass http://static_server;
        }
}

upstream backend {
        server yyy.yyy.yyy.yyy;
        server zzz.zzz.zzz.zzz;
        #other servers
}

upstream static_server {
        server xxx.xxx.xxx.xxx;
        #other servers
}


Может быть, что кому-то пригодится такое решение
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы