Linux下Nginx转发TCP/UDP(替代rinetd)

在生产环境中使用rinetd做端口,连续碰到数次莫名的进程关闭和假死情况,原因还没有深究。使用Nginx替换后,再没有出现过此类情况。rinetd转发参照:Linux使用rinetd进行端口转发

从1.9.0开始,nginx支持TCP转发,1.9.13开始支持UDP转发。提供此功能的模块为ngx_stream_core。不过Nginx默认没有开启此模块,所以需要手动安装。

一、Nginx安装

1、下载Nginx

需要下载1.9.0以后版本,官方下载地址:http://nginx.org/en/download.html

1
2
cd /root/software/
wget http://nginx.org/download/nginx-1.21.0.tar.gz

2、解压

1
2
cd /root/software/
tar zxvf nginx-1.21.0.tar.gz

3、安装

进入解压后的Nginx目录,执行打包和安装操作

1
2
3
cd /root/software/nginx-1.21.0/
./configure --prefix=/opt/nginx --with-stream --without-http
make && make install

注意:此处只用到转发模块,故禁用了http模块,禁用命令为:–without-http

二、配置Stream节点

1、配置nginx.conf

将日志文件保存到root下,方便管理。生成日志路径:

1
2
mkdir /root/logs
mkdir /root/logs/nginx

编辑Nginx配置文件nginx.conf:

1
vim /opt/nginx/conf/nginx.conf

增加如下配置:

01
02
03
04
05
06
07
08
09
10
11
12
13
stream {
 
    log_format proxy '$remote_addr [$time_local] '
                 '$protocol $status $bytes_sent $bytes_received '
                 '$session_time "$upstream_addr" '
                 '"$upstream_bytes_sent" "$upstream_bytes_received" "$upstream_connect_time"';
 
    access_log /root/logs/nginx/tcp-access.log proxy ;
    open_log_file_cache off;
 
    # 统一放置,方便管理
    include /root/nginx/*.conf;
}

由于移除了http模块,故需注释http配置,nginx.conf完整配置如下:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#user  nobody;
worker_processes  1;
 
#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;
 
#pid        logs/nginx.pid;
 
events {
    worker_connections  1024;
}
 
stream {
 
    log_format proxy '$remote_addr [$time_local] '
                 '$protocol $status $bytes_sent $bytes_received '
                 '$session_time "$upstream_addr" '
                 '"$upstream_bytes_sent" "$upstream_bytes_received" "$upstream_connect_time"';
 
    access_log /root/logs/nginx/tcp-access.log proxy ;
    open_log_file_cache off;
 
    # 统一放置,方便管理
    include /root/nginx/*.conf;
}

2、转发配置

创建配置存放文件夹

1
mkdir /root/nginx

添加端口转发配置文件:

1
vim /root/nginx/tcp3306.conf
01
02
03
04
05
06
07
08
09
10
upstream tcp3306 {
    server rm-****.mysql.rds.aliyuncs.com:3306;
}
 
server {
    listen 3306;
    proxy_connect_timeout 8s;
    proxy_timeout 24h;
    proxy_pass tcp3306;
}

配置多个端口转发时,可再新增一个配置文件:

1
vim /root/nginx/tcp6379.conf
01
02
03
04
05
06
07
08
09
10
upstream tcp6379 {
    server r-****.redis.rds.aliyuncs.com:6379;
}
 
server {
    listen 6379;
    proxy_connect_timeout 8s;
    proxy_timeout 24h;
    proxy_pass tcp6379;
}

3、Stream节点解析

参照:Nginx转发TCP/UDP端口Stream节点解析

三、启动/重启Nginx

1、测试Nginx

1
/opt/nginx/sbin/nginx -t

2、启动Nginx

1
/opt/nginx/sbin/nginx

3、重启Nginx

1
/opt/nginx/sbin/nginx -s reload

四、开机启动

1、编辑rc.local文件

1
vi /etc/rc.d/rc.local

2、加入如下启动命令 

1
/opt/nginx/sbin/nginx

发表评论

欢迎阅读『Linux下Nginx转发TCP/UDP(替代rinetd)|Linux|Nick Tan-梓潼Blog』