Задать вопрос
@Kreatifchk
Программист любитель, 25 лет, предпочитаю java

Почему Nginx в режиме обратного прокси соединяется по https вместо http?

В nginx для одного из хостов имеется такая конфигурация:
server {
	listen 443 ssl;
	server_name siteb.ru;
	ssl_certificate     "C:/Users/user/Nginx/x509/cert.pem";
       ssl_certificate_key "C:/Users/user/Nginx/x509/key.pem";
       ssl_protocols       TLSv1.2 TLSv1.3;

    access_log  logs/siteb_access.log;
    error_log   logs/siteb_error.log;
	
	location / {
		proxy_pass http://192.168.1.115:8084;
		
		proxy_http_version 1.1;
		proxy_set_header Upgrade $http_upgrade;
		proxy_set_header Connection "upgrade";
		
		proxy_set_header Host $host;
		proxy_set_header X-Real-IP $remote_addr;
		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
		proxy_set_header X-Forwarded-Proto $scheme;
		
		proxy_buffering off;
	}
}

То есть, к обратному прокси пользователь должен подсоединиться по http , а прокси уже должен стучаться на внутренний ресурс по http. Однако судя по логам, прокси пытается обращаться по https. Вот такие там логи:
2026/08/03 23:21:32 [error] 14304#13672: *132 peer closed connection in SSL handshake while SSL handshaking to upstream, client: 192.168.1.1, server: siteb.ru, request: "GET /v1/10/619/319 HTTP/1.1", upstream: "https://192.168.1.115:8084/v1/10/619/319", host: "siteb.ru"

По логам, он как-будто пытается обратиться по https. Поэтому я получаю ошибку 502. Если убрать с прокси https , то подключается нормально. Почему такое может быть?
  • Вопрос задан
  • 123 просмотра
Подписаться 1 Средний 4 комментария
Помогут разобраться в теме Все курсы
  • REBRAIN
    LEPP Stack
    2 месяца
    Далее
  • Яндекс Практикум
    SRE — обеспечение надёжности систем
    4 месяца
    Далее
  • Академия Эдюсон
    DevOps-инженер + ИИ
    7 месяцев
    Далее
Решения вопроса 1
opium
@opium
Просто люблю качественно работать
«peer closed connection in SSL handshake while SSL handshaking to upstream» — это nginx сам полез в TLS к апстриму, а так он делает, только когда в proxy_pass схема https. Значит отработал не тот конфиг, который ты показал. Гони nginx -T, он печатает весь действующий конфиг со всеми include: ищи второй proxy_pass со схемой https — запрос-то на /v1/..., под такой префикс запросто найдётся отдельный location, который выигрывает у location /. Если в выводе чисто, то файл ты поправил, а процесс крутится со старым конфигом — reload или рестарт. И до кучи: «пользователь должен подсоединиться по http» — нет, у тебя listen 443 ssl, клиент идёт по https, со схемой к апстриму это никак не связано. proxy_redirect, который тут насоветовали, вообще мимо: он правит Location/Refresh в ответах, на протокол коннекта к апстриму не влияет.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@Drno
а твой 192.168.1.155:8004 - точно слушает http ?

тогда -
spoiler

Решение
Добавьте эту директиву в блок location /:

nginx

proxy_redirect http:// http://;
proxy_redirect https:// http://;
Или более агрессивный вариант:

nginx

proxy_redirect off;
Полный исправленный блок:

nginx

location / {
proxy_pass 192.168.1.115:8084;

proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";

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

proxy_redirect http:// http://;
proxy_redirect https:// http://;
proxy_buffering off;
}
Это скажет Nginx'у не переписывать редиректы от upstream сервера обратно в HTTPS, и оставлять их как HTTP для внутреннего соединения.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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