相关概念
Nginx (engine x) 是一个高性能的HTTP和反向代理服务,IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,第一个公开版本0.1.0发布于2004年10月4日。Nginx是一款轻量级的web 服务器/反向代理服务器(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等
nginx支持的负载均衡调度算法方式:
-
weight轮询(默认):接收到的请求按照顺序逐一分配到不同的后端服务器,即使在使用过程中,某一台后端服务器宕机,nginx会自动将该服务器剔除出队列,请求受理情况不会受到任何影响。 这种方式下,可以给不同的后端服务器设置一个权重值(weight),用于调整不同的服务器上请求的分配率;权重数据越大,被分配到请求的几率越大;该权重值,主要是针对实际工作环境中不同的后端服务器硬件配置进行调整的。
-
ip_hash:每个请求按照发起客户端的ip的hash结果进行匹配,这样的算法下一个固定ip地址的客户端总会访问到同一个后端服务器,这也在一定程度上解决了集群部署环境下session共享的问题。
-
fair:智能调整调度算法,动态的根据后端服务器的请求处理到响应的时间进行均衡分配,响应时间短处理效率高的服务器分配到请求的概率高,响应时间长处理效率低的服务器分配到的请求少;结合了前两者的优点的一种调度算法。但是需要注意的是nginx默认不支持fair算法,如果要使用这种调度算法,请安装upstream_fair模块
-
url_hash:按照访问的url的hash结果分配请求,每个请求的url会指向后端固定的某个服务器,可以在nginx作为静态服务器的情况下提高缓存效率。同样要注意nginx默认不支持这种调度算法,要使用的话需要安装nginx的hash软件包
nginx部署
1.在官网下载压缩包,解压
2.更改一些配置
[root@server1 nginx-1.14.0]# ls
auto CHANGES CHANGES.ru conf configure contrib html LICENSE man README src
[root@server1 nginx-1.14.0]# cd src/core/
[root@server1 core]# ls
nginx.c ngx_crc.h ngx_md5.c ngx_proxy_protocol.c ngx_sha1.h
nginx.h ngx_crypt.c ngx_md5.h ngx_proxy_protocol.h ngx_shmtx.c
ngx_array.c ngx_crypt.h ngx_module.c ngx_queue.c ngx_shmtx.h
ngx_array.h ngx_cycle.c ngx_module.h ngx_queue.h
[root@server1 core]# vim nginx.h #删除掉14行最后的NGINX_VERSION ,这样可以不对外显示你的版本号
[root@server1 ~]# cd nginx-1.14.0/auto/cc/
[root@server1 cc]# ls
acc bcc ccc clang conf gcc icc msvc name owc sunc
[root@server1 cc]# vim gcc #将172行 CFLAGS="$CFLAGS -g"注释掉
3.源码编译和安装
yum install gcc -y
yum install -y pcre-devel
yum install -y openssl-devel
./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_stub_status_module --with-threads --with-file-aio
make && make install
命令操作:
nginx -t 检查语法
nginx 打开nginx
nginx -s stop 关闭nginx
nginx -s reload 重新加载nginx
useradd -M -d /usr/local/nginx/ nginx 添加一个nginx用户
id nginx 查看用户nginx的id
添加文件:
nginx的默认发布目录:/usr/local/nginx/html
vim test.html
测试:
cd /usr/local/nginx/conf/ ##切换到这个目录
lscpu ##查看主机的cpu数
vim /etc/security/limits.conf
写入:
nginx - nofile 65536
vim nginx.conf 编辑nginx主配置文件
测试:
1.正常的轮询(默认)
2.添加ip_hash后的效果(添加这条语句后,一旦监测到ip,后端服务器将不再改变)
3.加上权重后的效果
4.添加backup
只有当其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。只要在希望成为后备的服务器ip后面多添加一个backup参数,这台服务器就会成为备份服务器。在平时不使用,nginx不会给它转发任何请求。只有当其他节点全部无法连接的时候,nginx才会启用这个节点。一旦有可用的节点恢复服务,该节点则不再使用,又进入后备状态。
vim/etc/httpd/conf/httpd.conf
/etc/init.d/httpd start
测试:
5.添加back
在调度器中直接将server3down掉,即使server3的http服务开启,客户端也无法访问(不常使用)
测试:
在使用负载均衡的时候会遇到会话保持的问题,常用的方法有:
1.ip hash,根据客户端的IP,将请求分配到不同的服务器上;
2.cookie,服务器给客户端下发一个cookie,具有特定cookie的请求会分配给它的发布者
注意:cookie需要浏览器支持,且有时候会泄露数据
Sticky工作原理:
Sticky是nginx的一个模块,它是基于cookie的一种nginx的负载均衡解决方案,通过分发和识别cookie,来使同一个客户端的请求落在同一台服务器上,默认标识名为route
1.客户端首次发起访问请求,nginx接收后,发现请求头没有cookie,则以轮询方式将请求分发给后端服务器。
2.后端服务器处理完请求,将响应数据返回给nginx。
3.此时nginx生成带route的cookie,返回给客户端。route的值与后端服务器对应,可能是明文,也可能是md5、sha1等Hash值
4.客户端接收请求,并保存带route的cookie。
5.当客户端下一次发送请求时,会带上route,nginx根据接收到的cookie中的route值,转发给对应的后端服务器。
重新编译nginx增加nginx-sticky-module模块
[root@server1 ~]# ls
nginx-sticky-module-ng.tar.gz
nginx-1.10.1.tar.gz
[root@server1 ~]# tar zxf nginx-1.10.1.tar.gz
[root@server1 ~]# tar zxf nginx-sticky-module-ng.tar.gz
[root@server1 ~]# ls
nginx-1.14.0
nginx-sticky-module-ng
[root@server1 ~]# cd nginx-1.10.1
[root@server1 nginx-1.10.1]# ls
[root@server1 nginx-1.10.1]# ./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_stub_status_module --with-threads --with-file-aio --add-module=/root/nginx-sticky-module-ng
[root@server1 nginx-1.10.1]# make
[root@server1 nginx-1.10.1]# make install
[root@server1 nginx-1.10.1]# pwd
/root/nginx-1.10.1
vim nginx.conf
nginx -t
nginx -s reload
在浏览器测试:只有server2进行响应,不会产生轮询。在浏览器中按F12,可查看cookie。
Nginx实现高可用
实验环境:
Server1:h1,172.25.66.1
Server4:h2,172.25.66.4
Server1和server4上都安装ricci,为其设置密码,并开启服务
在server1:
/etc/init.d/ricci start
/etc/init.d/luci start
scp -r /usr/local/nginx/ server4:/usr/local/
在server4中:
/etc/init.d/ricci start
ln -s /usr/local/nginx/sbin/nginx /sbin/ ###做软链接
useradd -M -d /usr/local/nginx/ nginx ###建立一个nginx用户
id nginx ##查看用户是否建立
nginx
在物理机上:
vim /etc/hosts
在浏览器访问:https://server1:8084,luci自动开启8084端口接受集群节点的11111端口的数据包
使用server1的root密码登陆
nginx本身没有启动脚本的,所以要自己制作nginx脚本
Vim /etc/init.d/nginx
chmod a+x /etc/init.d/nginx
/etc/init.d/nginx start
将添加的资源放在一个资源组里:
在server1中查看