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

如您所见,在服务器 1、2 和 3 的 nginx 配置文件中,它们仅监听端口 80,并且没有 SSL 证书。另一方面,反向代理监听端口 80 和端口 443,并且证书安装正常(我使用 certbot)。

通过80端口访问可以正常进行,但是当我访问https时,浏览器中出现以下错误:

浏览器错误:此请求已被阻止;内容必须通过 HTTPS 提供。

也就是说,浏览器建立了 HTTPS 连接,但 laravel 应用程序尝试通过非安全连接 (HTTP) 获取数据,浏览器阻止其加载。我在互联网上搜索了几次以找到解决此问题的方法,但找不到任何可以帮助我的东西。我想知道是否有人已经在这方面提出了一些可以帮助我的东西。

我的 nginx 安装不是标准安装,我是通过编译 nginx 代码并安装Nginx 粘性模块打开库。

我的安装方式如下:

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 文件和目录的基本配置,因为它最终安装在 OS ubuntu 20.04 的 /usr/local/nginx 中

无论如何,我想知道是否有人经历过这种情况,以及他们是否可以帮助我。谢谢大家。

答案1

最有可能的是,您需要正确设置 Laravel 根 URL 才能https在那里获得该 URL。

相关内容