平时访问量也不大,隔一段时间会挂掉,需要重启
用nginx做负载均衡处理这个事情,因为这么处理不仅上手快,而且效率高,同时nginx可以把挂掉的服务剔除掉,下面就是整个处理过程。
首先安装nginx,部署多套项目
确保每套项目可以独立运行
配置nginx负载均衡
nginx.conf
然后访问80端口,这个时候8081和8082端口的内容会交替出现,不过8082出现的频率会高很多。
下面是重要参数解析
upstream myapp1 {
#ip_hash;
server 127.0.0.1:8081 weight=1 max_fails=2 fail_timeout=10s;
server 127.0.0.1:8082 weight=10 max_fails=2 fail_timeout=10s;
}
upstream myapp1:代表需要负载的服务,1或n都可以
weight:访问权重,数字越大,权重越高,访问频率越高
max_fails:最大失败次数,需要和下面的参数配合使用
fail_timeout:失败服务检测间隔,白话文就是在这个时间内某个服务的失败次数达到max_fails,nginx就会剔除该服务,在该段时间内,不再访问该服务,直到下一个周期开始,重新探测服务是否可用,nginx的探测是在服务访问的时候,实时探测
server {
listen 80;
location / {
proxy_pass http://myapp1;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_connect_timeout 10;
proxy_read_timeout 10;
proxy_send_timeout 10;
}
}
这段配置的含义是80端口跳转到myapp1对应的服务
proxy_connect_timeout:代理连接超时时间
proxy_read_timeout:读取超时时间
proxy_send_timeout:发送超时时间
这些配置,默认都有,但是在实际使用中,最好进行调整。
比如某个服务挂掉,但是proxy_connect_timeout这个时间设置过长,那么nginx会等待这个服务设置的时间,直到失败,才会跳转到别的服务去请求,这样对于用户是相当不友好,所以这个时间不宜设置过大,一般10秒钟差不多。
正常访问43ms:
如果访问到挂掉的服务就会等待10s,这个时候nginx知道失败,访问另一个服务。所以说每次请求都会有返回,不过是时间长短的问题
nginx默认负载方式是轮询,可以通过weight指定轮训权重
除此之外还有ip_hash,按照IP分配到某个服务;least_conn,按照最少连接方式分配,哪个服务的连接少,就优先分配给哪个服务;
这些设置看具体场景指定即可
负载至少需要三台以上服务器(或者三个以上访问端口,如果一台机器上开三个不同的端口,访问压力还是在一台服务器上达不到负载的目的,测试可以开三个端口。) 使用三台centos7机器,每台都装上nginx 192.168.198.229(前置负载) 192.168.198.221(web1) 192.168.198.222(web2) 将域名(www.fz.com)指向前置机(192.168.198.229) web机器不一定要装nginx也可以使用其他服务器软件,如Apache,Node.js等。
Nginx负载配置
nginx负载实现主要在前置负载机中配置反向代理到其他机器。
- 每台服务器可以单独访问,并修改主页显示内容为改机器ip尾号(为了方便测试) 前置机负载机:229
将域名www.fz.com指向192.168.198.229机器并可以使用域名访问
web1:221
web2:222
2.修改前置机conf
在http内加入以下代码(大致36行)
upstream www.fz.com{
server 192.168.198.221;
server 192.168.198.222;
}
server{
listen 80;
server_name www.fz.com;
location / {
proxy_pass http://www.fz.com;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
重启nginx
/www/lnmp/nginx/sbin/nginx -s reload #重新载入配置文件
/www/lnmp/nginx/sbin/nginx -s reopen #重新启动nginx
访问http://www.fz.com
刷新页面
这个时候发现已经实现了负载。其实要布置多个项目到web机上还需要配置web机上的conf
3、负载比重
1、轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
2、weight
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
例如:
upstream www.fz.com{
server 192.168.198.221 weight=1; #访问比例为1/6
server 192.168.198.222 weight=5; #访问比例为5/6
}
3、ip_hash
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
例如:
upstream www.fz.com{
ip_hash;
server 192.168.198.221;
server 192.168.198.222;
}
1.down 表示单前的server暂时不参与负载 2.weight 默认为1.weight越大,负载的权重就越大。 3.max_fails :允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream 模块定义的错误 4.fail_timeout:max_fails次失败后,暂停的时间。 5.backup: 其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。 nginx支持同时设置多组的负载均衡,用来给不用的server来使用 client_body_in_file_only 设置为On 可以讲client post过来的数据记录到文件中用来做debug client_body_temp_path 设置记录文件的目录 可以设置最多3层目录 location 对URL进行匹配.可以进行重定向或者进行新的代理 负载均衡