一、系统环境
操作系统:windows Server 2016
Nginx版本:nginx/1.25.4.1
后端应用服务器:Apache Tomcat 9.0.54
二、问题描述
我们使用nginx配置了SSL和代理,对外通过HTTPS提供访问。在实际使用中发现转发后访问起来系统却非常卡顿(响应慢),绕开nginx测试直接访问tomcat内部端口,一切非常丝滑。通常情况下,使用nginx反向代理后的服务访问速度应该和源地址访问速度基本无差距的,这时候就应该考虑是配置上哪里出了出问题。
通过postman各种测试和对比,最后发现是http协议版本导致的,代理之后走的是http 1.0会导致请求变慢。
三、解决办法
在nginx配置文件中增加proxy 版本配置proxy_http_version 1.1; 指定为1.1版本即可。
修改前(有问题时的配置)
server {
listen 8000;
server_name localhost;
client_max_body_size 100m;
proxy_http_version 1.1;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# To resolve nginx 504 issue
proxy_connect_timeout 1800s;
proxy_send_timeout 1800s;
proxy_read_timeout 1800s;
client_body_timeout 1800s;
# 这里是后端系统地址
location /ReTool {
proxy_pass http://127.0.0.1:8099;
}
}
四、更多知识
如果nginx地址配置了localhost,但是在操作系统的host文件中没有配置映射【127.0.0.1】也会导致卡顿问题。
nginx先试着访问localhost,访问不成功(超时)之后才会访问127.0.0.1,这是nginx的转发机制决定的,卡顿的点就在于中间那一段超时等待的时间段,这样虽然是能够访问,但是响应太慢甚至失败,严重影响用户体验。
因此建议 配置nginx转发的时候要格外注意不要使用localhost而是使用域名或具体ip代替。