nginx http proxy接收响应过程(一)

这篇博客深入探讨了nginx在接收到上游服务器响应,特别是响应body时的处理过程。讲解了nginx如何通过异步事件驱动模型,处理读事件,包括读取数据、异常处理、数据过滤等步骤,并预告了对后续复杂逻辑的分析。

        本篇博客主要阐述nginx如何从上游服务器接收响应的过程,响应包括响应header和响应body,在这里我们比较关注响应body的接收过程。

        因为nginx采用了全异步事件驱动模型,从上游服务器接收数据和向下游服务器发送数据也都是等待os通知相关socket fd上有事件发生后方可进行。我们这里不关心os如何通知nginx worker进程,只关心worker进程收到上游服务器的可读事件通知后如何处理。

        做法说起来应该很简单,nginx worker进程收到通知会调用事先注册的处理例程,在该处理例程中无非就是做这么几件事:1. 从socket fd上读数据,当然在读数据之前我们得准备好缓冲区,还得非常仔细地处理读出错的各种异常情况;2. 读完的数据可能得做些后续处理,如要不要对数据做些过滤啊什么的;3. 后续还有很多复杂的逻辑处理,我们这列举了这么两点。后面我们会通过nginx的处理来分析其内部如何高效地完成数据接收、暂存的功能。

       首先,我们从头说起,说说那个nginx与上游服务器的连接fd有读事件被触发的原始函数:ngx_http_upstream_process_upstream()。另外我们需要特别强调一点,为了实现读超时(即一定时间内还没有等到os对该连接的读事件),另外一个地方也可能会调用该函数,即该连接超时(为该读事件创建一个定时器放在红黑树上)时也会触发该函数,因此,在这个函数内必须还得判断到底是谁调用了它,如果是正常的读事件触发,那么后续需要从socket上读数据,如果真的是读超时触发的,那么就得进入错误处理逻辑了,让我们简单看看它的代码,揭开庐山真面目吧:

 /*  在ngx_http_upstream_send_response中被注册为与
  *  上游服务器的连接的读处理函数
  *  u->read_event_handler = ngx_http_upstream_proc
### Nginx 中 `proxy_pass` 超时设置 为了有效管理Nginx作为反向代理服务器时的行为,特别是处理上游服务器响应时间过长的情况,可以通过系列特定指令来调整超时行为。这些指令能够帮助优化用户体验并确保服务稳定运行。 #### 主要涉及的超时配置项 - **`proxy_connect_timeout`**: 定义了与后端服务器建立连前等待的时间长度。此值设定了尝试连到上游服务器的最大时限[^1]。 ```nginx proxy_connect_timeout 60s; ``` - **`proxy_read_timeout`**: 控制读取来自后端服务器的数据包之间允许的最大间隔时间。旦超过了设定的时间而未接收到任何数据,则认为操作失败[^2]。 ```nginx proxy_read_timeout 90s; ``` - **`proxy_send_timeout`**: 设定发送请求给后端服务器过程中两次写入动作之间的最长等待时间。如果在这个时间内未能完成下次写入,则终止该请求[^3]。 ```nginx proxy_send_timeout 90s; ``` 以上三个参数通常放置于HTTP上下文中或更具体的location块内,以便针对不同路径应用不同的策略: ```nginx http { ... server { listen 80; server_name www.a.com; location /api/ { proxy_pass http://192.168.243.129:8080/; proxy_set_header Host $host; # 设置超时选项 proxy_connect_timeout 60s; proxy_read_timeout 90s; proxy_send_timeout 90s; } } } ``` 通过合理配置上述参数,可以根据实际应用场景灵活控制Nginx与后端服务器间的通信效率和稳定性,从而更好地应对各种网络状况下的性能需求。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值