Nginx upstream 负载均衡配置

[toc]
## 问题:

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

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

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

- 设备资源占用正常

Nginx upstream 负载均衡配置_第1张图片

### 问题原因
通过查看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  |   |

你可能感兴趣的:(数据库,服务器,运维)