鄙人最近在研究Nginx的负载均衡,遇到不少坑,最后成功完成负载均衡,在这里分享下:
简述:
现有设备:
VMWARE配了3台服务器
server6:192.168.0.106
server7:192.168.0.105
server9:192.168.0.103
目标:server6,server7安装Tomcat服务器,server9安装tengine负载server6,server7两台服务器。
1.下载
2.安装
2.1解压缩
2.2编译安装
cd /usr/local
tar zxvf tengine-2.2.0.tar.gz
cd tengine-2.2.0
./configure --prefix=/usr/local/tengine
(运行时可能会报./configure: error: the HTTP rewrite module requires the PCRE library.的错误,可执行下面两条语句:
yum -y install pcre-devel
yum -y install openssl openssl-devel
再./configure --prefix=/usr/local/tengine
)
make && make install
至此安装完成。
2.3开启服务
修改/etc/init.d/nginx文件
vi /etc/init.d/nginx
修改内容:
nginx="/usr/local/tengine/sbin/nginx"
NGINX_CONF_FILE="/usr/local/tengine/conf/nginx.conf"
2.4启动服务
修改可执行权限
chmod 777 nginx
service nginx start
重启命令:service nginx reload
(注意nginx大小写,之前用Nginx一直启动不了,后来才发现2了。如果启动不成功,有可能是防火墙问题,关闭防火墙:service iptables stop)
3.使用
虚拟主机&虚拟目录
回到自己window系统,修改hosts
进入:C:\Windows\System32\drivers\etc
修改hosts,在最后添加:
192.168.0.103test.qq.com
注:192.168.0.103是就是我们刚刚配Nginx的server9的地址,test.qq.com是入口网址
然后在浏览器输入:
test.qq.com
=>
恭喜,你的Nginx服务器配置成功!
负载均衡
现在我们将两台服务器server6,server7负载到server9上
1.修改配置
vi /usr/local/apache-tomcat-7.0.61/conf/nginx.conf:
upstream tomcat {
server 192.168.0.106:8080;
server 192.168.0.105:8080;
check interval=3000 rise=2 fall=5 timeout=1000 type=http;
check_http_send "HEAD / HTTP/1.0\r\n\r\n";
check_http_expect_alive http_2xx http_3xx;
}
server {
server_name test.qq.com;
location / { proxy_passhttp://tomcat; }
location /status { check_status; }
}
说明:添加upstream 命名为tomcat,里面有两个sever,就是我们的server6,server7.
在下面server里的location /中括号里的内容我们改为proxy_passhttp://tomcat;意思就是将那两台服务器放到这台服务器上。
OK,此时我们reload一下Nginx服务器:
service nginx reload
2.启动tomcat
将Tomcat分别放在server6,server7服务器上,修改webapps/ROOT/index.jsp
server6里的index.jsp:
server6
<%=session.getId()%>
server7里的index.jsp:
server7
<%=session.getId()%>
ok,到../bin里启动一下Tomcat
再刷一下刚才的页面test.qq.com:
OK,此时我们看到server6,server7来回切换,证明Nginx集群成功。
但可以看到sessionID是经常变的,此时我们要做共享session操作。
共享session
第一:
Memcached
1、安装libevent
2、安装memcached
可以用yum方式安装
yum -y install –enablerepo=rpmforge memcached php-pecl-memcache
3、启动memcached
memcached -d -m 128 -u root -l 192.168.0.103 -p 11211 -c 256 -P /tmp/memcached.pid
参数解释:
-d:后台启动服务
-m:缓存大小
-p:端口
-l:IP
-P:服务器启动后的系统进程ID,存储的文件
-u:服务器启动是以哪个用户名作为管理用户
验证
memcached安装成功与否:
memcached-tool 192.168.0.103:11211
cat /tmp/memcached.pid
第二配置tomcat
Tomcat配置
拷贝jar
到tomcat的lib下,
每个tomcat里面的context.xml中加入
memcachedNodes="n1:192.168.0.103:11211"
sticky="false"
lockingMode="auto"
sessionBackupAsync="false"
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
sessionBackupTimeout="1000" transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
/>
说明:让memcache的节点memcachedNodes指向server9的地址:192.168.0.103
OK。重启server6server7两台服务器。
回到浏览器,输入
test.qq.com:
我们可以看到,无论服务器轮流切换,sessionID都保持不变,这样就做到了真正的负载均衡 。
调优点:
一:链接数问题:
配置文件:
nginx.conf:
cd /usr/local/tengine-2.2.0/conf
vi nginx.conf
1.worker_connections :连接数;
2.worker_processes:cpu核心数;
3.Nginx最大连接数 = 连接数(worker_connections)*cpu核心数(worker_processes);
4.Linux对外连接数:
cat /proc/sys/fs/file-max
97095
Nginx最大的并发量是5万到10万
当Linux对外连接数 > Nginx最大连接数 :
Nginx这台服务器的性能没有完全发挥
当Linux对外连接数 < Nginx最大连接数 :
Nginx最大连接数没有意义,对外连接数不会超过Linux服务器对外最大连接数
二:sendfile on:
如果sendfile off掉,就进入传统模式:
用户有个请求过来了,网卡接到请求了,内核也接响应,发现接听端口是被Nginx占用的,然后把请求发到Nginx上,Nginx开始读取磁盘文件,磁盘文件缓存到Nginx内存中的,再从内存文件推送到内核,内核再将文件推到网卡,网卡再发送到我们客户端。
如果sendfile打开,就进入0拷贝模式:
内核直接把文件读到内存中,通过网卡推到客户端,不过Nginx。
开启0拷贝是好还是不好?
对于一些小文件,少于1500K的文件,瞬间存储,不经过Nginx,
大于300M,直接推给客户,客户端承受不住,
1,例如日志文件,300M的文件推给客户,还没消化完,马上又有一个日志文件推出去,客户端承受不了。
2,网络扛不住。
三:轮询机制:
upstream按照轮询(默认)方式进行负载,每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能 自动剔除。虽然这种方式简便、成本低廉。但缺点是:可靠性低和负载分配不均衡。适用于图片服务器集群和纯静态页面服务器集群。
除此之外,upstream还有其它的分配策略,分别如下:
1.weight(权重)
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。如下所示,10.0.0.88的访问比率要比10.0.0.77的访问比率高一倍。
upstream linuxidc{
server 10.0.0.77 weight=5;
server 10.0.0.88 weight=10;
}
2.ip_hash(访问ip)
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
upstream favresin{
ip_hash;
server 10.0.0.10:8080;
server 10.0.0.11:8080;
}
3.fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。与weight分配策略类似。
upstream favresin{
server 10.0.0.10:8080;
server 10.0.0.11:8080;
fair;
}
4.url_hash(第三方)
按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。
注意:在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method是使用的hash算法。
upstream resinserver{
server 10.0.0.10:7777;
server 10.0.0.11:8888;
hash $request_uri;
hash_method crc32;
}
upstream还可以为每个设备设置状态值,这些状态值的含义分别如下:
down 表示单前的server暂时不参与负载.
weight 默认为1.weight越大,负载的权重就越大。
max_fails :允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream 模块定义的错误.
fail_timeout : max_fails次失败后,暂停的时间。
backup: 其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。
upstream bakend{ #定义负载均衡设备的Ip及设备状态
ip_hash;
server 10.0.0.11:9090 down;
server 10.0.0.11:8080 weight=2;
server 10.0.0.11:6060;
server 10.0.0.11:7070 backup;
}
题外:
健康检查:
在/usr/local/apache-tomcat-7.0.61/conf/nginx.conf文件里添加
location /status {
check_status;
}
service nginx reload 一下
浏览器输入:test.qq.com/status
页面就会检测两台服务器的运作情况。
Thanks For Watching~
作者:Michael孟良
链接:https://www.jianshu.com/p/9156a49a0966