处理传统的HTTP流量(应用层)外,Nginx还可以通过ngx_stream_core_module模块代理TCP/UDP流量(传输层),通常用于负载均衡、代理、转发或流量处理等目的。官方文档:ngx_stream_core_module、官方文档:Module ngx_stream_proxy_module。
启用ngx_stream_core_module模块
此模块需要非默认构建,需要额外使用--with-stream
配置参数以启用此模块。通过以下指令查看当前编译的模块:
./nginx -V
若不存在--with-stream
则需要重新编译安装。
stream常用配置参数
每个代理都位于一个server块中,配置文件的结构如下:
......
events
{
......
}
stream {
upstream backend {
......
}
server {
......
}
}
listen(监听地址、端口)
指定监听的地址、端口。
未添加udp
参数时则默认代理tcp流量。未添加IPv6地址的端口默认代理IPv4流量。添加reuseport
则会为每个工作进程创建单独的监听套接字,恰当使用可以提高网络性能。
监听IPv4:12345端口上的TCP流量:
listen 12345;
监听IPv4、IPv6:12345端口上的TCP流量:
listen 12345;
listen [::]:12345;
监听IPv4、IPv6:12345端口上的TCP、UDP流量:
listen 12345;
listen [::]:12345;
listen 12345 udp;
listen [::]:12345 udp;
监听IPv4、IPv6:12345端口上的TCP、UDP流量,并启用reuseport
:
listen 12345 reuseport;
listen [::]:12345 reuseport;
listen 12345 udp reuseport;
listen [::]:12345 udp reuseport;
proxy_pass(代理服务器)
将流量传送给指定的服务器,这个服务器可以是IP加端口:
server {
listen 12345;
proxy_pass 127.0.0.1:12345;
}
也可以是一个upstream:
upstream backend {
server 127.0.0.1:12345;
}
server {
listen 12345;
proxy_pass backend;
}
proxy_timeout(代理超时)
客户端/服务器响应的超时时间,超时将断开连接,默认值10m
。在服务器需要较长处理时间的情况下,proxy_timeout
过短会导致服务器处理时就断开连接。
proxy_connect_timeout(代理连接超时)
与代理服务器建立连接的超时时间。
例子
使用Nginx代理IPv6下的WoL流量
在IPv4的情况下,通常使用静态ARP将待唤醒主机绑定到指定IP,并通过端口映射将一外部端口映射到待唤醒主机的静态IP,因此在外部向网络中发送魔术包到指定端口即可将魔术包转发到待唤醒主机上。
通常IPv6的地址分配方法为SLAAC,也就意味着不像IPv4可以使用静态ARP分配地址,因此魔术包很难在外部网络发送到本地网络中。因此,可以本地网络中通过Nginx代理IPv6的UDP流量并转发到IPv4网络中以实现类似于原来IPv4的唤醒方法:
server {
listen [::]:7 udp;
listen [::]:9 udp;
proxy_pass local_static_ip:7;
}
将魔术包通过IPv6发送到Nginx所在服务器的7或9端口即可将魔术包转发到IPv4网络中。
使用Nginx代理IPv4、IPv6的RDP流量
默认情况下,RDP会使用TCP、UDP流量,因此需要同时代理TCP、UDP流量:
server {
listen 3389 reuseport;
listen [::]:3389 reuseport;
listen 3389 udp reuseport;
listen [::]:3389 udp reuseport;
proxy_pass ip:3389;
proxy_timeout 5s;
}
使用Nginx代理IPv4、IPv6的Minecraft Java Server、Geyser流量
Minecraft Java Server使用TCP,Minecraft Bedrock Server使用UDP,若使用Geyser代理Minecraft Bedrock流量,则reuseport
是必须的。Geyser还可以启用proxy_protocol以获取真实的IP地址。
server {
listen 25565 reuseport;
listen [::]:25565 reuseport;
proxy_pass ip:25565;
proxy_timeout 5s;
}
server {
# 在使用Geyser时,此处的reuseport是必须的
listen 19132 udp reuseport;
listen [::]:19132 udp reuseport;
proxy_pass ip:19132;
proxy_timeout 5s;
# Geyser使用proxy_protocol时启用
# proxy_protocol on;
}