【nginx】配置proxy_pass之后,响应变慢的问题

背景

netstub项目中,使用openresty作为网关,proxy_pass处理。配置如下, access.lua中进行一些预处理,然后代理到目标服务

    ...    

    location / {
        access_by_lua_file /etc/nginx/conf.d/access.lua; 
        resolver 8.8.8.8;
        proxy_pass http://$http_host;
        proxy_buffering off;
    }

    ...

问题

请求过程中发现,使用了nginx代理之后,请求变慢非常多,每个请求都将近1s。

本地启动netstub调试,直接请求http://httpbin.org/get?biz=test, 响应时间在200多ms

使用反向代理,请求http://127.0.0.1/get?biz=test, 响应时间达到了900多ms

 原因和解决方法

几经辗转发现是http协议版本导致的,代理之后走的是http 1.0。导致请求变慢。

在nginx配置文件中增加proxy 版本配置proxy_http_version  1.1; 指定为1.1版本即可

server {
    ...    

    proxy_http_version  1.1;

    location / {
        access_by_lua_file /etc/nginx/conf.d/access.lua; 
        resolver 8.8.8.8;
        proxy_pass http://$http_host;
        proxy_buffering off;
    }

    ...
}

### proxy_read_timeout 参数值过大的风险及影响 `proxy_read_timeout` 参数用于设置 Nginx 从后端服务器读取响应的超时时间。如果该参数值配置过大,可能会带来以下风险和影响: #### 1. 资源占用增加 当 `proxy_read_timeout` 值较大时,Nginx 将保持与后端服务器的连接更长时间[^1]。这可能导致在后端服务响应缓慢或无响应的情况下,Nginx 的工作线程被长时间占用,无法处理其他请求。这种资源占用增加可能最终导致 Nginx 的并发处理能力下降[^3]。 #### 2. 增加系统负载 如果后端服务出现问题(例如网络延迟、服务卡顿等),Nginx 将持续等待响应,直到超时时间到达。在此期间,Nginx 不断尝试维持连接,这会增加系统的 CPU 和内存使用率,从而可能导致整体性能下降。 #### 3. 影响用户体验 较大的 `proxy_read_timeout` 可能会让用户感知到页面加载时间变长。如果后端服务响应时间过长,Nginx 仍然会等待响应,而不是快速返回错误或超时信息给客户端。这种行为可能让用户感到网站响应速度慢,进而影响用户体验[^2]。 #### 4. 隐藏后端问题 当 `proxy_read_timeout` 设置过大时,可能会掩盖后端服务的潜在问题。例如,后端服务可能存在性能瓶颈或逻辑错误,但因为超时时间较长,这些问题可能不会立即显现。这可能导致运维人员难以及时发现并解决后端服务的问题[^1]。 #### 5. 网络异常处理延迟 在网络出现异常(如丢包、高延迟)时,较大的 `proxy_read_timeout` 会导致 Nginx 对这些异常的反应变慢。例如,如果后端服务因网络问题无法正常通信,Nginx 可能会花费较长时间才判定连接失败,并将错误信息返回给客户端[^2]。 ### 示例代码:合理配置 `proxy_read_timeout` 以下是一个合理的 `proxy_read_timeout` 配置示例,根据实际需求调整超时时间: ```nginx server { listen 80; server_name localhost; location / { proxy_pass http://backend; proxy_read_timeout 60s; # 根据后端服务的实际响应时间调整 proxy_connect_timeout 1s; proxy_send_timeout 30s; } } ``` #### 注意事项 - 在配置 `proxy_read_timeout` 时,应结合后端服务的实际响应时间进行调整。 - 如果后端服务的响应时间波动较大,可以适当增加超时时间,但不宜过大。 - 同时建议启用 `proxy_next_upstream` 参数,以便在后端服务不可用时快速切换到其他可用节点[^2]。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值