GCP 的 http(s)负载均衡有如下两个特点:


1.Global 的负载均衡,通过anycast把同一个 IP 地址通过 BGP 发布到其他运营商,可以实现全球多个 region 的负载均衡,并把用户流量最快的引流入 Google 的网络


2.http(s)负载均衡是 proxy 模式的负载均衡,tcp 的信息都在负载均衡上终结,再发送到后端的真实服务器。由于 TCP 的终结都是在 Google B2 网络的 GFE 上,这样可以最快的相应客户,提升用户的体验


同时这样也带来的问题是,一些统计数据在后端的真实服务器上不能获得。这样在 Google HTTP(S)的负载均衡上配置 user-defined header,可以把相关的数据传送到后端服务器,具体实现方法如下。


一 创建负载均衡


通过 GCP 的 console 或命令行创建 HTTP(S)负载均衡:



这里就不再描述创建过程。


二 在负载均衡中添加 User-Defined Header


在创建好的负载均衡中点击编辑:



选择 backend configuration 并选择编辑:



在编辑界面中,选择 Advaned Configuratioins:



添加相关的 User-defined Header:



具体 Header 的内容可以查看文档


三 在真实服务器中查看 User-Defined Header 信息


1 tcpdum 抓包分析


在 VM 中进行抓包:


[root@hw-http-vm-01 conf]# tcpdump port 80 -w b.captcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
复制代码


同时在客户端进行 curl 的页面抓取:


for i in `seq 1 1000`; do  curl 107.178.243.139; done
复制代码


将文件下载到本地,通过 Wireshark 打开:



可以看到刚刚定义的包头都在 HTTP 请求中,其中:


1.X-City:Shanghai


2.X-RTT:27ms,这个是客户端到 Google HTTP 负载均衡的 RTT 时间


3.X-Region:CN


4.X-Sub:CN31,表示纬度为北纬31度的城市


5.X-lat:31.230390,121.473702, 为上海市人民广场的经纬度,代表上海市



2 修改日志配置,在日志中体现


修改 httpd 的配置文件,更改日志配置:


vim /etc/http/conf/httpd.conf
复制代码


修改如下内容:


LogLevel warn<IfModule log_config_module>LogFormat "%{X-Forwarded-for}i %{X-City}i %{X-RTT}i %{X-Region}i %{X-Sub}i %{X-lat}i %l %u %t "%r" %>s %b "%{Referer}i" "%{User-Agent}i"" userheaderCustomLog "logs/access_log" userheader</IfModule>
复制代码


重启 httpd 服务:


systemctl restart httpd
复制代码


查看日志:



可以看到在 http 负载均衡中定义的 Header 信息都显示到 log 中了。


同时在客户端进行抓包,可以看到,客户端端 http 请求和服务器端返回,均没有这些自定义的 http header,说明这些字段是 Google HTTP 负载均衡添加入的。




四 总结


Google Cloud 的 HTTP 负载均衡可以通过添加用户自定义 Header 的方式,把用户关心的一些字段添加到 HTTP 包头中,发送到后端 HTTP 服务器,通过这些数据,可以实现用户的各种数据的统计。


文章版权归作者所有,未经许可不得转载


相关推荐