说明
最初是因为租用算力机(Python 全栈系列242 踩坑记录:租用算力机完成任务),所以想着做一个负载均衡,然后多开一些服务,把配置写在nginx里面就好了。
一开始租用了一个3080起了一个服务,后来觉得速度不够快,再起了3个4090,每个4090起3个服务。然后,觉得速度够了就把3080那台机器退了。再之后调用的时候,发现服务不太稳定,之前是猜测可能共享带宽导致连接不稳。然后今天发现,可能是nginx没搞对…
内容
1 概述
最初我认为负载均衡默认就带了健康检测的功能,nginx应该可以识别那些反向代理的服务器,那些有问题,然后避开它。实际上1.19版是没有的,没有这个模块时,负载均衡总是一视同仁的去调用那些已经挂掉的服务。只要有一个服务挂了,整个体验就是卡卡的。
简单来说,就是要装一个check_module插件。传统办法好像要自己下载,然后重新编译啥的,看起来就很麻烦。然后我就想取个巧,但发现这个还要碰运气。
└─ $ docker search nginx_upstream_check_module
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
[不行]yuxhuang/alpine-libressl-luajit-nginx Alpine NGINX with HTTP2 support, with libres… 3 [OK]
[不行]joshm1/nginx Nginx 1.9.4 with the nginx_upstream_check_mo… 1
[可以]mrlioncub/nginx_upstream_check_module Nginx compiled with Health checks upstreams … 0
oxnme/openresty openresty with nginx_upstream_check_module 0
johnwu/nginx Nginx-1.10.3 with luaJIT nginx_upstream_chec… 0 [OK]
chromerobv/nginx nginx compiled with nginx_upstream_check_mod… 0 [OK]
shiurn/nginx nginx-1.20+nginx_upstream_check_module+nginx… 0
congcong126/nginx-check add nginx_upstream_check_module 0
sola97/nginx nginx-http3 with nginx_upstream_check_module… 0
hejtao/nginx-hc health check; nginx_upstream_check_module; … 0
测试命令
docker run -it \--rm \--name=entapi_realtime_api \-v /etc/localtime:/etc/localtime \-v /etc/timezone:/etc/timezone\-v /etc/hostname:/etc/hostname\-e "LANG=C.UTF-8" \-p 34103:34103\-v /home/nginx_confs/realent_34103_nginx.conf:/etc/nginx/nginx.conf \mrlioncub/nginx_upstream_check_module
启动后,nginx会发现某个服务失效了
然后在调用过程中,nginx一方面响应请求,一方面继续对服务进行健康检查,所以虽然服务报错了,但并不影响请求的调用。
2 配置文件
整个配置非常简单,主要就是check interval=3000 rise=2 fall=5 timeout=1000
。
events {#设置工作模式为epoll,除此之外还有select,poll,kqueue,rtsig和/dev/poll模式use epoll;#定义每个进程的最大连接数,受系统进程的最大打开文件数量限制worker_connections 1024;
}http{# 配置nginx上传文件最大限制client_max_body_size 50000m;upstream multi_ent {# fair;server 183.252.181.66:10000;server XXX:10000 ;server XXX:10001 ;# 健康检查配置check interval=3000 rise=2 fall=5 timeout=1000;}server {listen 34103;location / {proxy_pass http://multi_ent;# proxy_next_upstream error timeout invalid_header http_502 http_504 http_404;}}}
3 配置更新
3.1 重载配置
容器名 nginx_34103_entapi_realtime_api
检查配置
docker exec nginx_34103_entapi_realtime_api nginx -t重载配置
docker exec nginx_34103_entapi_realtime_api nginx -s reload
3.2 重启容器
还是需要重启容器
docker restart nginx_34103_entapi_realtime_api
查看日志
docker logs nginx_34103_entapi_realtime_api --tail=100