Nginx实现负载均衡
实验环境:
server4:172.25.51.4(nginx服务器)
server5:172.25.51.5(apache服务器)
server6:172.25.51.6(apache服务器)
一、编译安装nginx
<1>下载并解压nginx-1.14.0.tar.gz
[root@server4 ~]# tar zxf nginx-1.14.0.tar.gz
<2>编译
[root@server4 nginx-1.14.0]# ./configure
[root@server4 nginx-1.14.0]# ./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_stub_status_module --with-threads --with-file-aio
知识详解:
./configure是源代码安装的第一步,主要的作用是对即将安装的软件进行配置,检查当前的环境是否满足要安装软件的依赖关系,但并不是所有的tar包都是源代码的包,可以ls看看有没有configure这个文件,如果是二进制的包,解压后直接就能使用.
根据提示安装软件,再次编译
[root@server4 ~]# yum install gcc -y
[root@server4 ~]# yum install -y pcre-devel
[root@server4 ~]# yum install -y openssl-devel
<3>修改配置文件
[root@server4 nginx-1.14.0]# vim src/core/nginx.h
示图:删除版本信息,即为保证安全,对外不显示版本信息
[root@server4 nginx-1.14.0]# vim auto/cc/gcc
示图:注释debug信息
<4>编译并安装
[root@server4 nginx-1.14.0]# make && make install
编译后生成Makefile文件
——————————————————————————————————————————
示图:未注释debug信息
示图:注释debug信息
————————————————————————————————————————————
<5>链接
[root@server4 ~]# ln -s /usr/local/nginx/sbin/nginx /sbin/
<6>开启nginx
[root@server4 sbin]# nginx -t ##检测配置文件的正确性
[root@server4 sbin]# nginx ##开启nginx,注意开启前保证80端口不能被占用
注意:重新启动nginx服务,使用以下命令
nginx -s reload
<7>测试nginx服务
1> nginx服务安装成功
2> 编写nginx测试页
[root@server4 html]# pwd
/usr/local/nginx/html
[root@server4 html]# ls
50x.html index.html
[root@server4 html]# vim test.html
<h1>server4</h1>
示图:访问172.25.51.4/test.html
二、负载均衡
<1>安装部署httpd服务:
[root@server5 ~]# yum install -y httpd
[root@server5 ~]# /etc/init.d/httpd start
[root@server5 ~]# vim /var/www/html/index.html
<h1>server5</h1>
server6操作同server5
<2>部署nignx实现负载均衡
[root@server4 ~]# useradd nginx
[root@server4 ~]# cd /usr/local/nginx/conf/
[root@server4 conf]# vim nginx.conf
2 user nginx nginx;
3 worker_processes 1; ##工作进程数为1
4 #worker_processes auto; ##cpu自动配置进程
5 #worker_cpu_affinity 01 10; ##进程为2,绑定cpu
6 #worker_cpu_affinity 0001 0010 0100 1000; ##进程为4
15 events {
16 use epoll;
17 worker_connections 65535;
18 }
22 http {
23 upstream westos { ##算法调度
24 #ip_hash;
25 server 172.25.51.5:80; ##RS主机IP
26 server 172.25.51.6:80;
27 }
128 server { ##虚拟主机
129 listen 80;
130 server_name www.westos.org; ##代理域名
131 location / { ##调用westos
132 proxy_pass http://westos;
133 }
134 }
[root@server4 ~]# nginx -t
[root@server4 ~]# nginx -s reload
示图:查看进程数为1
示图:设定进程为2,查看进程数
<3>安全限制
[root@server4 nginx-1.14.0]# vim /etc/security/limits.conf ##安全限制
51 nginx - nofile 65536
[root@server4 ~]# nginx -t
[root@server4 ~]# nginx -s reload
测试:
<4>真机域名解析
[root@foundation51 ~]# vim /etc/hosts
172.25.51.4 www.westos.org
<5>测试:负载均衡
三、nginx中upstream轮询机制介绍
Nginx中upstream有以下几种方式:
1、轮询(weight=1)
默认选项,当weight不指定时,各服务器weight相同,
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
2、weight
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
如果后端服务器down掉,能自动剔除。
比如下面配置,51.5服务器的访问量为51.6服务器的两倍。
[root@server4 ~]# vim /usr/local/nginx/conf/nginx.conf
22 http {
23
24 upstream westos {
25 #ip_hash;
26 server 172.25.51.5:80 weight=2;
27 server 172.25.51.6:80;
28 }
[root@server4 ~]# nginx -s reload
测试:
3、ip_hash机制
每个请求按访问ip的hash结果分配,nginx中的ip_hash技术能够将某个ip的请求定向到同一台后端web机器中,这样每个访客固定访问一个后端服务器,可以解决session不能跨服务器的问题。
如果后端服务器down掉,要手工down掉。
ip_hash在upstream配置中定义:
[root@server4 ~]# vim /usr/local/nginx/conf/nginx.conf
22 http {
23
24 upstream westos {
25 ip_hash;
26 server 172.25.51.5:80;
27 server 172.25.51.6:80;
28 }
[root@server4 ~]# nginx -s reload
测试:
4、fair(第三方插件)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
upstream resinserver{
server 192.168.1.10:8080;
server 192.168.1.11:8080;
fair;
}
5、url_hash(第三方插件)
按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存服务器时比较有效。在upstream中加入hash语句,hash_method是使用的hash算法
upstream resinserver{
server 192.168.1.10:8080;
server 192.168.1.11:8080;
hash $request_uri;
hash_method crc32;
}
设备的状态有:
- down 表示单前的server暂时不参与负载。
- weight 权重,默认为1。 weight越大,负载的权重就越大。
- max_fails 允许请求失败的次数默认为1。当超过最大次数时,返回proxy_next_upstream 模块定义的错误。
- fail_timeout max_fails次失败后,暂停的时间。
- backup 备用服务器, 其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。
四、nginx双机热备
[root@server4 ~]# vim /usr/local/nginx/conf/nginx.conf
22 http {
23
24 upstream westos {
25 #ip_hash;
26 server 172.25.51.5:80;
27 server 172.25.51.6:80;
28 server 172.25.51.4:8080 backup; ##备用服务器
29 }
[root@server4 ~]# nginx -s reload
[root@server4 ~]# vim /etc/httpd/conf/httpd.conf
136 Listen 8080
[root@server4 ~]# /etc/init.d/httpd start
测试:
<1>当服务器正常时,nginx不会给备用服务器转发任何请求。
<2>只有当其他节点全部无法连接时,nginx才会启用备用节点。
[root@server5 ~]# /etc/init.d/httpd stop
[root@server6 ~]# /etc/init.d/httpd stop
五、基于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功能:
[root@server4 ~]# nginx -s stop
<1>下载安装包并解压
[root@server4 ~]# tar zxf nginx-1.10.1.tar.gz
[root@server4 ~]# tar zxf nginx-sticky-module-ng.tar.gz
<2>编译安装
[root@server4 ~]# cd nginx-1.10.1
[root@server4 nginx-1.10.1]# ./configure --help ##查看帮助
[root@server4 nginx-1.10.1]# ./configure --prefix=/opt/nginx --add-module=/root/nginx-sticky-module-ng
[root@server4 nginx-1.10.1]# make & make install
<3>更改配置文件
[root@server4 ~]# cd /opt/nginx/conf/
[root@server4 conf]# cp /usr/local/nginx/conf/nginx.conf .
[root@server4 conf]# vim nginx.conf ##配置文件更改,其余配置同前相同
示图:配置文件更改部分,加载sticky模块,实现cookie效果
示图:当前配置文件所在位置
<4>启动服务
[root@server4 conf]# cd ..
[root@server4 nginx]# ls
conf html logs sbin
[root@server4 nginx]# sbin/nginx -t
[root@server4 nginx]# sbin/nginx ##注意:没有设置软链接,需要绝对(相对)路径调用
[root@server5 ~]# /etc/init.d/httpd start
[root@server6 ~]# /etc/init.d/httpd start
<5>测试:浏览器中保留cookies,进行匹配后分发后端服务器
浏览器刷新,依旧为server6界面,当清空浏览器后,保持在server5界面