如果UDP服务和TCP服务共用443端口,Nginx分流的方式
-
Nginx的 ngx_stream_ssl_preread_module 模块提供通过在TCP阶段识别SNI来分流基于SSL的流量,从而实现对不同后端服务的转发。
-
Nginx的 ngx_stream_core_module 模块可以直接分流TCP和UDP流量
综上两个模块提供了Nginx实现基于SSL的TCP流量和UDP流量分流的功能。
stream {
# 根据SNI映射backend_name,非TCP流量是识别不出SNI,默认是空,直接走defalut
map $ssl_preread_server_name $backend_name {
1.example.com site1;
2.example.com site1;
default default_server;
}
# 自定义的上游服务,http模块里的内容
upstream site1{
server 127.0.0.1:40010;
}
upstream site2{
server 127.0.0.1:40011;
}
upstream udp_server{
server 127.0.0.1:50000;
}
upstream default_server{
server 127.0.0.1:50000;
}
server { # 监听TCP流量
listen 443;
listen [::]:443;
ssl_preread on;
proxy_pass $backend_name; # 指定代理到哪个上游服务
proxy_protocol on;
}
server { # 监听UDP流量
listen 443 udp;
listen [::]:443 udp;
proxy_protocol on;
proxy_pass udp_server;
proxy_timeout 20s;
}
}
</code>
</pre>
http 下面 sever里面照常按ssl配置写即可,比如1.example.com
server {
listen 127.0.0.1:40010 ssl proxy_protocol;
listen [::]:40010 ssl proxy_protocol;
server_name 1.example.com;
http2 on;
set_real_ip_from 127.0.0.1;
real_ip_header proxy_protocol;
client_max_body_size 1024m;
ssl_certificate ssl/.crt;
ssl_certificate_key ssl/.key;
ssl_trusted_certificate ssl/.ca.crt;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-ECDSA-CHACHA20-POLY1305;
ssl_ecdh_curve secp521r1:secp384r1:secp256r1:x25519;
location / {
}
}
</code>
</pre>
参考