问题:
要部署多应用,使用nginx做负载均衡
解决办法:
机器A:192.168.31.107
机器B:192.168.31.108
机器C:192.168.31.105
其中A、B机器部署应用
C机器部署nginx进行负载均衡
机器A与B使用上一篇内容中的方法运行起来 各自通过:
http://192.168.31.107:8000/
http://192.168.31.108:8000/
可以正常访问
现在主要来部署C机器:
-
安装nginx
sudo apt install nginx
-
修改nginx配置文件
/etc/nginx/sites-enabled/default
:upstream demos { server 192.168.31.107:8000; server 192.168.31.108:8000; } server { listen 80; listen [::]:80; location / { proxy_pass http://demos; } }
在upstream demos这配置上两个应用服务器启用的地址
其中demos为设置的hostname,这样就导致,
你的两个应用服务器接收到的请求是来自 demos域名
因此需要修改应用服务器代码中settings.py中的ALLOWED_HOSTS
增加demos域名,增加后用supervisor重启应用服务。 -
重新加载nginx配置,并访问
sudo service nginx reload
访问地址:http://192.168.31.105/如果可以正常访问就说明配置好了负载均衡
这里的负载均衡是将请求依次分发给两个服务器的,这里也可以配置ip的hash值来分配:
upstream demos { ip_hash; server 192.168.31.107; server 192.168.31.108; }
也可以给不同IP配置不同权重:
upstream demos { server 192.168.31.107 weight=10; server 192.168.31.108 weight=20; }
这里如果不配置weight,默认是1
还有其它几种负载均衡,可以尝试
-
对nginx进行防DDos攻击
- 限制IP访问次数
upstream demos { server 192.168.31.107:8000; server 192.168.31.108:8000; } server { listen 80; listen [::]:80; limit_req zone=one burst=5 nodelay; location / { proxy_pass http://demos; } } limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;
$binary_remote_addr: 为二进制远程地址
zone=one: 定义zone名称
10m: 分给此zone10M的内存,用来存储二进制远程地址,1M内存可以存储16000会话
rate=10r/s: 限制每秒10个请求
burst=5: 为允许超过限制数+5个请求(只有当之前的几秒内不足10个请求时,把剩下的名额给了接下来的几秒)
nodelay: 就是不延迟处理,直接返回503 - 限制并发数
upstream demos { server 192.168.31.107:8000; server 192.168.31.108:8000; } server { listen 80; listen [::]:80; limit_req zone=one burst=5 nodelay; limit_conn addr 1; location / { proxy_pass http://demos; } } limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s; limit_conn_zone $binary_remote_addr zone=addr:10m;
- 限制IP访问次数
5、不停机部署应用
upstream demos {
server 192.168.31.107:8000;
server 192.168.31.108:8000;
}
现在我们应用需要升级,如果想应用服务不中断,那么,我们其实应该先在nginx的配置中down掉其中一台应用服务,这样所有访问都会去请求剩下的应用服务器
upstream demos {
server 192.168.31.107:8000 down;
server 192.168.31.108:8000;
}
在对应的server后面加上down,然后
sudo service nginx reload
就可以了
这里是用reload不是用restart,是因为nginx在实现reload的时候,
先启动一个新的进程完成新的配置检测等然后进入正常的工作状态
而原有的进程会将已经接收到的请求处理完,才会退出,
这样保证了服务的不间断
如果用restart,就变成了重启了,会导致服务中断,
如此,依次部署其它应用服务器