最近研究 SNI 分流,一开始研究的是 nginx 自带的分流,要在原来编译的基础上增加几个参数:
--with-http_realip_module --with-stream_realip_module --with-stream_ssl_preread_module
编译成功后需要在主 nginx.conf 文件里增加
stream {
map $ssl_preread_server_name $name {
www.1.com web1;
www.2.com web2;
}
upstream web1 {
server 127.0.0.1:1234; #网站1端口
}
upstream web2 {
server 127.0.0.1:2234; #网站2端口
}
server {
listen 443 reuseport;
listen [::]:443 reuseport;
proxy_pass $name;
ssl_preread on;
proxy_protocol on;
}
}
用这个配置成功后,网站确实能够访问,但是再加上别的功能后就始终连接不上。
后来用 haproxy 来操作,就很容易成功。
首先打开 这个网站 安装haproxy
apt-get install --no-install-recommends software-properties-common
add-apt-repository ppa:vbernat/haproxy-2.2
apt-get install haproxy=2.2.\*
然后修改haproxy的配置文件
nano /etc/haproxy/haproxy.cfg
修改为:
global
log /dev/log local0
log /dev/log local1 notice
chroot /var/lib/haproxy
user haproxy
group haproxy
daemon
defaults
log global
mode tcp
option tcplog
option dontlognull
timeout connect 24h
timeout client 24h
timeout server 24h
frontend ssl
mode tcp
bind *:443
tcp-request inspect-delay 3s
tcp-request content accept if { req.ssl_hello_type 1 }
use_backend web1 if { req_ssl_sni -i www.1.com }
use_backend web2 if { req_ssl_sni -i www.2.com }
use_backend web3 if { req_ssl_sni -i www.3.com }
backend web1
mode tcp
server web1 127.0.0.1:10443 send-proxy
backend web2
mode tcp
server web2 127.0.0.1:20443 send-proxy
backend web3
mode tcp
server web3 127.0.0.1:30443 send-proxy
但是这里有一个先后顺序的问题,我个人觉得比较好的办法应该是先按照正常流程把需要放置的网站都先搭建成功,并且申请好证书,能用 https 访问之后再切换到 haproxy 作为它们的前置,这样的话只需要修改网站的 443 端口和 server 段增加相应的参数就好了:
server
{
listen 10443 ssl http2 proxy_protocol;
listen [::]:10443 ssl http2 proxy_protocol;
server_name www.1.com;
index index.html index.htm index.php default.html default.htm default.php;
root /path/www.1.com;
set_real_ip_from 127.0.0.1;
real_ip_header proxy_protocol;
}
同时建议 80 的 server 段增加一条转向规则:
rewrite ^(.*)$ https://$host$1 permanent;
经过这样的配置之后,便能达到我的要求了。