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

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

2、解压

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

3、安装

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

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下,方便管理。生成日志路径:

mkdir /root/logs
mkdir /root/logs/nginx

编辑Nginx配置文件nginx.conf:

vim /opt/nginx/conf/nginx.conf

增加如下配置:

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完整配置如下:

#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、转发配置

创建配置存放文件夹

mkdir /root/nginx

添加端口转发配置文件:

vim /root/nginx/tcp3306.conf
upstream tcp3306 {
    server rm-****.mysql.rds.aliyuncs.com:3306;
}

server {
    listen 3306;
    proxy_connect_timeout 8s;
    proxy_timeout 24h;
    proxy_pass tcp3306;
}

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

vim /root/nginx/tcp6379.conf
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

/opt/nginx/sbin/nginx -t

2、启动Nginx

/opt/nginx/sbin/nginx

3、重启Nginx

/opt/nginx/sbin/nginx -s reload

四、开机启动

1、编辑rc.local文件

vi /etc/rc.d/rc.local

2、加入如下启动命令 

/opt/nginx/sbin/nginx

发表评论