Nginx如何实现反向代理TCP/UDP协议?

Nginx可以通过ngx_stream_core_module模块实现TCP/UDP协议的反向代理。步骤如下:

  1. 在stream {}块配置监听的端口与协议(tcp或udp)。
stream {
    upstream tcp_servers { ... }

    server {
        listen 12345 tcp;  # 监听TCP端口
        proxy_pass tcp_servers;
    }
} 
  1. 在upstream {}块定义上游服务器组,类似于http代理。可使用ip_hash、least_conn等策略。
stream {
    upstream tcp_servers {
        least_conn;
        server 127.0.0.1:8000;
        server 127.0.0.1:8001;
    }
}
  1. 使用proxy_pass将请求转发到上游服务器。
  2. 使用proxy_timeout设置超时时间,类似http代理。
  3. 可以根据源地址或目标地址使用map指令实现访问控制。
map $server_addr $blocking {
    default         0;
    192.168.1.1     1;  # 拒绝此地址
}

server {
    proxy_pass tcp_servers;
    proxy_timeout 10s;
    access_log /var/log/nginx/tcp.access.log;

    if ($blocking = 1) {  
        return 403;  # 如果在map列表中,返回403
    }
}

例如完整的tcp反向代理配置:

stream {
    upstream tcp_servers {
        least_conn;
        server 127.0.0.1:8000;
        server 127.0.0.1:8001;
    }

    map $server_addr $blocking {
       default         0;
       192.168.1.1     1;
    }

    server {
        listen 12345;
        proxy_pass tcp_servers;
        proxy_timeout 10s; 
        access_log /var/log/nginx/tcp.access.log;

        if ($blocking = 1) {
            return 403;
        }
    } 
}

这种配置实现了TCP协议的负载均衡与反向代理,可用于代理数据库、CDN等TCP服务,提高服务稳定性。