一、ssh(sftp)和https共用同一端口【Nginx根据TLS/SSL分流】
sftp是Secure File Transfer Protocol的缩写,安全文件传送协议。可以为传输文件提供一种安全的网络的加密方法。sftp 与 ftp 有着几乎一样的语法和功能,SFTP 为 SSH的其中一部分。
stream {
upstream ssh {
server ssh.example.com:22;
}
upstream web {
server tls.example.com:443;
}
map $ssl_preread_protocol $upstream {
"" ssh;
default web;
}
# SSH and SSL on the same port
server {
listen 443;
listen [::]:443;
proxy_pass $upstream;
ssl_preread on;
}
}
ssl_preread_protocol
指令是用来在进行 SSL/TLS 握手之前,预读取客户端发送过来的协议类型,以便将请求路由到正确的后端服务器。可以用来在同一个 IP 地址上,同时部署多个服务器,例如部署不同协议的服务器 (HTTP / HTTPS)或不同版本的服务器( TLS 1.2 / 1.3) 。
Generated by Chatgpt:
这段代码定义了一个 nginx 的配置文件的一部分,它定义了一个使用 SSL/TLS 和 SSH 协议的流式协议服务器。
这段代码中定义了三个部分:
upstream
指令,定义了两个上游服务器集群,一个是 ssh 集群,另一个是 web 集群,两个集群都只有一台服务器,ssh 集群的服务器监听在 ssh.example.com 上的端口22,web 集群的服务器监听在tls.example.com上的端口443map
指令, 定义了一个名为 $upstream 的变量,并使用了 $ssl_preread_protocol 来进行映射。如果 $ssl_preread_protocol 的值是空字符串,那么 $upstream 的值就是 ssh;如果 $ssl_preread_protocol 的值是其他值,那么 $upstream 的值就是 web。server
指令,定义了一个流式协议服务器,监听端口443 (支持ipv6) ,开启了ssl_preread指令。并且使用了 proxy_pass 指令将请求转发到 $upstream 变量对应的上游服务器集群。当请求到达这个服务器时,会先预读取请求中的协议类型,如果是"" (也就是空字符串) 就转发到 ssh 集群,否则转发到web集群, 这样就支持了在同一端口上使用不同协议来提供服务。总的来说, 这段代码定义了一个使用 SSL/TLS 和 SSH 协议的流式协议服务器,并且使用了ssl_preread_protocol来预读取协议类型,基于协议类型来路由请求,实现在同一个端口上支持多种协议的服务
关于上述配置后,可能会存在后端或日志中存在内网IP的问题,解决方法详见nginx使用stream转发传递真实IP
二、【Nginx根据ALPN分流】
ssl_preread_alpn_protocols
指令支持一个由空格分隔的协议列表作为参数,每个协议都必须是一个有效的协议名称。在 ALPN 中支持的协议取决于客户端和服务器使用的 SSL/TLS 库。
常见的 ALPN 协议有:
- h2: HTTP/2 协议
- http/1.1: HTTP/1.1 协议
- h3: HTTP/3协议
stream {
map $ssl_preread_alpn_protocols $proxy {
~\h2\b 127.0.0.1:8001;
~\http/1.1\b 127.0.0.1:8002;
~\xmpp-client\b 127.0.0.1:8003;
}
server {
listen 9000;
listen [::]:9000;
proxy_pass $proxy;
ssl_preread on;
}
}
xmpp-client
是 Extensible Messaging and Presence Protocol (XMPP) 客户端协议的名称,它是一种开放协议,通常用于在应用之间进行实时通信。XMPP 允许跨平台和跨语言的通信,它可以用于多种应用,如即时通信(IM)、网络会议和消息推送等。在
ssl_preread_alpn_protocols
指令中使用xmpp-client
,意味着你要预读取这种协议类型,并在请求中匹配,然后路由到特定的后端服务器,通常是xmpp相关的服务器.
三、【Nginx根据SNI分流】
ssl_preread_server_name
指令是 nginx 中用来在进行 SSL/TLS 握手之前,预读取客户端发送过来的 Server Name Indication (SNI) 信息。 SNI 是一种扩展,允许客户端在进行 SSL/TLS 握手时向服务器发送主机名,以便服务器可以根据主机名来选择适当的证书。
stream {
map $ssl_preread_server_name $name {
backend.example.com backend;
default backend2;
}
upstream backend {
server 192.168.0.2:12345;
}
upstream backend2 {
server 192.168.0.3:12345;
}
server {
listen 12346;
listen [::]:12346;
proxy_pass $name;
ssl_preread on;
}
}
参考内容:
Module ngx_stream_ssl_preread_module (nginx.org)
Nginx配置一个端口同时处理多种协议 ### 一、ssh(sftp)和https共用同一端口【Nginx根据TLS/SSL分流】
sftp是Secure File Transfer Protocol的缩写,安全文件传送协议。可以为传输文件提供一种安全的网络的加密方法。sftp 与 ftp 有着几乎一样的语法和功能,SFTP 为 SSH的其中一部分。
stream {
upstream ssh {
server ssh.example.com:22;
}
upstream web {
server tls.example.com:443;
}
map $ssl_preread_protocol $upstream {
"" ssh;
default web;
}
# SSH and SSL on the same port
server {
listen 443;
listen [::]:443;
proxy_pass $upstream;
ssl_preread on;
}
}
ssl_preread_protocol
指令是用来在进行 SSL/TLS 握手之前,预读取客户端发送过来的协议类型,以便将请求路由到正确的后端服务器。可以用来在同一个 IP 地址上,同时部署多个服务器,例如部署不同协议的服务器 (HTTP / HTTPS)或不同版本的服务器( TLS 1.2 / 1.3) 。
Generated by Chatgpt:
这段代码定义了一个 nginx 的配置文件的一部分,它定义了一个使用 SSL/TLS 和 SSH 协议的流式协议服务器。
这段代码中定义了三个部分:
upstream
指令,定义了两个上游服务器集群,一个是 ssh 集群,另一个是 web 集群,两个集群都只有一台服务器,ssh 集群的服务器监听在 ssh.example.com 上的端口22,web 集群的服务器监听在tls.example.com上的端口443map
指令, 定义了一个名为 $upstream 的变量,并使用了 $ssl_preread_protocol 来进行映射。如果 $ssl_preread_protocol 的值是空字符串,那么 $upstream 的值就是 ssh;如果 $ssl_preread_protocol 的值是其他值,那么 $upstream 的值就是 web。server
指令,定义了一个流式协议服务器,监听端口443 (支持ipv6) ,开启了ssl_preread指令。并且使用了 proxy_pass 指令将请求转发到 $upstream 变量对应的上游服务器集群。当请求到达这个服务器时,会先预读取请求中的协议类型,如果是"" (也就是空字符串) 就转发到 ssh 集群,否则转发到web集群, 这样就支持了在同一端口上使用不同协议来提供服务。总的来说, 这段代码定义了一个使用 SSL/TLS 和 SSH 协议的流式协议服务器,并且使用了ssl_preread_protocol来预读取协议类型,基于协议类型来路由请求,实现在同一个端口上支持多种协议的服务
关于上述配置后,可能会存在后端或日志中存在内网IP的问题,解决方法详见nginx使用stream转发传递真实IP
二、【Nginx根据ALPN分流】
ssl_preread_alpn_protocols
指令支持一个由空格分隔的协议列表作为参数,每个协议都必须是一个有效的协议名称。在 ALPN 中支持的协议取决于客户端和服务器使用的 SSL/TLS 库。
常见的 ALPN 协议有:
- h2: HTTP/2 协议
- http/1.1: HTTP/1.1 协议
- h3: HTTP/3协议
stream {
map $ssl_preread_alpn_protocols $proxy {
~\h2\b 127.0.0.1:8001;
~\http/1.1\b 127.0.0.1:8002;
~\xmpp-client\b 127.0.0.1:8003;
}
server {
listen 9000;
listen [::]:9000;
proxy_pass $proxy;
ssl_preread on;
}
}
xmpp-client
是 Extensible Messaging and Presence Protocol (XMPP) 客户端协议的名称,它是一种开放协议,通常用于在应用之间进行实时通信。XMPP 允许跨平台和跨语言的通信,它可以用于多种应用,如即时通信(IM)、网络会议和消息推送等。在
ssl_preread_alpn_protocols
指令中使用xmpp-client
,意味着你要预读取这种协议类型,并在请求中匹配,然后路由到特定的后端服务器,通常是xmpp相关的服务器.
三、【Nginx根据SNI分流】
ssl_preread_server_name
指令是 nginx 中用来在进行 SSL/TLS 握手之前,预读取客户端发送过来的 Server Name Indication (SNI) 信息。 SNI 是一种扩展,允许客户端在进行 SSL/TLS 握手时向服务器发送主机名,以便服务器可以根据主机名来选择适当的证书。
stream {
map $ssl_preread_server_name $name {
backend.example.com backend;
default backend2;
}
upstream backend {
server 192.168.0.2:12345;
}
upstream backend2 {
server 192.168.0.3:12345;
}
server {
listen 12346;
listen [::]:12346;
proxy_pass $name;
ssl_preread on;
}
}
参考内容:
评论区