Обратный прокси-сервер NGINX перенаправляет HTTPS на HTTP

Обратный прокси-сервер NGINX перенаправляет HTTPS на HTTP

Я настраиваю обратный прокси с помощью nginx и мне нужно, чтобы он работал следующим образом:

структура обратного прокси

Клиент получит доступ к моему URL (cron.mocxmonitoramento.com.br) и попадет на мой обратный прокси. При этом мой прокси должен направлять соединение на серверы 1 или 2 или 3 по мере необходимости. Такая конфигурация работает правильно, когда мы делаем HTTP-доступ, однако, когда делается HTTPS-соединение, перенаправление работает неправильно.

На серверах 1, 2 и 3 запущено приложение Laravel 7. На всех серверах установлен и настроен nginx.

Вот конфигурации серверов 1, 2 и 3. (Они идентичны):

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

server_name _;

access_log /home/ubuntu/mocxmonitoramento.com.br/logs/access.log;
error_log /home/ubuntu/mocxmonitoramento.com.br/logs/error.log;

root /home/ubuntu/mocxmonitoramento.com.br/public/public/;
index index.php;

location / {
   try_files $uri $uri/ /index.php?$args;
}

location ~ \.php$ {
    try_files $uri =404;
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass unix:/run/php/php7.4-fpm.sock;
    fastcgi_index index.php;
    include fastcgi_params;
}
}

Вот конфигурации обратного прокси-сервера:

upstream cron {
    server 10.0.1.30;
    server 10.0.1.31;
    server 10.0.1.32;
}
server {
    listen 443 ssl;

    server_name cron.mocxmonitoramento.com.br www.cron.mocxmonitoramento.com.br;

    ssl_certificate /etc/letsencrypt/live/cron.mocxmonitoramento.com.br/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/cron.mocxmonitoramento.com.br/privkey.pem;

    error_page 502 /502.html;
    location = /502.html {
            root /usr/local/nginx/html;
            internal;
    }

    location / {
            proxy_set_header   X-Forwarded-For $remote_addr;
            proxy_pass http://cron;
            proxy_redirect default;
            proxy_redirect / $scheme://$http_host/xcharge/;

            proxy_set_header Host $http_host;
            proxy_set_header X-Forwarded-For $remote_addr;
    }

    location = /xcharge {
            return 301 $scheme://$http_host$uri/$is_args$args;
    }
}
server {
    listen 80;

    server_name cron.mocxmonitoramento.com.br www.cron.mocxmonitoramento.com.br;

    error_page 502 /502.html;
    location = /502.html {
            root /usr/local/nginx/html;
            internal;
    }

    location / {
            proxy_set_header   X-Forwarded-For $remote_addr;
            proxy_pass http://cron;
            proxy_redirect default;
            proxy_redirect / $scheme://$http_host/xcharge/;

            proxy_set_header Host $http_host;
            proxy_set_header X-Forwarded-For $remote_addr;
    }

    location = /xcharge {
            return 301 $scheme://$http_host$uri/$is_args$args;
    }
}

Как вы можете видеть, в конфигурационном файле nginx серверов 1, 2 и 3 они слушают только порт 80 и не имеют SSL-сертификата. Обратный прокси, с другой стороны, слушает как порт 80, так и порт 443 и у него сертификат установлен нормально (я использую certbot).

Доступ через порт 80 работает нормально, однако при доступе по https в браузере появляется следующая ошибка:

Ошибка браузера: этот запрос заблокирован; контент должен быть передан по протоколу HTTPS.

То есть браузер установил HTTPS-соединение, но приложение laravel пытается получить данные по незащищенному соединению (HTTP), и браузер блокирует его загрузку. Я провел несколько поисков в интернете, чтобы найти решение этой проблемы, но не смог найти ничего, что помогло бы мне. Я хотел бы узнать, если кто-то уже что-то сделал в этом направлении, что могло бы мне помочь.

Моя установка nginx не является стандартной, я сделал это путем компиляции кода nginx и установкиМодуль Nginx Stickyоткрытая библиотека.

Я установил его следующим образом:

sudo apt-get update -y
sudo apt-get upgrade -y
sudo apt-get install libpcre3 libpcre3-dev -y
sudo apt install build-essential checkinstall zlib1g-dev -y

CertBot

sudo add-apt-repository ppa:certbot/certbot
sudo apt-get update
sudo apt-get install certbot -y
sudo ufw allow 80
sudo certbot certonly --standalone --preferred-challenges http -d {URL}
sudo certbot renew --dry-run

Github do modulo Styck
https://github.com/Refinitiv/nginx-sticky-module-ng
git clone https://github.com/Refinitiv/nginx-sticky-module-ng.git
wget https://www.openssl.org/source/openssl-1.1.1k.tar.gz
tar -xf openssl-1.1.1k.tar.gz

Instalando nginx com o modulo styck
Acesse e procure a versão do Nginx 1.22.1.
http://nginx.org/en/download.html
wget http://nginx.org/download/nginx-1.22.1.tar.gz
tar -xvzf nginx-1.22.1.tar.gz
cd nginx-1.22.1
./configure --with-http_ssl_module --add-module=/home/ubuntu/nginx-sticky-module-ng --with-openssl=/home/ubuntu/openssl-1.1.1k
make
sudo make install

После этого следует выполнить некоторые базовые настройки файлов и каталогов nginx, поскольку в конечном итоге он устанавливается в /usr/local/nginx ОС Ubuntu 20.04.

В любом случае, я хотел бы узнать, прошел ли кто-нибудь через это и может ли он мне помочь. Спасибо всем.

решение1

Скорее всего, вам нужно правильно настроить корневой URL Laravel, чтобы httpsURL там был.

Связанный контент