啊胡

V1

2022/09/21阅读:15主题:绿意

记一次Nginx使用过程中遇到的问题和解决方案

最近项目中使用到了Nginx作为反向代理的一些简单功能,但是还是遇到了很多的问题,特在此记录下来,方便后期复看。

https代理到http

场景

服务器只对外暴露https端口,客户端通过https访问到nginx服务器,nginx服务器将对应路径的请求转发到不同的后台处理程序。

解决方案

第一步:查看nginx原有的模块

nginx -V

第二步:切换到源码包重新编译,在原本显示的模块后加上--with-http_ssl_module参数

./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module

第三步:编译和安装

make & make install

第四步:修改nginx配置

server {
            listen 443 default ssl;
            server_name 127.0.0.1;
            ssl on;
            ssl_certificate  /etc/nginx/ssl/server.crt;
            ssl_certificate_key  /etc/nginx/ssl/server.key;
            gzip_static on;
            if ($request_method !~* GET|POST|OPTIONS) { return 444; }

            location  / {
                proxy_redirect off;
                proxy_pass http://127.0.0.1:8089;
            }
            location /report/downloadmode {
                proxy_pass http://127.0.0.1:8080;
                proxy_http_version 1.1;
         }
    }

第五步:重新加载配置文件

nginx -s reload

注意:配置完成后,客户端就只能通过https://IP访问页面了,除了/report/downloadmode请求转发到http://127.0.0.1:8080,其他所有的请求转发到http://127.0.0.1:8089

转发特殊的请求头

场景

通过nginx方向代理后,发送到后台程序的请求头可能会丢失或者被修改,特别是websocket的请求是http请求升级而来,具有一个特殊的Upgrade请求头。

解决方案

在nginx转发的时候,对于后台程序需要的请求头和一些特殊的请求头可以一并进行设置

第一步:修改nginx配置

server {
            listen 443 default ssl;
            server_name 127.0.0.1;
            ssl on;
            ssl_certificate  /etc/nginx/ssl/server.crt;
            ssl_certificate_key  /etc/nginx/ssl/server.key;
            gzip_static on;
            if ($request_method !~* GET|POST|OPTIONS) { return 444; }

            location  / {
                proxy_redirect off;
                proxy_pass http://127.0.0.1:8089;
                client_max_body_size    100m;
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header Referer $http_referer;
                proxy_set_header REMOTE-HOST $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            }
            location /report/downloadmode {
                proxy_pass http://127.0.0.1:8080;
                proxy_http_version 1.1;
         }
           location /webSocketServer {
                proxy_pass http://127.0.0.1:8080;
                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection "upgrade";
         }
   }

第二步:重新加载配置文件

nginx -s reload

注意:配置完成后,一些后台的需要的请求头就会被转发到http://127.0.0.1:8089,此外/websocketServer的websocket请求也会将特殊的请求头Upgrade转发到http://127.0.0.1:8080,表明这个请求是一个websocket的请求。

特殊的文件上传请求

场景

文件上传时一直报错:413 Request Entity Too Large,同时发现使用nginx代理后无法获得文件真实的上传进度。

解决方案

1.nginx限制客户端上传文件的属性是client_max_body_size,默认值为1m,可以修改为程序需要的值,如果设置为0,则表示不进行限制。

2.nginx存在缓存机制,客户端通过nginx代理上传文件时,实际上是先将文件全部缓存到Nginx后,再一次性转发到后台,因此后台获取到的文件上传进度实际上是nginx转发到后台的进度。因此,如果想要获取到客户端上传文件到后台的进度,就要取消nginx的缓存,可以通过proxy_request_buffering属性来设置。

第一步:修改nginx配置

server {
            listen 443 default ssl;
            server_name 127.0.0.1;
            ssl on;
            ssl_certificate  /etc/nginx/ssl/server.crt;
            ssl_certificate_key  /etc/nginx/ssl/server.key;
            gzip_static on;
            if ($request_method !~* GET|POST|OPTIONS) { return 444; }

            location  / {
                proxy_redirect off;
                proxy_pass http://127.0.0.1:8089;
                client_max_body_size    100m;
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header Referer $http_referer;
                proxy_set_header REMOTE-HOST $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            }
            location /report/downloadmode {
                proxy_pass http://127.0.0.1:8080;
                proxy_http_version 1.1;
         }
           location /webSocketServer {
                proxy_pass http://127.0.0.1:8080;
                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection "upgrade";
         }
         location /sys/upload {
                proxy_pass http://127.0.0.1:8080;
                proxy_http_version 1.1;
                client_max_body_size 500m;
                proxy_request_buffering off;
         }
   }

第二步:重新加载配置文件

nginx -s reload

注意:配置完成后,对于路径为/sys/upload的文件上传请求,上传的文件最大限制为500m,同时取消了nginx的缓存,当Nginx接收到文件数据时便开始转发到后台。

http强制转换为https

场景

允许用户使用http协议通过80端口访问,但是要使用Nginx代理将请求转化为https协议。

##解决方案 开放nginx的http协议的80端口。http转换为https有两种方式:第一种:将来自于80端口的所有请求转发到443端口;第二种:将请求路径重写,例如用户访问http://192.168.10.222 重写为https://192.168.10.222。

第一种配置如下:

server {
        listen       80;
     return 307 https://$host$request_uri;
}

第二种配置如下:

server {
        listen       80;
        rewrite ^(.*) https://$host$1 permanent;
}

分类:

后端

标签:

后端

作者介绍

啊胡
V1