欢迎访问自建博客原文:
http://www.e-lionel.com/index.php/2020/04/10/187/
最近的问答项目中有需求,部署多套python service,由其他程序轮巡调用接口,因为调用过程中存在多线程调用,所以做了如下负载均衡配置。
首先配置upstream指定负载均衡器
upstream qa_ask{
server 192.168.1.100:15995;
server 192.168.1.100:15996;
server 192.168.1.100:15997;
server 192.168.1.100:15998;
server 192.168.1.100:15999;
}
upstream qa_ask_sec{
server 192.168.1.101:16009;
server 192.168.1.101:16010;
}
在这里指定两个均衡器分别命名为
qa_ask:用于主环境问答
qa_ask_sec:用于次要环境问答
在未指定负载均衡算法的的情况下,默认为轮巡,即按照时间顺序逐一分配到指定的后端服务器,如果其中有服务器宕机,则自动剔除,不影响用户的使用。
除此之外,还可以为没太服务器配置调度状态,常用的有以下几种:
1、down:表示当前服务器不参与负载均衡的调度。
2、backup:预留的备用服务器,当其他服务器故障或者繁忙的时候,会请求备用服务器,所以,这台服务器的访问压力最轻。
3、max_fails:允许请求的失败次数,默认为1,需要配合fail_timeout一起使用。
4、fail_timeout:当服务器连续失败次数为max_fails设置的最大值时,将服务器暂停的时间配置,默认是10s,在接下来配置的时间内,nginx不会将请求分发给这个失败的server
示例如下:
upstream qa_ask{
server 192.168.1.100:15995 down;
server 192.168.1.100:15996 weight=2;
server 192.168.1.100:15997 weight=3 max_fails=3 fail_timeout=20s;
server 192.168.1.100:15998 weight=4 max_fails=3 fail_timeout=20s;
server 192.168.1.100:15999 backup;
}
upstream qa_ask_sec{
server 192.168.1.101:16009; #默认weight=1
server 192.168.1.101:16010; #默认weight=1
}
本次项目中每个python service的处理能力相同,所以使用默认的算法就可以满足,并未做特殊配置。
配置好均衡器,开始配置server
server {
listen 80 ;
root /usr/share/nginx/html;
add_header Access-Control-Allow-Origin "*";
add_header Access-Control-Allow-Headers: Origin,X-Requested-With,Content-Type,Accept;
location /ask/ {
proxy_pass http://qa_ask/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location /asksec/ {
proxy_pass http://qa_ask_sec/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
使用location /ask/
配置路径
proxy_pass http://qa_ask/
指定均衡器
如上配置即访问/ask/
可以访问到qa_ask中配置的服务器
访问/asksec
可以访问到qa_ask_sec中配置的服务器
上述部分完整配置如下
upstream qa_ask{
server 192.168.1.100:15995;
server 192.168.1.100:15996;
server 192.168.1.100:15997;
server 192.168.1.100:15998;
server 192.168.1.100:15999;
}
upstream qa_ask_sec{
server 192.168.1.101:16009;
server 192.168.1.101:16010;
}
server {
listen 80 ;
root /usr/share/nginx/html;
add_header Access-Control-Allow-Origin "*";
add_header Access-Control-Allow-Headers: Origin,X-Requested-With,Content-Type,Accept;
location /ask/ {
proxy_pass http://qa_ask/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location /asksec/ {
proxy_pass http://qa_ask_sec/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
负载均衡有以下算法可以使用:
1、轮询(默认):上述配置使用的算法。
2、weight:指定轮询的权重,weight值越大,分配的几率就越高,当服务器性能不均衡时可以使用,将高性能服务器的权重配置的稍大些,从而提升整体性能。
3、ip_hash:按照访问的IP的哈希结果分配服务器,这样可以让同一个ip的房客访问到同一个后端服务器,可以有效的解决动态网页存在的session共享问题。
4、fair(第三方):需要Nginx的upstream_fair模块。按照页面大小和加载时长进行分配,响应时间短的优先分配。
5、url_hash(第三方):需要Nginx的hash软件包。按照访问URL的哈希来进行请求的分配,可以让相同的URL定向到相同的后端服务器,从而提高后端缓存服务器的效率。