前言
nginx 从 1.9.0 开始支持 tcp 转发,1.9.13 支持 udp 转发。利用 nginx 数据转发模块我们可以方便的进行链路优化。
本次演示在 linux 下进行,包括 debian 和 centos。debian 使用的是 debian9,centos 使用的是 centos7。
如果你使用了云服务商提供的外部防火墙的话,你还需要参考云服务商的文档进行配置。或者你使用了云服务商提供的修改过的系统比如 aliyun ,请参考 yun 服务商的文档配置防火墙。
fedora 官方源打包的 nginx 不包含 tcp/upd 数据转发模块,这是我之前踩过的坑,这里只是顺便说一下,本文不演示 fedora 的 nginx tcp/upd 数据转发。
安装 nginx
在使用 nginx tcp/udp 数据转发模块之前当然是需要先安装 nginx 啦。
debian9 默认源的 nginx 版本为 1.10.+ 是包含 tcp/udp 数据转发模块的,所以直接安装就好。centos 需要先添加 nginx 官方源,然后再安装 nginx。
** debian9 安装 nginx**
更新软件源:
sudo apt update
安装 nginx:
sudo apt install nginx
到这里 nginx 就安装完成了,没错就是这么简单。
** centos7 安装 nginx **
由于 centos7 官方源并不包含 nginx ,所以我们需要先添加 nginx 官网源,然后再安装 nginx。
添加 nginx 的官方源
rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
安装 nginx
sudo yum install nginx
配置 nginx tcp / udp 数据转发
配置一定要添加在 /etc/nginx/nginx.conf,不要自己玩骚操作在 /etc/ngonx/conf.d/ 添加配置文件,这是 tcp 数据转发不是 http。
在 /etc/nginx/nginx.conf 最下面添加以下内容
stream {
server {
listen 8443; # 这里是本地监听的 tcp 端口 可以只写端口,也可以写本机的 ip地址加上端口类似于这样 ipv4:8443 [ipv6]:8443
listen 8443 udp; #规则与上面一个相同,在最后加上 udp 就监听 udp 了,如果不需要 udp 转发的话这一句可以删掉
proxy_pass master; #将本机端口的请求转发到那个模块
}
upstream master { # 这里就是被转发的模块
server 26.26.26.26:9000; #这里就是远程地址了,这就是我们需要代理的目标地址,在使用的时候一定要修改这一行
}
}
配置文件写入后一定要检测配置文件的正确性。
检测配置文件:
sudo nginx -t
如果出现以下的信息,就代表配置成功了,如果不是请再检查一下配置文件是否写入正确
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
到这里 nginx tcp/udp 转发就配置完成了。
启动服务
nginx 在 linux 环境中配置都是一样的,只是默认运行状态有些不同,以下将给出 centos 和 debian 的运行参考方式。
** debian9 请执行以下命令 **
debian 使用 apt 安装的软件,如果软件需要自启动的话是默认开启的,而且默认运行,我们只需要重启一下 nginx 就好
重启 nginx
sudo systemctl restart nginx
到这里 debian 的 nginx 服务就配置完成了。
** centos7 请执行以下命令 **
运行 nginx
sudo systemctl start nginx
开启自启动
sudo systemctl enable nginx
centos 的防火墙默认拒绝外部连接,所以我们还需要允许 nginx 所监听端口的访问权限。
centos7 的防火墙可以热加载,所以我们开启端口访问权限时候不需要重启防火墙,只是需要添加两次防火墙,分别是重启前的防火墙规则和重启后的规则。
开启端口访问,以下命令中的 9000 请替换为你的实际监听端口
sudo firewall-cmd --add-port=9000/tcp
如果 监听了 udp 的话那把 udp 的端口也加上
sudo firewall-cmd --add-port=9000/udp
为了防止重启后失效,加上 --permanent
参数再添加一次防火墙规则,注意 --permanent
只在重启后生效,没进行重启是不生效的,所以我们才需要添加两次规则
tcp部分
sudo firewall-cmd --add-port=9000/tcp --permanent
udp 部分
sudo firewall-cmd --add-port=9000/udp --permanent
参考
如果只是使用 tcp 转发的话可以参考我的另外一篇教程 go tcp 转发