
啊胡
2022/09/21阅读:45主题:绿意
记一次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;
}
作者介绍
