Nginx 实现端口复用

今天装了trojan后部署其他https网站时发现443端口被占用,https用的也是443端口,导致nginx无法侦听

image-20210424011314694

查阅资料后找到一种解决方案,使用nginx的stream_ssl_preread_module基于SNI识别,进行4层转发

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
stream {
# 这里就是 SNI 识别,将域名映射成一个配置名
map $ssl_preread_server_name $backend_name {
blog.this52.cn blog;
tj.this52.cn trojan;
# 域名都不匹配情况下的默认值
default blog;
}

# blog,配置转发详情
upstream blog {
server 127.0.0.1:10000;
}

# trojan,配置转发详情
upstream trojan {
server 127.0.0.1:10001;
}


# 监听 443 并开启 ssl_preread
server {
listen 443 reuseport;
listen [::]:443 reuseport;
proxy_pass $backend_name;
ssl_preread on;
}
}

意思就是说在请求https://blog.this52.com时会被这里监听,然后会转发到server_name对应的服务:端口上去,最后我们在具体的站点配置中监听对应端口即可

image-20210424013859973

至此,实现443端口复用

ps:nginx能监听多个https站点的原理也是利用SNI对不同host进行分流