NginxUpStream模块三种绑定模默认wrr ip_hash 以及hashkey的实现

实验要求,至少三台虚拟机,在同一网段172.18/16,172.18.10.10/11,其中172.18.200.100做为DR

并且配置两块网卡,另一块网卡的地址不能再171.18/16网段内

[[email protected] ~]# ip a

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN

link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

inet 127.0.0.1/8 scope host lo

inet6 ::1/128 scope host

valid_lft forever preferred_lft forever

2: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000

link/ether 00:0c:29:23:f3:8d brd ff:ff:ff:ff:ff:ff

inet 172.18.200.100/16 brd 172.18.255.255 scope global eth1

inet6 fe80::20c:29ff:fe23:f38d/64 scope link

valid_lft forever preferred_lft forever

3: eth2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000

link/ether 00:0c:29:23:f3:97 brd ff:ff:ff:ff:ff:ff

inet 192.168.10.100/24 brd 192.168.10.255 scope global eth2

inet6 fe80::20c:29ff:fe23:f397/64 scope link

valid_lft forever preferred_lft forever

1、在10/11上使用yum安装php和httpd

[[email protected] ~]# yum install php httpd

2、配置时间同步,先安装chrony安装包,再进行配置

[[email protected] ~]# yum install -y chrony

[[email protected] ~]# vim /etc/chrony.conf

# Allow NTP client access from local network.

#allow 192.168/16

allow 172.18/16

# Serve time even if not synchronized to any NTP server.

local stratum 10

3、启动chrony服务

[[email protected] ~]# service chronyd start

Starting chronyd:                                          [  OK  ]

4、安装同步时间的守护进程,为的是每过一段时间同步时间

分别在两台Vs上安装chrony

[[email protected] ~]# yum install -y chrony

[[email protected] ~]# yum install -y chrony

编辑配置文件,两台VS机子一样的配置

[[email protected] ~]# vim /etc/chrony.conf

#server 0.rhel.pool.ntp.org iburst

#server 1.rhel.pool.ntp.org iburst

#server 2.rhel.pool.ntp.org iburst

#server 3.rhel.pool.ntp.org iburst

server 172.18.200.100 iburst

启动chrony服务,两台VS机子一样的配置

[[email protected] ~]# service chronyd start

Starting chronyd:                                          [  OK  ]

5、与服务器同步时间

[[email protected] ~]#  ntpdate 172.18.200.100

10 May 02:13:57 ntpdate[3324]: step time server 172.18.200.100 offset -2587.052960 sec

[[email protected] ~]#  ntpdate 172.18.200.100

10 May 02:13:57 ntpdate[3324]: step time server 172.18.200.100 offset -2587.052960 sec

[[email protected] ~]# date

Wed May 10 02:31:05 CST 2017

[[email protected] ~]# date

Wed May 10 02:31:08 CST 2017

6、在两台VS主机上提供相关主页

这里用简单的for循环快速生成10个页面测试文件

[[email protected] ~]# for i in {1..20}; do echo "Test Page $i on UpStream Server 1 (172.18.10.10)" > /var/www/html/test$i.html;done

[[email protected] html]# ls /var/www/html/

test10.html  test12.html  test14.html  test16.html  test18.html  test1.html   test2.html  test4.html  test6.html  test8.html

test11.html  test13.html  test15.html  test17.html  test19.html  test20.html  test3.html  test5.html  test7.html  test9.html

另一台机子做同样的操作

7、启动httpd服务(10/11)

[email protected] html]# service httpd start

8、在DR服务端测试,使用curl测试页面是否能访问

[[email protected] ~]# curl http://172.18.10.10/test1.html

Test Page 1 on UpStream Server 1 (172.18.10.10)

[[email protected] ~]# curl http://172.18.10.11/test1.html

Test Page 1 on UpStream Server 1 (172.18.10.11)

9、在DR端下载并安装nginx,由于使用centos6.8,无法安装nginx1.10以上的版本

lftp 172.18.0.1:/pub/Sources/6.x86_64/nginx> ls

-rw-r--r--    1 500      500        714233 Jul 25  2013 nginx-1.0.15-5.el6.src.rpm

-rwxr--r--    1 500      500        319456 Apr 24  2014 nginx-1.4.7-1.el6.ngx.x86_64.rpm

-rw-r--r--    1 0        0          344416 Sep 16  2014 nginx-1.6.2-1.el6.ngx.x86_64.rpm

lftp 172.18.0.1:/pub/Sources/6.x86_64/nginx> mget nginx-1.6.2-1.el6.ngx.x86_64.rpm

344416 bytes transferred

lftp 172.18.0.1:/pub/Sources/6.x86_64/nginx> bye

安装nginx

[[email protected] ~]# yum install nginx-1.6.2-1.el6.ngx.x86_64.rpm

10、配置nginx,仅仅作为反向代理服务器

[[email protected] ~]# cd /etc/nginx/conf.d/

[[email protected] conf.d]# ls

default.conf  example_ssl.conf

[[email protected] conf.d]# cp default.conf default.conf.bak

[[email protected] conf.d]# ls

default.conf  default.conf.bak  example_ssl.conf

因为要先定义组,所以首先编辑nginx.conf文件

[[email protected] nginx]# ls

conf.d  fastcgi_params  koi-utf  koi-win  mime.types  nginx.conf  scgi_params  uwsgi_params  win-utf

[[email protected] nginx]# vim nginx.conf

在http上下文中定义upstream 模块,操作如下

http {

include       /etc/nginx/mime.types;

default_type  application/octet-stream;

log_format  main  ‘$remote_addr - $remote_user [$time_local] "$request" ‘

‘$status $body_bytes_sent "$http_referer" ‘

‘"$http_user_agent" "$http_x_forwarded_for"‘;

access_log  /var/log/nginx/access.log  main;

sendfile        on;

#tcp_nopush     on;

keepalive_timeout  65;

#gzip  on;

upstream websrvs {

server 172.18.10.10:80;

server 172.18.10.11:80;

}

include /etc/nginx/conf.d/*.conf;

}编辑conf.d文件中的default.conf文件

[[email protected] conf.d]# vim default.conf

在location上下文中编辑proxy_pass反向代理文件

server {

listen       80;

server_name  localhost;

#charset koi8-r;

#access_log  /var/log/nginx/log/host.access.log  main;

location / {

proxy_pass http://websrvs;

root   /usr/share/nginx/html;

index  index.html index.htm;

nginx -t 检查配置文件语法

10、启动nginx服务

[[email protected] conf.d]# nginx

查看监听端口80是否开启

[[email protected] conf.d]# ss -tnl

State      Recv-Q Send-Q                                 Local Address:Port                                   Peer Address:Port

LISTEN     0      128                                                *:80                                                *:*

LISTEN     0      128                                               :::22                                               :::*

LISTEN     0      128                                                *:22                                                *:*

LISTEN     0      100                                              ::1:25                                               :::*

LISTEN     0      100                                        127.0.0.1:25

11、在客户端上使用curl命令一次性访问10次页面,看看效果

[[email protected] ~]# for ((i=1;i<=10;i++));do curl http://172.18.200.100:80/test1.html; done

Test Page 1 on UpStream Server 1 (172.18.10.10)

Test Page 1 on UpStream Server 2 (172.18.10.11)

Test Page 1 on UpStream Server 1 (172.18.10.10)

Test Page 1 on UpStream Server 2 (172.18.10.11)

Test Page 1 on UpStream Server 1 (172.18.10.10)

Test Page 1 on UpStream Server 2 (172.18.10.11)

Test Page 1 on UpStream Server 1 (172.18.10.10)

Test Page 1 on UpStream Server 2 (172.18.10.11)

Test Page 1 on UpStream Server 1 (172.18.10.10)

Test Page 1 on UpStream Server 2 (172.18.10.11)

发现实现负载均衡

12、若期望负载权限有所不同,则进行如下配置

[[email protected] conf.d]# cd ..

[[email protected] nginx]# vim nginx.conf

#gzip  on;

upstream websrvs {

server 172.18.10.10:80 weigth=2;

server 172.18.10.11:80 weight=3; #### 这里权重:综合2+3,意为第一台服务器虚拟为2台,第二台服务器虚拟为3台

在upstream 模块里增加权重设置

保存退出,重启服务

[[email protected] nginx]# nginx -t

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok

nginx: configuration file /etc/nginx/nginx.conf test is successful

[[email protected] nginx]# nginx -s reload

13、客户端再次访问10次效果如下

[[email protected] ~]# for ((i=1;i<=10;i++));do curl http://172.18.200.100:80/test1.html; done

Test Page 1 on UpStream Server 2 (172.18.10.11)

Test Page 1 on UpStream Server 1 (172.18.10.10)

Test Page 1 on UpStream Server 2 (172.18.10.11)

Test Page 1 on UpStream Server 1 (172.18.10.10)

Test Page 1 on UpStream Server 2 (172.18.10.11)

Test Page 1 on UpStream Server 2 (172.18.10.11)

Test Page 1 on UpStream Server 1 (172.18.10.10)

Test Page 1 on UpStream Server 2 (172.18.10.11)

Test Page 1 on UpStream Server 1 (172.18.10.10)

Test Page 1 on UpStream Server 2 (172.18.10.11)

14、关闭其中一台VS,再次测试

[[email protected] ~]# service httpd stop

Stopping httpd:                                            [  OK  ]

[[email protected] ~]# for ((i=1;i<=10;i++));do curl http://172.18.200.100:80/test1.html; done

Test Page 1 on UpStream Server 1 (172.18.10.10)

Test Page 1 on UpStream Server 1 (172.18.10.10)

Test Page 1 on UpStream Server 1 (172.18.10.10)

Test Page 1 on UpStream Server 1 (172.18.10.10)

Test Page 1 on UpStream Server 1 (172.18.10.10)

Test Page 1 on UpStream Server 1 (172.18.10.10)

Test Page 1 on UpStream Server 1 (172.18.10.10)

Test Page 1 on UpStream Server 1 (172.18.10.10)

Test Page 1 on UpStream Server 1 (172.18.10.10)

Test Page 1 on UpStream Server 1 (172.18.10.10)

再次启动VS,在测试

[[email protected] ~]# service httpd start

[[email protected] ~]# for ((i=1;i<=10;i++));do curl http://172.18.200.100:80/test1.html; done

Test Page 1 on UpStream Server 1 (172.18.10.10)

Test Page 1 on UpStream Server 1 (172.18.10.10)

Test Page 1 on UpStream Server 1 (172.18.10.10)

Test Page 1 on UpStream Server 2 (172.18.10.11)

Test Page 1 on UpStream Server 1 (172.18.10.10)

Test Page 1 on UpStream Server 2 (172.18.10.11)

Test Page 1 on UpStream Server 2 (172.18.10.11)

Test Page 1 on UpStream Server 1 (172.18.10.10)

Test Page 1 on UpStream Server 2 (172.18.10.11)

Test Page 1 on UpStream Server 1 (172.18.10.10)

15、定义最大失败次数max_fails ,和超时时间间隔 fail_timeout

[[email protected] nginx]# vim nginx.conf

upstream websrvs {

server 172.18.10.10:80 weight=2 max_fails=2 fail_timeout=2;

server 172.18.10.11:80 weight=3 backup;

保存退出并重启服务

在客户端测试

[[email protected] ~]# for ((i=1;i<=10;i++));do curl http://172.18.200.100:80/test1.html; done

Test Page 1 on UpStream Server 1 (172.18.10.10)

Test Page 1 on UpStream Server 1 (172.18.10.10)

Test Page 1 on UpStream Server 1 (172.18.10.10)

Test Page 1 on UpStream Server 1 (172.18.10.10)

Test Page 1 on UpStream Server 1 (172.18.10.10)

Test Page 1 on UpStream Server 1 (172.18.10.10)

Test Page 1 on UpStream Server 1 (172.18.10.10)

Test Page 1 on UpStream Server 1 (172.18.10.10)

Test Page 1 on UpStream Server 1 (172.18.10.10)

Test Page 1 on UpStream Server 1 (172.18.10.10)

再次修改配置

[[email protected] ~]# for ((i=1;i<=10;i++));do curl http://172.18.200.100:80/test1.html; done

Test Page 1 on UpStream Server 2 (172.18.10.11)

Test Page 1 on UpStream Server 1 (172.18.10.10)

Test Page 1 on UpStream Server 2 (172.18.10.11)

Test Page 1 on UpStream Server 1 (172.18.10.10)

Test Page 1 on UpStream Server 2 (172.18.10.11)

Test Page 1 on UpStream Server 2 (172.18.10.11)

Test Page 1 on UpStream Server 1 (172.18.10.10)

Test Page 1 on UpStream Server 2 (172.18.10.11)

Test Page 1 on UpStream Server 1 (172.18.10.10)

Test Page 1 on UpStream Server 2 (172.18.10.11)

因此发现nginx默认调度规则为加权轮询wrr

16、实现ip_hash(ip哈希绑定)绑定,第一次访问哪个主机,随后都会访问该主机

vim nginx.conf

upstream websrvs {

ip_hash;

server 172.18.10.10:80 weight=2 max_fails=2 fail_timeout=2;

server 172.18.10.11:80 weight=3;

[[email protected] ~]# for ((i=1;i<=10;i++));do curl http://172.18.200.100:80/test1.html; done

Test Page 1 on UpStream Server 1 (172.18.10.10)

Test Page 1 on UpStream Server 1 (172.18.10.10)

Test Page 1 on UpStream Server 1 (172.18.10.10)

Test Page 1 on UpStream Server 1 (172.18.10.10)

Test Page 1 on UpStream Server 1 (172.18.10.10)

Test Page 1 on UpStream Server 1 (172.18.10.10)

Test Page 1 on UpStream Server 1 (172.18.10.10)

Test Page 1 on UpStream Server 1 (172.18.10.10)

Test Page 1 on UpStream Server 1 (172.18.10.10)

Test Page 1 on UpStream Server 1 (172.18.10.10)

17、实现least_conn(加权最少连接),相当于wlc,最少连接,只要weight不同就会考虑权重

upstream websrvs {

least_conn;

server 172.18.10.10:80 weight=2 max_fails=2 fail_timeout=2;

server 172.18.10.11:80 weight=3;

}

[[email protected] ~]# for ((i=1;i<=10;i++));do curl http://172.18.200.100:80/test1.html; done

Test Page 1 on UpStream Server 2 (172.18.10.11)

Test Page 1 on UpStream Server 1 (172.18.10.10)

Test Page 1 on UpStream Server 2 (172.18.10.11)

Test Page 1 on UpStream Server 1 (172.18.10.10)

Test Page 1 on UpStream Server 2 (172.18.10.11)

Test Page 1 on UpStream Server 2 (172.18.10.11)

Test Page 1 on UpStream Server 1 (172.18.10.10)

Test Page 1 on UpStream Server 2 (172.18.10.11)

Test Page 1 on UpStream Server 1 (172.18.10.10)

Test Page 1 on UpStream Server 2 (172.18.10.11)

18.哈希 hash key ,key可以是任何表示,url,地址等等,hash后跟什么就绑定什么

upstream websrvs {

hash $request;

server 172.18.10.10:80 weight=2 max_fails=2 fail_timeout=2;

server 172.18.10.11:80 weight=3;

}

第一次访问那个资源在哪台服务器,之后就绑定再该服务器上

upstream websrvs {

hash $request consistent;   #####一致性哈希算法

server 172.18.10.10:80 weight=2 max_fails=2 fail_timeout=2;

server 172.18.10.11:80 weight=3;

}

19、keepalive connections

并发太高,给端口带来压力,为此避免这种情况

可以在后面这一侧,使用长连接

nginx的特点,不是每一个请求靠每一个进程来响应,

而是一个进程响应n个请求

因此大量请求都是由worker响应的

worker 4个

现在用一个来表示

保持一定数量的长连接

一个长连接只能响应一个请求

与第一个server保留32个,意味着一次性可以发出32个长连接,也不用建立新连接

与第二个server保留32个长连接,也是一样,不用建立新连接,一共就是64个

所以连接一直在,也不用三次握手和四次断开

这时候,worker在nginx端占用的端口数量也就不变了

因此,32个长连接连接着,大量的请求就可以通过这些长连接发送

不用每个连接都建立一个端口

可以极大地节约端口

keepalive connections 表示保留的空闲长连接有多少个

假如没人用这些长连接了,一直建立这些长连接也是对后端服务器的压力

解决办法就是超时关闭,最少保持一个关闭

后面访问就直接可以用了,不用再去建立长连接

keepalive connections ,因此将该设置数字调高一些,可以一定意义上提升服务器性能

时间: 2024-12-06 04:17:32

NginxUpStream模块三种绑定模默认wrr ip_hash 以及hashkey的实现的相关文章

Oracle用户解锁的三种办法及默认的用户与密码

ORA-28000: the account is locked-的解决办法 2009-11-11 18:51 ORA-28000: the account is locked 第1步:使用PL/SQL,登录名为system,数据库名称不变,选择类型的时候把Normal修改为Sysdba; 第2步:选择myjob,查看users; 第3步:选择system,右击点击“编辑”: 第4步:修改密码,把“帐户被锁住”的勾去掉: 第5步:点击“应用”再点击“关闭”: 第6步:重新登录就可以通过验证了:

mybatis之接口方法多参数的三种实现方式

关键代码举例: DaoMapper.xml 1 <!-- 传入多个参数时,自动转换为map形式 --> 2 <insert id="insertByColumns" useGeneratedKeys="true" keyProperty="id"> 3 insert into user (id, name, age) values (NULL ,#{param1}, #{param2}) 4 </insert>

哗啦啦Python之路 - Day 6 - 三种基础排序,递归,反射,模块

1. 三种排序方式 - 冒泡排序:两两比较,大的排右边,每次冒出去一个泡 m = [1,2,6,5,4] for i in range(len(m)): for j in range(i): if m[j] > m[j+1]: m[j],m[j+1] = m[j+1],m[j] print(m) - 选择排序 对于一组关键字{K1,K2,…,Kn}, 首先从K1,K2,…,Kn中选择最小值,假如它是 Kz,则将Kz与 K1对换:然后从K2,K3,… ,Kn中选择最小值 Kz,再将Kz与K2对换.

后勤模块数据源的增量队列(Delta-Queue)三种更新模式(Update Mode)

声明:原创作品,转载时请注明文章来自SAP师太技术博客:www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将追究法律责任!原文链接:http://www.cnblogs.com/jiangzhengjun/p/4296684.html 数据的更新(同步)有三种方式:V1.V2.V3: V1 - Synchronous update,同步更新,数据会立即更新到目的地(如应用数据表Application Tables.增强队列Delta-Queue),数

linux动态库默认搜索路径设置的三种方法

众所周知, Linux 动态库的默认搜索路径是 /lib 和 /usr/lib .动态库被创建后,一般都复制到这两个目录中.当程序执行时需要某动态库, 并且该动态库还未加载到内存中,则系统会自动到这两个默认搜索路径中去查找相应的动态库文件,然后加载该文件到内存中,这样程序就可以使用该动态库中的函 数,以及该动态库的其它资源了.在 Linux 中,动态库的搜索路径除了默认的搜索路径外,还可以通过以下三种方法来指定. 方法一:在配置文件 /etc/ld.so.conf 中指定动态库搜索路径.每次编辑

js默认三种弹框方式

<!--js默认三种弹框方式--> <!--警告--><div onclick="alert('警告')">onclick!</div> <!--确认--><div onclick="confirm('确认')">onclick!</div> <!--信息输入--><div onclick="prompt('信息输入')">onclick!

Android去除系统默认的标题栏和全屏的三种方法

在做应用的时候,很多时候是不需要系统自带的标题栏的,而是自己去实现标题栏,这就要去掉系统的标题栏,下面总结了三种方法.全屏也是一样的道理,也总结了实现的三种方法. (一)去除标题栏 1.方法1 在Activity的onCreate方法中: 1 requestWindowFeature(Window.FEATURE_NO_TITLE);//去掉标题栏 2 //注意这句一定要写在setContentView()方法的前面,不然会报错的 但是这种方法的缺陷是,因为在onCreate方法中才去掉标题栏,

LVS,Nginx及HAProxy三种负载均衡器比较

一. 简述:目前,在线上环境中应用较多的负载均衡器硬件有F5 BIG-IP,软件有LVS,Nginx及HAProxy,apache,高可用软件有Heartbeat.Keepalived,成熟的架构有LVS+Keepalived.Nginx+Keepalived.HAProxy+hearbeat二.  三种负载均衡器的优缺点:lvs优点:1.抗负载能力强,工作在第4层仅作分发之用没有流量的产生.这个特点也决定了它在负载均衡软件里的性能最强的:无流量,同时保证了均衡器IO的性能不会受到大流量的影响.

LVS负载均衡(LVS简介、三种工作模式、、调度原理以及十种调度算法)

LVS简介 LVS(Linux Virtual Server)即Linux虚拟服务器,是由章文嵩博士主导的开源负载均衡项目,目前LVS已经被集成到Linux内核模块中.该项目在Linux内核中实现了基于IP的数据请求负载均衡调度方案,其体系结构如图1所示,终端互联网用户从外部访问公司的外部负载均衡服务器,终端用户的Web请求会发送给LVS调度器,调度器根据自己预设的算法决定将该请求发送给后端的某台Web服务器,比如,轮询算法可以将外部的请求平均分发给后端的所有服务器,终端用户访问LVS调度器虽然