Tian Jiale's Blog

Nginx 中按域名转发 TCP 连接

编译安装 Nginx

上接 NGINX 入门指导,由于安装版本号为 1.20.1 所以不考虑旧版适配问题,其中编译选项增加的模块 --with-stream--with-stream_ssl_preread_module 就是本次需要的功能模块。

配置 Nginx

由于是转发的 TCP 连接,所以不再使用在 http 模块中添加内容,而是在 stream 中添加,如下是简单的 TCP 连接转发配置:

stream {
    server {
        listen 7854;
        proxy_connect_timeout 3s;
        proxy_timeout 3600s;
        proxy_pass 127.0.0.1:3306;
    }
}

本次使用 ssl_preread 功能实现依据域名转发 TCP 连接。

stream {
    map $ssl_preread_server_name $name {
        git.aecra.cn git_ssh_backend;
        default ssh_default_backend;
    }

    upstream git_ssh_backend {
        server 127.0.0.1:7022;
    }

    upstream ssh_default_backend {
        server 127.0.0.1:1022;
    }

    server {
        listen 22;
        proxy_connect_timeout 3s;
        proxy_timeout 36000s;
        proxy_pass $name;
        ssl_preread on;
    }
}

其中 7022 端口是 Git 服务,1022 端口是 ssh 服务。通过 Nginx 的转发我们可以在一个 22 端口上实现多个 ssh 服务。