使用Nginx给TCP服务端绑定域名

一、需要Nginx安装stream功能,宝塔的nginx默认是没有安装的,需要改nginx.sh安装文件

  1. 找到/www/server/panel/install/nginx.sh
  2. 修改./configure开头的哪一行 ${jemallocLD} ${ENABLE_NGX_PAGESPEED} ${ADD_EXTENSION}前面添加 --with-stream

二、增加stream配置,这个配置默认级别最高,可以在nginx.conf增加server,也可以增加vhost,宝塔的默认配置文件在/www/server/panel/vhost/nginx/tcp目录下,实例如:

map $ssl_preread_server_name $backend
{
test.com 127.0.0.1:9999;
default 127.0.0.1:9999;
}
server
{
listen 9601;
# 后端服务器的地址和端口
proxy_pass $backend;
}

三、关于配置文件的解释,以下内容来自ChatGPT的对话说明

$ssl_preread_server_name 是一个 Nginx 变量,用于在 SSL 握手前获取客户端请求中的 SNI(Server Name Indication)。SNI 是 TLS/SSL 协议的一部分,用于指示客户端请求的主机名,以便服务器可以根据主机名选择正确的证书进行握手。

stream 模块中,$ssl_preread_server_name 变量包含客户端请求中的 SNI 值。你可以使用这个值来根据不同的主机名进行条件判断,从而选择不同的后端服务器或执行其他逻辑。

以下是一个简单的示例,演示如何使用 $ssl_preread_server_name 进行条件判断:

nginxCopy code

stream { map $ssl_preread_server_name $backend { example.com backend_server_ip:backend_server_port; another.example.com another_backend_ip:another_backend_port; default fallback_backend_ip:fallback_backend_port; } server { listen 12345; proxy_pass $backend; } }

在这个例子中,map 指令将 $ssl_preread_server_name 的值映射到相应的后端服务器。如果 SNI 为 example.com,则请求将被代理到 backend_server_ip:backend_server_port;如果是 another.example.com,则会被代理到 another_backend_ip:another_backend_port;否则,使用默认值 fallback_backend_ip:fallback_backend_port