Nginx转发TCP/UDP

环境准备:

[root@teddylu1987 teddylu]# cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)
[root@teddylu1987 teddylu]# uname -a
Linux teddylu1987 3.10.0-957.12.2.el7.x86_64 #1 SMP Tue May 14 21:24:32 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux

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

./configure --prefix=/usr/local/nginx --with-stream

在Nginx上配置,TCP转发

目标:通过3310 端口访问本机Mysql(其中mysql使用docker实现的,运行端口是默认的3306)

在主配置文件中,添加一下内容:

stream {
server {
listen 3310;
proxy_pass 127.0.0.1:3306;
}
}

PS:stream和http是同一级别的

之后,检查配置文件,如果没有问题,就重启nginx,就会发现3310端口已经启动了

[root@teddylu1987 teddylu]# netstat -lntp|grep 3310
tcp 0 0 0.0.0.0:3310 0.0.0.0:* LISTEN 25363/nginx: master

现在用mysql客户端软件(如Navicat)通过服务器的ip:3310来访问mysql服务了

UDP转发

目标: 发送UDP数据到9999端口,10000端口可以接收

在主配置文件中,添加一下内容:

stream {
server {
listen 9999 udp;
proxy_pass 127.0.0.1:10000;
}
}

这里写一个my_socket_server.py侦听在10000端口,用于接收UDP数据:

# coding=utf-8

import socket

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

sock.bind(('127.0.0.1', 10000))

print ('start server on [%s]:%s' % ('127.0.0.1', 10000))

while True:
    data, addr = sock.recvfrom(1024)
    print ('Received from %s:%s' % (addr,data))
    sock.sendto(b'Hello, %s!' % data, addr)

再写一个my_socket_client.py用于向Nginx侦听的9999端口发送数据:

# coding=utf-8

import socket

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

while True:
    data = raw_input('Input msg: ')
    if len(data) == 0:
        continue
    s.sendto(data.encode(), ('127.0.0.1', 9999))
    print (s.recv(1024).decode('utf-8'))

同时运行两个脚本,在client端发送数据:

参考:

https://www.jianshu.com/p/244386221cc5

Nginx转发TCP/UDP
0 0 votes
Article Rating
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments
Scroll to top
0
Would love your thoughts, please comment.x
()
x