Nginx 反向代理到node,在高并发时会报502错误

rossroma
  • 188

用户请求域名时,会先进入NGINX,NGINX配置了https,并反向代理到node容器,node端起了一个web服务,一是静态资源访问,二是将所有接口请求代理到后端。
在高并发时,会抛出502异常,NGINX错误日志如下:

2019/11/21 20:10:59 [error] 25#0: *56438 recv() failed (104: Connection reset by peer) while reading response header from upstream, c
lient: 100.104.16.138, server: localhost, request: "POST /pro/v1/mobile/index/board/init HTTP/1.1", upstream: "http://106.11.208.192:
80/pro/v1/mobile/index/board/init", host: "testdingtalkapi3.xbongbong.com"
2019/11/21 20:11:05 [error] 25#0: *83639 recv() failed (104: Connection reset by peer) while reading response header from upstream, c
lient: 100.104.16.183, server: localhost, request: "POST /pro/v1/mobile/process/node/task/index/todoList HTTP/1.1", upstream: "http:/
/106.11.208.193:80/pro/v1/mobile/process/node/task/index/todoList", host: "testdingtalkapi3.xbongbong.com"

网上搜索这个错误信息,答案都是关于PHP的,要修改php.ini的超时时间。如果是nodejs,也是因为超时的原因吗?nodejs的超时配置要在哪里修改?

回复
阅读 3k
2 个回答

建议排查和完善步骤
1:node 服务自身是否因为异常或其它原因多次自动重启,如果有请检查优化代码

2:检查nginx 配置的超时时间,通常设置的是 65s,如果不知从哪里拷贝或者前人的配置成几秒,那可以改,特别是当有较大文件上传和下载时,参考配置项(时间单位是秒,具体意义参考nginx 官方文档):

    proxy_connect_timeout      60;
    proxy_send_timeout         60;
    proxy_read_timeout         60;
    proxy_buffer_size          4k;
    proxy_buffers              4 32k;
    proxy_busy_buffers_size    64k;
    proxy_temp_file_write_size 64k;
    

3:开启 nginx 的请求日志,特别要包含服务响应时间,nginx 的日志格式参考:
access_log /var/logs/nginx/your_service.access.log main;
log_format main '$remote_addr [$time_local] "$request" $body_bytes_sent $request_length "$http_x_forwarded_for" $request_time $status';
很多人会在node内部记录请求日志和响应时间,有一定的参考意义,但如果是node服务进程本身卡死比如资源和连接耗尽或者宕机,node自身记录的日志是不准确或丢失的。

4:分析上一步记录的nginx日志的 $request_time 字段,如果出现文中所述报错时前几分钟内对应request_time 字段逐渐增大甚至达到60s(正常的请求应该控制在100ms 内),也就是需要优化node服务本身了,因为它的负载不行,优化方式多种多样,例如增加服务进程(集群),分层分解服务,优化查询和各种磁盘网络IO,程序本身优化的就太多了,网上搜吧

5:如上一步各方面都良好,那么检查nginx 服务和系统配置,比如nginx 本身是否限制了连接数,文件描述符数,参考配置:
worker_processes 4;
worker_rlimit_nofile 65535
linux系统默认配置通常能满足要求,查看相关限制 ulimit -a 修改配置

6:检查服务器资源和硬件状况,排除其它服务耗尽资源,相关命令有 top 、free 、 vmstat 、netstat...
最后再检查服务器本身,比如是否是虚拟机,同主机上是否有其它虚拟机占据资源太多导致本机资源不足,最后联系服务器硬件维护人员检查磁盘,网卡,网络,笔者就排查问题最终追溯到磁盘坏道和磁盘读写缓慢的硬件问题,如使用云服务,云服务提供商在这方面通常会比较全面,不要用户操心

最后,good luck!

node 将所有接口请求代理到后端 中间的http请求可以设置timeout
koa express也都有中间件可以处理 npm搜一下

另外 nginx 可以直接处理静态文件且比node优秀 为何不直接返回静态资源 api

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏