1.Nginx作为负载均衡的优点
1工作在网络的7层之上,可以针对http应用做一些分流的策略,比如针对域名、目录结构,它的正则规则比HAProxy更为强大
和灵活,这也是它目前广泛流行的主要原因之一,Nginx单凭这点可利用的场合就远多于LVS了。
2、Nginx对网络稳定性的依赖非常小,理论上能ping通就能负载功能,这个也是它的优势之一;相反LVS对网络稳定性依赖比较大。
3、可以承担高负载压力且稳定,在硬件不差的情况下一般能支撑几万次的并发量,负载度比LVS相对小些。
4、Nginx可以通过端口检测到服务器内部的故障,比如根据服务器处理网页返回的状态码、超时等等,并且会把返回错误的请求
重新提交到另一个节点,不过其中缺点就是不支持url来检测。比如用户正在上传一个文件,而处理该上传的节点刚好在上传
过程中出现故障,Nginx会把上传切到另一台服务器重新处理,而LVS就直接断掉了,如果是上传一个很大的文件或者很重要的
文件的话,用户可能会因此而不满。
2.Nginx的缺点:
1、Nginx仅能支持http、https和Email协议,这样就在适用范围上面小些,这个是它的缺点。
2、对后端服务器的健康检查,只支持通过端口来检测,不支持通过url来检测。不支持Session的直接保持,但能通过ip_hash来解决。
3.Nginx负载均衡原理:
nginx是以反向代理的方式进行负载均衡的,其实现的分配策略被编进Nginx内核的有轮询、ip_hash、第三方的有fair、url_hash等。
4.重新配置一个全新的虚拟机子盘:
[root@foundation38 images]# qemu-img create -f qcow2 -b base.qcow2 test5
Formatting 'test5', fmt=qcow2 size=21474836480 backing_file='base.qcow2' encryption=off cluster_size=65536 lazy_refcounts=off
5.在新的虚拟机安装scp命令:
[root@server5 ~]# yum provides */scp 寻找scp的安装包
Loaded plugins: product-id, subscription-manager
This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register.
rhel-source | 3.9 kB 00:00
rhel-source/filelists_db | 3.8 MB 00:00
openssh-clients-5.3p1-94.el6.x86_64 : An open source SSH client applications
Repo : rhel-source
Matched from:
Filename : /usr/bin/scp
[root@server5 ~]# yum install openssh-clients-5.3p1-94.el6.x86_64 安装软件
6.进行负载均衡实验的配置:
server5作为nginx端,配置IP为172.25.38.6
server2和server3作为后端服务器
server2的IP:172.25.38.3
server3的IP:172.25.38.4
7.nginx的安装:
[root@server5 ~]# ls
anaconda-ks.cfg install.log install.log.syslog nginx-1.14.0.tar.gz
[root@server5 ~]# tar zxf nginx-1.14.0.tar.gz 解压tar包
[root@server5 ~]# ls
anaconda-ks.cfg install.log.syslog nginx-1.14.0.tar.gz
install.log nginx-1.14.0
[root@server5 ~]# cd nginx-1.14.0 进入解压目录
[root@server5 nginx-1.14.0]# ls
auto CHANGES.ru configure html man src
CHANGES conf contrib LICENSE README
[root@server5 nginx-1.14.0]# src/
-bash: src/: is a directory
[root@server5 nginx-1.14.0]# cd src/
[root@server5 src]# ls
core event http mail misc os stream
[root@server5 src]# cd core/ 进入指定目录
[root@server5 core]# ls
[root@server5 core]# vim nginx.h 编辑配置文件
[root@server5 core]# cd ..
[root@server5 src]# cd ..
[root@server5 nginx-1.14.0]# ls
auto CHANGES.ru configure html man src
CHANGES conf contrib LICENSE README
[root@server5 nginx-1.14.0]# cd auto/
[root@server5 auto]# ls
cc feature headers install module options stubs types
define have include lib modules os summary unix
endianness have_headers init make nohave sources threads
[root@server5 auto]# cd cc/
[root@server5 cc]# ls
acc bcc ccc clang conf gcc icc msvc name owc sunc
[root@server5 cc]# vim gcc 编辑gcc文件
[root@server5 cc]# cd ..
[root@server5 auto]# cd ..
[root@server5 nginx-1.14.0]# ls
auto CHANGES.ru configure html man src
CHANGES conf contrib LICENSE README
[root@server5 nginx-1.14.0]# yum install gcc openssl-devel -y 直接安装一些依赖性
[root@server5 nginx-1.14.0]# yum install pcre-devel -y
源码编译三步:
第一步生成makefile
第二步读取文件生成的二进制文件
第三步开始安装
[root@server5 nginx-1.14.0]# ./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_stub_status_module --with-threads --with-file-aio
[root@server5 nginx-1.14.0]# make
[root@server5 nginx-1.14.0]# make install
制作软链接:
[root@server5 nginx-1.14.0]# cd /usr/local/nginx/
[root@server5 nginx]# ls
conf html logs sbin
[root@server5 nginx]# du -sh
980K .
[root@server5 nginx]# cd sbin/
[root@server5 sbin]# pwd
/usr/local/nginx/sbin
[root@server5 sbin]# ls
nginx
[root@server5 sbin]# pwd
/usr/local/nginx/sbin
[root@server5 sbin]# ln -s /usr/local/nginx/sbin/nginx /sbin/ 制作软连接
nginx的基本语法:
[root@server5 sbin]# nginx -t 检测语法
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@server5 sbin]# nginx
[root@server5 sbin]# nginx -s stop 关闭服务
[root@server5 sbin]# nginx 打开服务
[root@server5 sbin]# nginx -s reload 重载服务
[root@server5 sbin]# cd /usr/local/nginx/html/ 进去默认访问目录
[root@server5 html]# ls
50x.html index.html
[root@server5 html]# vim test.html 编辑默认访问文件
在网页访问:
Nginx的简单部署及配置:
[root@server5 ~]# pwd
/root
[root@server5 ~]# ls
anaconda-ks.cfg install.log.syslog nginx-1.14.0.tar.gz
install.log nginx-1.14.0
[root@server5 ~]# pwd
/root
[root@server5 ~]# ls
anaconda-ks.cfg install.log.syslog nginx-1.14.0.tar.gz
install.log nginx-1.14.0
[root@server5 ~]# rm -fr install.log* anaconda-ks.cfg
[root@server5 ~]# ls
nginx-1.14.0 nginx-1.14.0.tar.gz
[root@server5 ~]# cd /usr/local/nginx/
[root@server5 nginx]# ls
client_body_temp fastcgi_temp logs sbin uwsgi_temp
conf html proxy_temp scgi_temp
[root@server5 nginx]# pwd
/usr/local/nginx
[root@server5 nginx]# cd conf/
[root@server5 conf]# pwd
/usr/local/nginx/conf
[root@server5 conf]# vim nginx.conf添加自动策略
当不知道调用几个CPU或者当前CPU个数未知的时候添加自动策略
[root@server5 conf]# nginx -s reload 重新读入
[root@server5 conf]# sysctl -a|grep file 查看最大文件数目
fs.file-nr = 480 0 47356
fs.file-max = 47356
[root@server5 conf]# lscpu 查看CPU个数为1个
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 1 一个CPU
[root@server5 conf]# vim nginx.conf 在配置文件添加一个CPU
[root@server5 conf]# nginx -s reload 重载服务
[root@server5 conf]# vim nginx.conf 最大文件数小于查看的文件
[root@server5 conf]# nginx -s reload 重载服务
[root@server5 conf]# vim /etc/security/limits.conf
limits.conf文件实际是Linux PAM(插入式认证模块,Pluggable Authentication Modules)中 pam_limits.so 的配置文件,
突破系统的默认限制,对系统访问资源有一定保护作用。 limits.conf 和sysctl.conf区别在于limits.conf是针对用户,而sysctl.conf
是针对整个系统参数配置。
[root@server5 conf]# vim nginx.conf 编辑配置文件写入nginx用户和组
[root@server5 conf]# useradd -M -d /usr/local/nginx/ nginx建立用户默认组也为nginx
[root@server5 conf]# id nginx 查看nginx用户
uid=500(nginx) gid=500(nginx) groups=500(nginx)
[root@server5 conf]# nginx -s reload 重载服务
负载均衡配置(轮询):
[root@server5 conf]# vim nginx.conf 编辑主配置文件
[root@server5 conf]# nginx -t 检查语法
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@server5 conf]# nginx -s reload 重载服务
在真机进行测试可以正常轮询:
[root@foundation38 images]# curl www.westos.org
www.westos.org
[root@foundation38 images]# curl www.westos.org
bbs.westos.org
[root@foundation38 images]# curl www.westos.org
www.westos.org
[root@foundation38 images]# curl www.westos.org
bbs.westos.org
在真机添加解析:
[root@foundation38 kiosk]# vim /etc/hosts
在网页测试进行论询:
负载均衡策略:
1、IP绑定ip_hash,每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。 当使用该策略时,不使用weight,backup。
ip_hash策略:
[root@server5 conf]# vim nginx.conf 写入IP_hash算法意味着只有一个后端坏了之后会访问另外一个
[root@server5 conf]# nginx -s reload
在真机进行测试:
[root@foundation38 kiosk]# for i in range{1..10}; do curl www.westos.org; done;
www.westos.org
www.westos.org
www.westos.org
www.westos.org
www.westos.org
www.westos.org
www.westos.org
www.westos.org
www.westos.org
www.westos.org
weight策略即指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的 情况:
[root@server5 conf]# vim nginx.conf 加入权重
[root@server5 conf]# nginx -s reload
在真机进行测试:
[root@foundation38 kiosk]# for i in range{1..10}; do curl www.westos.org; done;
www.westos.org
bbs.westos.org
www.westos.org
www.westos.org
bbs.westos.org
www.westos.org
www.westos.org
bbs.westos.org
www.westos.org
www.westos.org
weigth策略的缺点:
上述方式存在一个问题就是说,在负载均衡系统中,假如用户
在某台服务器上登录了,那么该用户第二次请求的时候,因为
我们是负载均衡系统,每次请求都会重新定位到服务器集群中
的某一个,那么已经登录某一个服务器的用户再重新定位到
另一个服务器,其登录信息将会丢失,这样显然是不妥的。
加入本机的策略,到后端服务器全部DOWN掉之后访问本机:
[root@server5 conf]# vim nginx.conf
[root@server5 conf]# nginx -s reload
将server2和server3的阿帕奇停止后会访问本机:
[root@foundation38 kiosk]# curl www.westos.org
<html>
<head><title>502 Bad Gateway</title></head>
<body bgcolor="white">
<center><h1>502 Bad Gateway</h1></center>
<hr><center>nginx/</center>
</body>
</html>
在nginx中添加模块,1.14.0版本不支持所以下载1.10.1版本:
[root@server5 ~]# tar zxf nginx-1.10.1.tar.gz 解压
[root@server5 ~]# ls
nginx-1.10.1 nginx-1.14.0 nginx-sticky-module-ng.tar.gz
nginx-1.10.1.tar.gz nginx-1.14.0.tar.gz
[root@server5 ~]# cd nginx-1.10.1
[root@server5 nginx-1.10.1]# ls
auto CHANGES.ru configure html man src
CHANGES conf contrib LICENSE README
[root@server5 nginx-1.10.1]# cd
[root@server5 ~]# tar nginx-sticky-module-ng.tar.gz
tar: Old option `g' requires an argument.
Try `tar --help' or `tar --usage' for more information.
[root@server5 ~]# ls
nginx-1.10.1 nginx-1.14.0 nginx-sticky-module-ng.tar.gz
nginx-1.10.1.tar.gz nginx-1.14.0.tar.gz
[root@server5 ~]# tar zxf nginx-sticky-module-ng.tar.gz 解压模块包
[root@server5 ~]# ls
nginx-1.10.1 nginx-1.14.0 nginx-sticky-module-ng
nginx-1.10.1.tar.gz nginx-1.14.0.tar.gz nginx-sticky-module-ng.tar.gz
进行源码编译三部曲:
[root@server5 ~]# cd nginx-1.10.1 进入解压的文件路径
[root@server5 nginx-1.10.1]# ./configure --prefix=/opt/nginx --with-http_ssl_module --with-http_stub_status_module --with-threads --with-file-aio --add-module=/root/nginx-sticky-module-ng
更改路径是因为之前装了一个版本不进行更改会覆盖原来的,然后添加模块
[root@server5 nginx-1.10.1]# make
[root@server5 nginx-1.10.1]# make install
编译完成进行简单配置:
[root@server5 nginx-1.10.1]# cd conf
[root@server5 conf]# ls
fastcgi.conf koi-utf mime.types scgi_params win-utf
fastcgi_params koi-win nginx.conf uwsgi_params
[root@server5 conf]# pwd
/root/nginx-1.10.1/conf
[root@server5 conf]# ls
fastcgi.conf koi-utf mime.types scgi_params win-utf
fastcgi_params koi-win nginx.conf uwsgi_params
[root@server5 conf]# pwd
/root/nginx-1.10.1/conf
[root@server5 conf]# cd /opt/nginx/
[root@server5 nginx]# ls
conf html logs sbin
[root@server5 nginx]# cd conf/
[root@server5 conf]# ls
fastcgi.conf koi-win scgi_params
fastcgi.conf.default mime.types scgi_params.default
fastcgi_params mime.types.default uwsgi_params
fastcgi_params.default nginx.conf uwsgi_params.default
koi-utf nginx.conf.default win-utf
[root@server5 conf]# pwd
/opt/nginx/conf
Sticky模块的工作原理:
Sticky工作原理 Sticky是nginx的一个模块,通过分发和识别
cookie,来使同一个客户端的请求落在同一台服务器上。sticky
的处理过程如下(假设cookie名称为route):
1.客户端首次发起请求,请求头未带route的cookie。nginx接收请求,
发现请求头没有route,则以轮询方式将请求分配给后端服务器。
2.后端服务器处理完请求,将响应头和内容返回给nginx。
3.nginx生成route的cookie,返回给客户端。route的值与
后端服务器对应,可能是明文,也可能是md5、sha1等Hash值。
4.客户端接收请求,并创建route的cookie。
5.客户端再次发送请求时,带上route。
6.nginx接收到route,直接转给对应的后端服务器
sticky策略的配置:
[root@server5 conf]# cp /usr/local/nginx/conf/nginx.conf .
cp: overwrite `./nginx.conf'? y
[root@server5 conf]# vim nginx.conf 编写配置文件写入sticky策略
[root@server5 conf]# which nginx 查看nginx的路径
/sbin/nginx
[root@server5 conf]# ll /sbin/nginx
lrwxrwxrwx 1 root root 27 Jul 31 15:31 /sbin/nginx -> /usr/local/nginx/sbin/nginx
[root@server5 conf]# /opt/nginx/sbin/nginx -t 用绝对路径调用防止冲突
nginx: the configuration file /opt/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /opt/nginx/conf/nginx.conf test is successful
[root@server5 conf]# /opt/nginx/sbin/nginx 打开新版本
[root@server5 conf]# /opt/nginx/sbin/nginx -s stop 将新版本关闭
[root@server5 conf]# cd /usr/local/nginx/ 进入之前版本演示模块不支持的原因
[root@server5 nginx]# ls
client_body_temp fastcgi_temp logs sbin uwsgi_temp
conf html proxy_temp scgi_temp
[root@server5 nginx]# cd conf/
[root@server5 conf]# vim nginx.conf 添加sticky策略
[root@server5 conf]# /usr/local/nginx/sbin/nginx -t 检查语法的时候会报错
nginx: [emerg] unknown directive "sticky" in /usr/local/nginx/conf/nginx.conf:22
nginx: configuration file /usr/local/nginx/conf/nginx.conf test failed
[root@server5 conf]# /opt/nginx/sbin/nginx 调用新的版本打开策略,这个策略是基于浏览器的,在真机测试效果不正确
在网页测试按F12打开测试页面:
总结:
在多台后台服务器的环境下,我们为了确保一个客户只和一台服务器通信
,我们势必使用长连接。使用什么方式来实现这种连接呢,常见的有使用
nginx自带的ip_hash来做,我想这绝对不是一个好的办法,如果前端
是CDN,或者说一个局域网的客户同时访问服务器,导致出现服务器分配
不均衡,以及不能保证每次访问都粘滞在同一台服务器。如果基于cookie
会是一种什么情形,想想看,每台电脑都会有不同的cookie,在保持长连接
的同时还保证了服务器的压力均衡,nginxsticky值得推荐