Last Updated on

前言

nginx作为一个高性能的反向代理服务器,常用于做http(s)的反向代理。但有时候除了http的web服务需要反向代理外。还经常会碰到非http的协议,比如mysql,redis等等这些直接使用端口进行连接访问的服务等,其都是通过tcp/udp协进行连接的。

对于这种工作在4层传输层的服务,同样也可以使用nginx进行反向代理和负载均衡。下面就详解的记录介绍一下如何通过nginx实现TCP/UDP的反向代理和负载均衡。

正文

1. 准备nginx

首先,没安装nginx的话,请参考我的另一篇博文进行nginx安装:

《centos7 nginx 安装与配置实现负载均衡》

要实现4层反向代理和负载均衡需要nginx的一个模块:---with-stream,此模块在使用yum安装nginx时会自动默认安装,如果是使用源码安装则需要执行添加此模块。

可查看nginx是否已加载此模块

$ nginx -V

2. 配置

准备好nginx后,直接修改nginx配置文件,在文件最后添加如下内容

# 编辑nginx配置文件
$ vim /etc/nginx/conf/nginx.conf
----------------------------------------------------------------
# stream模块,就跟http模块同级,不在http模块内
stream {
        # 设置代理超时时间,设的大一些,避免长连接因为超时时间而中断
        proxy_timeout 365d;

        # 可配置多个server监听,配置监听端口和代理的ip和端口
        server {             
          listen 3306;
          proxy_pass 192.168.0.1:3306;
        }
        server {
          listen 3307;
          proxy_pass 192.168.0.2:3306;
        }

        # 在stream中,也是可以使用负载均衡的upstream的
        # 与http负载均衡类似:
        upstream mysql{
          server 192.168.0.1:3306;
          server 192.168.0.2:3306;
        }
        server {
          listen 33333;
          # 在server中使用upstream的名称来使用负载均衡
          proxy_pass myqsl;
        }
}
----------------------------------------------------------------

# 重载nginx生效
$ systemctl reload nginx

上面配置就是通过nginx反向代理,将数据库的3306端口代理到nginx所在服务器的3306,3307端口。且使用33333端口则可以进行负载均衡,负载连接这两个mysql数据库。

这里就有一个问题,nginx反向代理默认的超时时间为60s,也就是说就算你连接上了mysql数据库,如果你超过60s没有进行操作,连接就中断了。所以对于一些需要长时间连接的服务,需要设置一个时间,在配置中也已说明。

结束

    ok,到此就完成了TCP/UDP的反向代理和负载均衡。非常的方便除此之外,还有一些别的配置,具体可参考nginx官网。

有任何问题,欢迎留言