目录
一、实验环境准备
1、准备三台服务器
2、安装nginx环境
3、启动nginx环境
二、设置Nginx七层代理
1、proxy代理服务器配置(轮询)
2、设置加权轮询
3、健康检测功能
4、解决重复登录问题(源地址哈希ip_hash)
三、设置Nginx四层代理
一、实验环境准备
1、准备三台服务器
web1、web2作为nginx集群2个节点,proxy服务器作为代理,负责调度来自客户端的请求,192.168.1.200模拟公网的对外IP,客户端访问proxy代理服务器192.168.1.200,然后转发给内部网站服务器。
主机清单
主机类型 |
主机名 |
主机IP |
备注 |
nginx代理服务器 |
proxy |
192.168.1.10(内部IP) 192.168.1.200(外部IP) |
关闭selinux和firewalld |
nginx web1网站服务器 |
web1 |
192.168.1.20(内部IP) |
关闭selinux和firewalld |
nginx web2网站服务器 |
web2 |
192.168.1.30(内部IP) |
关闭selinux和firewalld |
2、安装nginx环境
安装步骤参考:Nginx安装、升级与基础配置_桂安俊@kylinOS的博客-CSDN博客
注意:这里需要安装Nginx 1.9及以上版本,1.9及以上版本Nginx才支持四层路由TCP/UDP转发,并在编译安装时开启--with-stream模块
nginx下载地址:nginx: download
3、启动nginx环境
#三台服务器都执行
/usr/local/nginx/sbin/nginx
修改web1和web2主机的/usr/local/nginx/html/index.html,加以标识,以区分到时候测试的时候实际访问的是哪台服务器,比如我这边将index.html改为:
二、设置Nginx七层代理
目标:实现代理服务器对网站服务器进行轮询调度
1、proxy代理服务器配置(轮询)
#proxy服务器执行
vim /usr/local/nginx/conf/nginx.conf
新增或修改如下红色标识内容:
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服务器执行
/usr/local/nginx/sbin/nginx -s reload
客户端测试,访问proxy代理服务器的192.168.1.200地址,然后刷新几次,可以看到访问的web页面是在web1和web2服务器之间平均轮询切换:
2、设置加权轮询
对于集群web服务器性能参差不齐的时候,我们希望性能好的服务器可以多被访问,性能差的服务器减少被访问,就是后就可以选择加权轮询,自动配比服务器访问比重。
#proxy服务器执行
vim /usr/local/nginx/conf/nginx.conf
在上面轮询配置的基础上,修改集群池属性,添加加权轮询参数(红色修改部分):
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服务器执行
/usr/local/nginx/sbin/nginx -s reload
客户端测试,再次访问proxy的192.168.1.200时,会发现web1和web2访问的几率是1:2,因为上面做了权重配置。
3、健康检测功能
当网站服务器的一个节点故障时,nginx是可以自动进行健康检查,跳过故障服务器的,比如这里将web1的nginx服务关闭:
#web1服务器执行
/usr/local/nginx/sbin/nginx -s stop
再访问192.168.1.200时,无论怎么刷新,都是访问的web2的页面:
同样,当web1重新启动恢复正常时,Nginx也会自动识别,加入集群,又可以重新恢复对web1的访问。
4、解决重复登录问题(源地址哈希ip_hash)
使用上面轮询的方案会带来一个问题,就是如果网站需要账户登录,当第一次轮询调度到web1,输入完账户登录后,刷新页面,proxy将请求调度给web2,这是记住账户信息的只有web1,那么切换到web2又得重新输入账户信息,这时候就需要使用ip_hash,来保证同一客户端IP始终只访问同一台web服务器。通过IP地址来判别是否为同一客户端,这里判别的不是IP的全部地址,而是看的IP地址前几位。
#proxy服务器执行
vim /usr/local/nginx/conf/nginx.conf
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服务器执行
/usr/local/nginx/sbin/nginx -s reload
客户端测试:
访问proxy的192.168.1.200时,不论怎么刷新,同一台客户端始终访问的是固定一个web服务器,除非web服务器故障,切换了。
三、设置Nginx四层代理
前面的七层代理主要是实现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的调度。
#proxy服务器执行
vim /usr/local/nginx/conf/nginx.conf
在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 {
... ...
}
#proxy服务器执行
/usr/local/nginx/sbin/nginx -s reload
客户端测试:
使用xshell远程连接192.168.1.200的12345端口,会自动转发到web1和web2的22端口:
【注】四层代理只关系协议是TCP还是UDP,不管是ssh、mysql、dns都可以使用nginx四层代理,以实现对应负载均衡。