ULB的http强转https

负载均衡是高可用网络基础架构的关键组件,通常用于将工作负载分布到多个服务器来提高网站、应用、数据库或其他服务的性能和可靠性。

负载均衡(ULB)能够为多个主机或其它服务实例提供基于网络报文或代理方式的流量分发的功能。用于在高并发服务环境下,构建由多个服务节点组成的“负载均衡服务集群”。“服务集群”能够扩展服务的处理及容错能力,并可自动消除由于单一服务节点故障对服务整体的影响,提高服务的可用性。

目前ULB针对七层支持HTTP、HTTPs协议(类Nginx或HAproxy);针对四层支持TCP协议及UDP协议(类LVS)。并且TCP协议支持两种方式:报文转发与请求代理。报文转发与请求代理模式详情可参考TCP的请求代理与报文转发。四层ULB支持外网与内网两种模式,而七层ULB目前仅支持外网。您可以参考如何选择ULB选择哪一层ULB来部署业务。

忙活了几天,对ulb的负载均衡总算是有点成果了。如下:

配置相关

第一步:前段负载均衡器的配置

  1. 创建负载均衡器。
    进入ucloud的官网,加入开启一台ulb负载均衡器。这里对外开放,我们选择的是公网绑定

  2. 创建VServer,和阿里云一样,创建两个VServer一个是80端口,一个是443端口,协议分别为httphttps

  3. 用到443端口意味着我们需要上传ssl证书,上传也比较简单,上传申请的证书的crt和key文件即可。

  4. http强制跳转至https,ulb暂未开通此项服务,只能在后端的服务器上添加转发规则。

第二步:后端服务器配置

1.   安装nginx ,这里就不多累述,前面已经写过。
nginx编译安装

2.   配置nginx

vim /etc/nginx/conf.d/test.conf
server {
       listen       81;
       server_name  www.fenghong.tech;
       location / {
            proxy_pass http://localhost:8080;
            proxy_set_header       Host $host;
            proxy_set_header  X-Real-IP  $remote_addr;
            proxy_set_header  X-Forwarded-For$proxy_add_x_forwarded_for;
       }
        location = /50x.html {
            root   html;
       }
}
server {
       listen       80;
       server_name  www.fenghong.tech;
       #实现httphttps强转的问题
       rewrite ^(.*) https://www.fenghong.tech$1 permanent;
       location / {
            proxy_pass http://localhost:8080;
       }
       location = /50x.html {
            root   html;
       }
}

踩过的坑

www2.fenghong.tech 将您重定向的次数过多。
尝试清除 Cookie.
ERR_TOO_MANY_REDIRECTS

由于nginx的每个server段的location里均有对ip的访问控制,取消限制或者加入白名单即可:

504

400 Bad Request
The plain HTTP request was sent to HTTPS port

首先在nginx.conf的主配置文件里面对ip有访问控制。

    allow  10.9.0.0/16;
    deny    all; 

其次在test.conf的主机配置文件里面,对ip有访问控制。

再其次在知道创宇的域名访问里面,对ip有限制。

多重的权限设置是这次负载均衡踩坑的关键点。

403 forbidden

ULB基于TCP转发的实验

四层转发或者说四层负载均衡就相对容易点。

创建ULB的负载均衡,这边实验我选择了内网转发,服务监听在内网更加安全点,这里适用场景为公司的后台管理,重要的资产端管理。

vserver80端口  -----> 后端的realserver80端口
vserver443端口 -----> 后端的realserver443端口

后端lo网卡的配置

# vim /etc/sysconfig/network-scripts/ifcfg-lo:1
DEVICE=lo:1
IPADDR=$VIP
NETMASK=255.255.255.255
# ifup lo:1
# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet 10.9.133.26/32 brd 10.9.133.26 scope global lo:1

后端nginx的配置

后端的nginx配置其实不用更改。下面这个例子供参考

server {
    listen       80;
    server_name  wiki.fenghong.tech;
    root /data/cun_web/rms;
    allow 10.9.0.0/16;
    deny all;
    rewrite ^/(.*)$ https://wiki.fenghong.tech/$1 permanent;
    location / {
        proxy_pass   http://127.0.0.1:8114;          
    }

    location =/ {  
        add_header Access-Control-Allow-Origin *;
        rewrite ^/$ /home/homeIndex last;

    }

    if ($http_user_agent ~* "JianKongBao") {
        return 403;
    }

    access_log /data/logs/nginx/wiki.log  main;  
    error_log /data/logs/nginx/wiki_error.log ;
}

server {
    listen       443;
    server_name  wiki.fenghong.tech;
    root /data/cun_web/rms;
    index  index.html;

    error_page  500 502 503 504 404 403 /50_default;

    ssl_certificate      /etc/nginx/sslkey/_.q.com_bundle.crt; 
    ssl_certificate_key  /etc/nginx/sslkey/_.q.com.key; 
    ssl_session_timeout  10m;  
    ssl_session_cache shared:SSL:10m;
    ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;  
    ssl_ciphers  ALL:!DH:!EXPORT:!RC4:+HIGH:+MEDIUM:-LOW:!aNULL:!eNULL; 
    ssl_prefer_server_ciphers   on;  

    allow 10.9.0.0/16;
    deny all;

    location / {
        proxy_pass   http://127.0.0.1:8114;        
    }

    location =/ {  
        add_header Access-Control-Allow-Origin *;
        rewrite ^/$ /home/homeIndex last;
    }

    if ($http_user_agent ~* "JianKongBao") {
        return 403;
    }
    access_log /data/logs/nginx/wiki_ssl.log  main;  
    error_log /data/logs/nginx/wiki_ssl_error.log ;
}

配置到这里也基本结束了。

域名指向

这里配置域名指向也是一个坑吧。正式上线的情况下,域名只有一个,要刷新dns缓存。

将自己的域名指向ULB的负载均衡的ip即可。但是也请谨慎.一次DNS缓存引发的惨案.

Related: