Last Updated on
前言
nginx作为一个高性能的反向代理服务器,常用于做http(s)的反向代理。但有时候除了http的web服务需要反向代理外。还经常会碰到非http的协议,比如mysql,redis等等这些直接使用端口进行连接访问的服务等,其都是通过tcp/udp协进行连接的。
对于这种工作在4层传输层的服务,同样也可以使用nginx进行反向代理和负载均衡。下面就详解的记录介绍一下如何通过nginx实现TCP/UDP的反向代理和负载均衡。
正文
1. 准备nginx
首先,没安装nginx的话,请参考我的另一篇博文进行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官网。
有任何问题,欢迎留言
这个配置文件我没看懂,upstream 里面是两个服务器的mysql数据库端口(mysql-A、mysql-B),分别被反代到nginx服务器的3306 3307端口上,然后用nginx服务器上的33333端口负载均衡。nginx怎么区分这两个mysql数据库的访问呢。就比如说我要访问mysql-A,也是先进入nginx的33333端口,怎么转发到mysql-A上。