插件窝 干货文章 nginx实现TCP反向代理的示例代码

nginx实现TCP反向代理的示例代码

配置 server Nginx proxy 496    来源:    2025-04-02

Nginx实现TCP反向代理的配置示例

Nginx从1.9.0版本开始支持TCP/UDP的反向代理功能。以下是实现TCP反向代理的详细配置示例:

基础配置

# 在nginx.conf主配置文件中添加stream模块配置
stream {
    # 定义上游服务器组
    upstream backend {
        server backend1.example.com:12345;
        server backend2.example.com:12345;
    }

    # TCP代理服务器配置
    server {
        listen 23456;  # 监听端口
        proxy_pass backend;  # 转发到上游服务器组
        proxy_timeout 3s;  # 超时设置
        proxy_connect_timeout 1s;  # 连接超时
    }
}

高级配置示例

stream {
    # 负载均衡配置
    upstream mysql_servers {
        least_conn;  # 最少连接数算法
        server db1.example.com:3306 weight=2;
        server db2.example.com:3306;
        server db3.example.com:3306 backup;  # 备用服务器
    }

    # MySQL代理配置
    server {
        listen 3306;
        proxy_pass mysql_servers;
        proxy_buffer_size 16k;  # 缓冲区大小
    }

    # Redis代理配置
    upstream redis_server {
        server redis.example.com:6379;
    }

    server {
        listen 6379;
        proxy_pass redis_server;
    }

    # SSL/TLS终止配置
    upstream secure_backend {
        server secure.example.com:443;
    }

    server {
        listen 443;
        proxy_pass secure_backend;
        ssl on;
        ssl_certificate /path/to/cert.pem;
        ssl_certificate_key /path/to/key.pem;
        ssl_protocols TLSv1.2 TLSv1.3;
    }
}

注意事项

  1. 模块加载:确保编译Nginx时包含了--with-stream模块

    ./configure --with-stream
    
  2. 日志配置:可以在stream块中添加日志记录

    log_format tcp_proxy '$remote_addr [$time_local] '
                      '$protocol $status $bytes_sent $bytes_received '
                      '$session_time "$upstream_addr"';
    
    access_log /var/log/nginx/tcp-access.log tcp_proxy;
    
  3. 性能调优

    stream {
       proxy_responses 1;  # 等待后端响应数
       proxy_next_upstream on;  # 故障转移
       proxy_next_upstream_timeout 2s;
       proxy_next_upstream_tries 3;
    }
    
  4. 健康检查(需要商业版Nginx Plus):

    upstream backend {
       server backend1.example.com:12345 max_fails=2 fail_timeout=30s;
       health_check interval=10s passes=2 fails=3;
    }
    

常见问题解决

  1. 连接被拒绝

    • 检查上游服务器是否运行并监听正确端口
    • 检查防火墙设置
  2. 性能问题

    • 调整worker_processesworker_connections
    • 考虑启用reuseport选项
  3. SSL问题

    • 确保证书路径正确
    • 检查SSL协议和密码套件配置
  4. 模块未加载

    • 使用nginx -V检查是否包含--with-stream
    • 重新编译Nginx添加stream模块

以上配置可以根据实际需求进行调整,Nginx的TCP代理功能非常适合数据库、消息队列等TCP服务的负载均衡和反向代理场景。