插件窝 干货文章 如何实现Nginx的TCP/UDP代理配置

如何实现Nginx的TCP/UDP代理配置

Nginx 代理 backend server 880    来源:    2025-04-10

Nginx TCP/UDP代理配置指南

Nginx不仅可以作为HTTP反向代理,还可以作为TCP和UDP流量的代理服务器。以下是实现Nginx TCP/UDP代理的详细配置方法。

前提条件

  1. Nginx版本1.9.0及以上(TCP代理)
  2. Nginx版本1.9.13及以上(UDP代理)
  3. 确保编译时包含--with-stream模块(可通过nginx -V查看)

基础TCP代理配置

  1. 在nginx.conf主配置文件中添加stream模块:
# 主配置文件nginx.conf中
events {
    worker_connections  1024;
}

# 添加stream块,与http块同级
stream {
    include /etc/nginx/conf.d/*.stream;
}
  1. 创建单独的stream配置文件(如/etc/nginx/conf.d/mysql.stream):
# MySQL TCP代理示例
server {
    listen 3306; # 代理监听端口
    proxy_pass db_server:3306; # 后端服务器地址
    proxy_connect_timeout 1s;
    proxy_timeout 3s;
}

高级TCP代理配置

stream {
    # 定义上游服务器组
    upstream backend {
        server backend1.example.com:12345;
        server backend2.example.com:12345;
    }

    server {
        listen 12345;
        proxy_pass backend;

        # 连接超时设置
        proxy_connect_timeout 5s;

        # 代理超时设置
        proxy_timeout 30s;

        # 缓冲区大小
        proxy_buffer_size 16k;
    }
}

UDP代理配置

stream {
    server {
        listen 53 udp; # DNS服务示例
        proxy_pass dns_servers;
        proxy_timeout 1s;
        proxy_responses 1; # 期望的响应数
    }

    upstream dns_servers {
        server 8.8.8.8:53;
        server 8.8.4.4:53;
    }
}

SSL/TLS终止的TCP代理

stream {
    server {
        listen 443 ssl;
        proxy_pass backend;

        ssl_certificate /path/to/cert.pem;
        ssl_certificate_key /path/to/key.pem;
        ssl_protocols TLSv1.2 TLSv1.3;
        ssl_ciphers HIGH:!aNULL:!MD5;
    }

    upstream backend {
        server backend.example.com:443;
    }
}

负载均衡策略

Nginx stream模块支持多种负载均衡方式:

upstream backend {
    # 默认轮询
    server backend1.example.com:12345;
    server backend2.example.com:12345;

    # 最少连接数
    least_conn;

    # 哈希算法
    hash $remote_addr consistent;

    # 权重分配
    server backend3.example.com:12345 weight=2;
}

健康检查

upstream backend {
    zone backend 64k;
    server backend1.example.com:12345 max_fails=2 fail_timeout=30s;
    server backend2.example.com:12345 max_fails=2 fail_timeout=30s;
}

日志配置

stream {
    log_format basic '$remote_addr [$time_local] '
                     '$protocol $status $bytes_sent $bytes_received '
                     '$session_time';

    access_log /var/log/nginx/stream-access.log basic;
    error_log /var/log/nginx/stream-error.log;
}

常见问题解决

  1. 模块未加载:确保编译时包含--with-stream模块
  2. 权限问题:Nginx需要监听1024以下端口时,确保以root启动或设置CAP_NET_BIND_SERVICE能力
  3. 连接超时:适当调整proxy_connect_timeoutproxy_timeout
  4. 性能问题:对于高并发场景,调整worker_processesworker_connections

验证配置

# 检查配置语法
nginx -t

# 重新加载配置
nginx -s reload

通过以上配置,您可以灵活地实现各种TCP/UDP代理场景,包括数据库代理、DNS代理、游戏服务器代理等。