Proxy reverso NGINX redirecionando HTTPS para HTTP

Proxy reverso NGINX redirecionando HTTPS para HTTP

Estou configurando um proxy reverso com nginx e preciso que funcione da seguinte maneira:

estrutura de proxy reverso

O cliente irá acessar minha url (cron.mocxmonitoramento.com.br) e ela cairá no meu proxy reverso. Com isso meu proxy deverá direcionar a conexão para os servidores 1 ou 2 ou 3 conforme necessidade. Tal configuração funciona corretamente quando fazemos o acesso HTTP, porém quando é feita a conexão HTTPS o redirecionamento não funciona corretamente.

Os servidores 1, 2 e 3 executam uma aplicação Laravel 7. Todos os servidores possuem nginx instalado e configurado.

Aqui estão as configurações dos servidores 1, 2 e 3. (Eles são 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;
}
}

Aqui estão as configurações do proxy reverso:

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 você pode ver, no arquivo de configuração nginx dos servidores 1, 2 e 3 eles escutam apenas a porta 80 e não possuem certificado SSL. Já o Proxy Reverso escuta tanto a porta 80 quanto a porta 443 e tem o certificado instalado normalmente (eu uso o certbot).

O acesso pela porta 80 funciona normalmente, porém quando acesso https recebo o seguinte erro no navegador:

erro do navegador: esta solicitação foi bloqueada; o conteúdo deve ser veiculado por HTTPS.

Ou seja, o navegador fez uma conexão HTTPS, mas a aplicação laravel está tentando buscar dados através de uma conexão não segura (HTTP) e o navegador bloqueia seu carregamento. Fiz várias pesquisas na internet para encontrar uma solução para esse problema, mas não consegui encontrar nada que pudesse me ajudar. Gostaria de saber se alguém já colocou algo nesse sentido que possa me ajudar.

Minha instalação do nginx não é uma instalação padrão, fiz isso compilando o código nginx e instalando oMódulo pegajoso Nginxabra a biblioteca.

Eu instalei da seguinte forma:

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

Depois disso, existem algumas configurações básicas de arquivos e diretórios do nginx pois ele acaba sendo instalado em /usr/local/nginx do SO ubuntu 20.04

Enfim, gostaria de saber se alguém já passou por isso e se poderia me ajudar. Obrigado a todos.

Responder1

Provavelmente você precisará definir o URL raiz do Laravel corretamente para ter o httpsURL lá.

informação relacionada