Nginx upstream 负载均衡配置

文章描述了一次由于Nginx配置问题导致的业务中断事件,具体表现为NetworkError,频率为每分钟3次。问题源于Nginx无法找到存活的上游服务器(upstream)。经过分析,发现是由于后端服务响应时间过长,Nginx自动剔除节点,且Nginx配置中缺少keepalive设置以保持会话。采取的临时措施包括调整max_fails和fail_timeout,以及修改keepalive配置,但问题仍存在。根本解决方案是优化后端服务响应时间和Nginx配置,包括增加keepalive设置、调整日志级别和实现日志归档,以及考虑服务分离和数据库数据归档等策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

[toc]
## 问题:

自7/4 以来, 所有设备同时出现 Network Error, 导致业务无法正常进行, 频率 3次/每分钟;

## 现场情况及原因分析:
3楼: 8条产线
4楼: 20条产线
5楼: 5条产线
点数: 33条线 * 平均 (5台工位 + 1台电视看板 + 3台测试仪 + ) ≈ 300

- Nginx 日志占用: access 日志 100G 单个文件, error 日志 单个文件 76MB

- 设备资源占用正常

### 问题原因
通过查看Nginx 错误日志, 发现大量报错 no live upstreams while connecting to upstream

2023/07/06 11:28:43 [error] 42652#57660: *4922556 no live upstreams while connecting to upstream, client: xx, server: localhost, request: "OPTIONS /api/Axx HTTP/1.1", upstream: "http://myapp/api/xx", host: "xx", referrer: "xx"


upstream中没有可以提供服务的server ,即nginx已经发现不了存活的后端了,但是,我直接访问后端的server确是可以使用的,证明server端可用.
最后查找文档,发现问题出现在业务上要求保持会话,但是nginx到后端并没有保持会话,那么,nginx找不到后端可用服务,就会报no live upstream
参考文档:
https://nginx.org/en/docs/http/ngx_http_upstream_module.html


## 临时方法及验证

12:20 修改 max_fails=3 fail_timeout=60s
13:30 卡顿持续(每分钟3次左右, 报错网络错误)
14:13 修改  keepalive 配置
14:42  卡顿一次 (表现不同, 等待响应)
15:09  卡顿一次 (表现不同, 等待响应)
16:00  卡顿一次 (表现不同, 等待响应 )

## 根本原因分析

后端服务响应时间过长导致Nginx 自动剔除节点, 最终所有节点不可用直接拒绝连接;


## 改善建议
1. 修改Nginx 配置:
1.1 增加   keepalive 配置, 这个值并没有一个固定的值, 需要综合结合资源、服务使用情况来具体配置, 一般为节点数的2倍;
1.2 调整 access 日志级别;
1.3 日志增加归档功能;
2. 优化报工相关接口;
3. 看板服务分离;
4. 数据库数据归档;


## 扩展内容

upstream 参数

| #  | 参数名  |     作用                          |
| -- | -- | ------------ |
| 1  | server  | 配置 server 节点下的 location 节点中的 proxy_pass 反向代理  |
| 2 |  weight | 指定轮询几率(weight),weight 和访问比率成正比,用于后端服务器性能不均的情况  |
| 3  | ip_hash  | 每一个请求按訪问ip的hash结果分配(ip_hash)。这样每一个訪客固定訪问一个后端服务器,能够解决 session 的问题  |
| 4  | fair  |  按后端服务器的响应时间来分配请求(fair)。响应时间短的优先分配。与weight分配策略相似。 |
| 5  |   keepalive      |    长连接缓存池大小为32 |
| 6  |   keepalive_requests 2000 | 每条长连接最大复用请求数为2000  |
| 7 |  keepalive_time  |   |
| 8 |  keepalive_timeout  |   |

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值