环境准备:
[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