当前位置:首页 > 资讯 > 正文

Nginx实现四层代理与七层代理

Nginx实现四层代理与七层代理

目录

一、实验环境准备

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,然后转发给内部网站服务器。

主机清单 主机类型主机名主机IP备注nginx代理服务器proxy

192.168.1.10(内部IP)

192.168.1.200(外部IP)

关闭selinux和firewalldnginx web1网站服务器web1192.168.1.20(内部IP)关闭selinux和firewalldnginx web2网站服务器web2192.168.1.30(内部IP)关闭selinux和firewalld

安装步骤参考: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端口:

最新文章