插件窝 干货文章 干货:基于nginx的tcp反向代理案例

干货:基于nginx的tcp反向代理案例

server Nginx proxy stream 754    来源:    2025-05-10

基于Nginx的TCP反向代理配置指南

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

基础TCP反向代理配置

1. 启用Nginx的stream模块

确保你的Nginx编译时包含了--with-stream模块。在nginx.conf的全局部分添加:

load_module modules/ngx_stream_module.so;

2. 基本TCP代理配置

stream {
    server {
        listen 3306;  # 监听本机3306端口
        proxy_pass db_server:3306;  # 转发到后端MySQL服务器
    }
}

高级配置选项

1. 多后端服务器负载均衡

stream {
    upstream db_backend {
        server db1.example.com:3306 weight=5;
        server db2.example.com:3306;
        server db3.example.com:3306 backup;
    }

    server {
        listen 3306;
        proxy_pass db_backend;
        proxy_connect_timeout 1s;
    }
}

2. SSL/TLS终止

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

3. UDP代理

stream {
    server {
        listen 53 udp;
        proxy_pass dns_servers;
        proxy_timeout 1s;
    }

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

实际应用案例

案例1:MySQL读写分离

stream {
    upstream mysql_read {
        server read1.example.com:3306;
        server read2.example.com:3306;
    }

    upstream mysql_write {
        server write.example.com:3306;
    }

    server {
        listen 3306;
        proxy_pass mysql_write;
    }

    server {
        listen 3307;
        proxy_pass mysql_read;
    }
}

案例2:SSH跳板机

stream {
    server {
        listen 2222;
        proxy_pass backend_ssh;
        proxy_connect_timeout 1s;
    }

    upstream backend_ssh {
        server 192.168.1.10:22;
        server 192.168.1.11:22;
    }
}

性能优化配置

stream {
    proxy_buffer_size 16k;
    proxy_timeout 30s;

    server {
        listen 5432;
        proxy_pass postgres_servers;
        proxy_connect_timeout 2s;
        proxy_socket_keepalive on;
    }
}

注意事项

  1. Stream模块配置与http模块同级,不能嵌套在http块内
  2. 对于高并发场景,可能需要调整系统级别的文件描述符限制
  3. TCP代理不支持HTTP特有的功能如header修改、URL重写等
  4. 日志记录需要使用stream模块专用的日志格式

调试技巧

  1. 检查Nginx错误日志:tail -f /var/log/nginx/error.log
  2. 使用telnet或nc测试端口连通性
  3. 增加日志级别:error_log /var/log/nginx/error.log debug;

通过以上配置,你可以灵活地实现各种TCP/UDP服务的反向代理和负载均衡。