Nginx использует один и тот же порт для перенаправления HTTP на HTTPS.

Вопрос или проблема

Я создаю веб-приложение с использованием Docker и nginx в качестве обратного прокси. У меня есть проблема с пользовательским портом в Docker. Я хотел бы перенаправить пользователя, который использует HTTP:// вместо HTTPS://, используя только один порт.

Это похоже на http://app.aufy.pl:38000, пользователь должен быть перенаправлен на https://app.aufy.pl:38000, чтобы не получить ошибку HTTP 400.

Обычно люди используют порт 80 для перенаправления пользователя, но порт 80 уже выделен для другой службы, работающей вне Docker на том же поддомене.

Должен ли я освободить порт 80? Это единственный способ? Я уже пробовал с error_page 400, но это не сработало для меня.

Кстати, я не хочу обрабатывать HTTP и HTTPS на одном порту, а просто перенаправить весь трафик на HTTPS, когда пользователь использует порт 38000, так что HTTP не будет использоваться в любом случае (всегда перенаправляется). Или я могу добавить другой порт для обработки перенаправления HTTP, но это не может быть порт 80 вне Docker. На данный момент я получаю ошибку 400, когда пытаюсь использовать HTTP на этом порту. Он должен быть перенаправлен или каким-то образом изменен на HTTPS. Я не ограничен использованием 443 внутри контейнера Docker, это может быть также любой другой порт.

###DOCKER-COMPOSE

reverseproxy:
image: nginx:1.27.2
container_name: nginx_reverse_proxy
ports:
  - "38000:443"  # React i API
  - "33101:33101"  # phpMyAdmin 

###NGINX

server {
    listen 443;  # (Это docker 38000:443) Я хочу как-то перенаправить на HTTPS
    server_name app.aufy.pl;

    location / {
        return 301 https://$host$request_uri;  
    }
}

#HTTPS
server {
    listen 443 ssl; # (Это также docker 38000:443, но это SSL и HTTPS ссылка)
    server_name app.aufy.pl;

    ssl_certificate /etc/nginx/certs/cert.crt;  
    ssl_certificate_key /etc/nginx/certs/cert.key;  
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers 'HIGH:!aNULL:!MD5';  

    location / {
        proxy_pass http://frontend:3000; 
        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_cache_bypass $http_upgrade;
    }

}

Ответ или решение

Настройка Nginx для перенаправления HTTP на HTTPS на пользовательском порту в Docker

Введение

Ваша задача состоит в том, чтобы правильно перенаправлять трафик, направленный на ваш веб-приложение, с HTTP на HTTPS, при этом используя лишь один порт. В данной ситуации вы сталкиваетесь с ограничениями, так как стандартный порт 80 занят другим сервисом, а вы работаете с конфигурацией Nginx в контейнере Docker. В этом ответе мы рассмотрим, как правильно реализовать требуемое перенаправление, используя только порт 38000.

Основные моменты

  1. Подход к настройке Nginx:

    • В Nginx обычно стандартным методом для перенаправления с HTTP на HTTPS является использование порта 80. Однако, в вашем случае данное решение невозможно. Поскольку вы используете пользовательский порт (38000), вы можете настроить только HTTP-соединение для перенаправления на HTTPS.
  2. Ошибки конфигурации:

    • Если вы получаете ошибку 400 при попытке доступа через HTTP, это может быть связано с тем, что Nginx не может обрабатывать соответствующие запросы на данном порту без корректной настройки.

Возможное решение

Для решения этой проблемы, вы можете создать отдельный конфигурационный блок для перенаправления трафика на порт 38000. Обратите внимание, что перенаправление будет осуществляться в рамках одного контейнера. Попробуйте следующую конфигурацию:

# HTTP блок
server {
    listen 38000;  # Слушаем HTTP на порту 38000
    server_name app.aufy.pl;

    location / {
        return 301 https://$host$request_uri;  
    }
}

# HTTPS блок
server {
    listen 443 ssl;  # Слушаем HTTPS на порту 443 (внутри контейнера)
    server_name app.aufy.pl;

    ssl_certificate /etc/nginx/certs/cert.crt;  
    ssl_certificate_key /etc/nginx/certs/cert.key;  
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers 'HIGH:!aNULL:!MD5';  

    location / {
        proxy_pass http://frontend:3000; 
        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_cache_bypass $http_upgrade;
    }
}

Объяснение конфигурации

  • HTTP-блок: В этом блоке мы настраиваем прослушивание на порту 38000. Все входящие запросы обрабатываются и автоматически перенаправляются на соответствующий HTTPS-URL.
  • HTTPS-блок: Этот блок обрабатывает запросы, пришедшие по безопасному соединению (SSL) на стандартный порт 443. Здесь вы также указываете путь к сертификатам SSL для обеспечения безопасности.

Заключение

Данная конфигурация позволит использовать только порт 38000 для HTTP и перенаправлять пользователей на HTTPS. Правильная настройка Nginx обеспечит безопасный доступ к вашему веб-приложению, избегая ошибок 400. Вы можете протестировать данное решение, развернув контейнер с обновленной конфигурацией Nginx.

Если у вас будут возникать проблемы, убедитесь, что ваше Docker окружение настроено должным образом, и проверьте логи Nginx для более подробной информации о неверных настройках.

Оцените материал
Добавить комментарий

Капча загружается...