目录
一、实验环境准备
1、准备三台服务器
2、安装nginx环境
3、启动nginx环境
二、设置Nginx七层代理
1、proxy代理服务器配置(轮询)
2、设置加权轮询
3、健康检测功能
4、解决重复登录问题(源地址哈希ip_hash)
三、设置Nginx四层代理
web1、web2作为nginx集群2个节点,proxy服务器作为代理,负责调度来自客户端的请求,192.168.1.200模拟公网的对外IP,客户端访问proxy代理服务器192.168.1.200,然后转发给内部网站服务器。
192.168.1.10(内部IP)
192.168.1.200(外部IP)
安装步骤参考:Nginx安装、升级与基础配置_桂安俊@kylinOS的博客-CSDN博客
注意:这里需要安装Nginx 1.9及以上版本,1.9及以上版本Nginx才支持四层路由TCP/UDP转发,并在编译安装时开启--with-stream模块
nginx下载地址:nginx: download
修改web1和web2主机的/usr/local/nginx/html/index.html,加以标识,以区分到时候测试的时候实际访问的是哪台服务器,比如我这边将index.html改为:
目标:实现代理服务器对网站服务器进行轮询调度
新增或修改如下红色标识内容:
http {
upstream servers { #定义源服务器组,servers为自定义组名
server 192.168.1.20:80; #组节点网站服务器web1 IP,80为web1 nginx默认端口
server 192.168.1.30:80; #组节点网站服务器web2 IP,80为web2 nginx默认端口
}
server { #每一个server是一个虚拟主机
listen 80;
server_name localhost; #web主机名
location / {
proxy_pass http://servers; #调用服务组,servers和上面自定义组名要对应
root html;
index index.html index.htm;
}}
}
客户端测试,访问proxy代理服务器的192.168.1.200地址,然后刷新几次,可以看到访问的web页面是在web1和web2服务器之间平均轮询切换:
对于集群web服务器性能参差不齐的时候,我们希望性能好的服务器可以多被访问,性能差的服务器减少被访问,就是后就可以选择加权轮询,自动配比服务器访问比重。
在上面轮询配置的基础上,修改集群池属性,添加加权轮询参数(红色修改部分):
http {
upstream servers { #定义源服务器组,servers为自定义组名
server 192.168.1.20:80 weight=1 max_fails=1 fail_timeout=30;
server 192.168.1.30:80 weight=2 max_fails=2 fail_timeout=30;
server 192.168.1.40 down; #问了说明参数down,实际没有该服务器,可不加}
server { #每一个server是一个虚拟主机
listen 80;
server_name localhost; #web主机名
location / {
proxy_pass http://servers; #调用服务组,servers和上面自定义组名要对应
root html;
index index.html index.htm;
}}
}
【释】如上增加的红色修改参数部分中:
weight为设置服务器权重值,默认是1
max_fails设置最大失败次数,就失败多少次,判定该服务器故障
fail_timeout设置失败超时时间,单位为秒,即失败后,多少秒内不再检查访问该服务器
down标记服务器已关机,不参与集群调度
重新加载配置:
客户端测试,再次访问proxy的192.168.1.200时,会发现web1和web2访问的几率是1:2,因为上面做了权重配置。
当网站服务器的一个节点故障时,nginx是可以自动进行健康检查,跳过故障服务器的,比如这里将web1的nginx服务关闭:
再访问192.168.1.200时,无论怎么刷新,都是访问的web2的页面:
同样,当web1重新启动恢复正常时,Nginx也会自动识别,加入集群,又可以重新恢复对web1的访问。
使用上面轮询的方案会带来一个问题,就是如果网站需要账户登录,当第一次轮询调度到web1,输入完账户登录后,刷新页面,proxy将请求调度给web2,这是记住账户信息的只有web1,那么切换到web2又得重新输入账户信息,这时候就需要使用ip_hash,来保证同一客户端IP始终只访问同一台web服务器。通过IP地址来判别是否为同一客户端,这里判别的不是IP的全部地址,而是看的IP地址前几位。
http {
upstream servers { #定义源服务器组,servers为自定义组名
ip_hash; #在上面配置的基础上,加上ip_hash配置server 192.168.1.20:80 weight=1 max_fails=1 fail_timeout=30;
server 192.168.1.30:80 weight=2 max_fails=2 fail_timeout=30;
server 192.168.1.40 down; #问了说明参数down,实际没有该服务器,可不加}
server { #每一个server是一个虚拟主机
listen 80;
server_name localhost; #web主机名
location / {
proxy_pass http://servers; #调用服务组,servers和上面自定义组名要对应
root html;
index index.html index.htm;
}}
}
客户端测试:
访问proxy的192.168.1.200时,不论怎么刷新,同一台客户端始终访问的是固定一个web服务器,除非web服务器故障,切换了。
前面的七层代理主要是实现web http协议的负载均衡,如果需要对IP进行负载均衡,那就需要使用Nginx的四层代理功能(Nginx1.9及以上版本支持四层代理,并安装时需要添加--with_stream模块)。
【补充】
OSI第7层--->应用层协议:FTP、HTTP、NFS、SMTP
OSI第4层--->传输层协议:TCP、UDP、SPX
OSI第3层--->网络层:IP、IPX、AppleTalk DDP
实验目标:访问proxy服务器的192.168.1.200:22,proxy服务器将ssh请求轮询分配给web1和web2主机,实现对SSH的调度。
在http配置的上方新增以下内容(红色部分):
stream { #四层代理配置stream
upstream backend { #定义集群,名称为backend
server 192.168.1.20:22; #代理的是ssh服务,所以是22端口
server 192.168.1.30:22;
}
server { #定义一个本地服务器代理服务
listen 12345; #本地代理监听端口,需要是未使用的端口
proxy_pass backend; #调用backend集群,集群名要与上面定义的对应
}
}
http {... ...
}
客户端测试:
使用xshell远程连接192.168.1.200的12345端口,会自动转发到web1和web2的22端口:
本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕,E-mail:xinmeigg88@163.com
本文链接:http://www.bhha.com.cn/news/2187.html