记录安装haproxy的一些步骤

/ 0评 / 0

最近研究 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;

经过这样的配置之后,便能达到我的要求了。

Leave a Reply

Your email address will not be published. Required fields are marked *