Proxy inverso NGINX que redirige HTTPS a HTTP

Proxy inverso NGINX que redirige HTTPS a HTTP

Estoy configurando un proxy inverso con nginx y necesito que funcione de la siguiente manera:

estructura de proxy inverso

El cliente accederá a mi URL (cron.mocxmonitoramento.com.br) y caerá en mi proxy inverso. Con esto mi proxy debe dirigir la conexión a los servidores 1 o 2 o 3 según sea necesario. Dicha configuración funciona correctamente cuando realizamos el acceso HTTP, sin embargo cuando se realiza la conexión HTTPS la redirección no funciona correctamente.

Los servidores 1, 2 y 3 ejecutan una aplicación Laravel 7. Todos los servidores tienen nginx instalado y configurado.

Aquí están las configuraciones de los servidores 1, 2 y 3. (Son idénticos):

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;
}
}

Aquí están las configuraciones de Reverse Proxy:

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;
    }
}

Como puedes ver, en el archivo de configuración de nginx de los servidores 1, 2 y 3 escuchan solo el puerto 80 y no tienen certificado SSL. El proxy inverso, por otro lado, escucha tanto el puerto 80 como el puerto 443 y tiene el certificado instalado normalmente (yo uso certbot).

El acceso a través del puerto 80 funciona normalmente, sin embargo cuando accedo a https me aparece el siguiente error en el navegador:

Error del navegador: esta solicitud ha sido bloqueada; el contenido debe entregarse a través de HTTPS.

Es decir, el navegador realizó una conexión HTTPS, pero la aplicación laravel intenta recuperar datos a través de una conexión no segura (HTTP) y el navegador bloquea su carga. Hice varias búsquedas en Internet para encontrar una solución a este problema pero no pude encontrar nada que pudiera ayudarme. Me gustaría saber si alguien ya ha puesto algo en esta dirección que pueda ayudarme.

Mi instalación de nginx no es una instalación estándar, lo hice compilando el código nginx e instalando elMódulo adhesivo Nginxbiblioteca abierta.

Lo instalé de la siguiente manera:

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

Después de eso, hay algunas configuraciones básicas de archivos y directorios de nginx porque termina instalándose en /usr/local/nginx del sistema operativo ubuntu 20.04.

De todas formas me gustaría saber si a alguien le ha pasado esto y si podría ayudarme. Gracias a todos.

Respuesta1

Lo más probable es que necesites configurar la URL raíz de Laravel correctamente para tener la httpsURL allí.

información relacionada