10月31日 HAProxy

1、HAProxy功能

HAProxy是TCP / HTTP反向代理服务器,尤其适合于高可用性环境
可以针对HTTP请求添加cookie,进行路由后端服务器
可平衡负载至后端服务器,并支持持久连接
支持基于cookie进行调度
支持所有主服务器故障切换至备用服务器
支持专用端口实现监控服务
支持不影响现有连接情况下停止接受新连接请求
可以在双向添加,修改或删除HTTP报文首部
支持基于pattern实现连接请求的访问控制
通过特定的URI为授权用户提供详细的状态信息

2、HAProxy组成

软件包:yum install haproxy
主程序:/usr/sbin/haproxy
配置文件:/etc/haproxy/haproxy.cfg
Unit file:/usr/lib/systemd/system/haproxy.service
配置段:
global:全局配置段
进程及安全配置相关的参数
性能调整相关参数
Debug参数
proxies:代理配置段
defaults:为frontend, backend, listen提供默认配置
fronted:前端,相当于nginx, server {}
backend:后端,相当于nginx, upstream {}
listen:同时拥有前端和后端,适用于一对一环境,也就是前段和后端是一一对应的关系,只有一个端和一个后端

3、HAProxy反向代理httpd服务,并实现日志功能

无标题.png

备注:以下的所有实验都是根据此拓扑图完成的

1、在后端的两个web服务器上开启httpd服务
2、配置haproxy
vim /etc/haproxy/haproxy.cfg
listen http
        bind :80
        balance roundrobin    ---指明调度算法为轮询
        server web1 192.168.74.133:80 check
        server web2 192.168.74.129:80 check
也可以写成如下格式,这种格式一个前段可以对应多个后端
frontend http
        bind :80
        default_backend websrvs
backend websrvs
        balance roundrobin
        server web1 192.168.74.133:80 check weight 2   ---指定权重
        server web2 192.168.74.129:80 check 
systemctl start haproxy.service 
3、vim /etc/rsyslog.conf 
$ModLoad imudp
$UDPServerRun 514   ---开启udp的514端口,这样产生的日志就会发往本机的日志服务器
local2.*                                                /var/log/haproxy.log
systemctl restart rsyslog.service 
4、测试
在客户端curl 172.18.21.107    ---发现轮流的调度只后端的主机
在haproxy上tail -f /var/log/haproxy.log  ---发现有日志生成

4、global配置

vim /etc/haproxy/haproxy.cfg
Global settings
 log         127.0.0.1 local2   ---表示日志设施为local2,发送至本机的日志服务器,这里可以改成别的主机的地址,这样日志就会发送到别的主机上,当然要在别的主机上打开tcp或者udp的514端口,并在配置文件中规定日志的路径
    chroot      /var/lib/haproxy   ---
    pidfile     /var/run/haproxy.pid
    maxconn     4000   ----设定每个haproxy进程所能接受的最大并发连接数
    user        haproxy
    group       haproxy
    daemon   ---表示默认以守护进程的方式运行

5、代理配置段

代理配置段:

-defaults <name>
-frontend <name>
-backend <name>
-listen <name>
Frontend段:指定接收客户端连接侦听套接字设置
Backend段:指定将连接请求转发至后端服务器的相关设置
Listen段:指定完整的前后端设置,只对TCP 有效
proxy 名称:使用字母数字-_ . : 并区分字符大小写
配置参数:
bind:指定一个或多个前端侦听地址和端口
bind [<address>]:<port_range> [, ...] [param*]
示例:
listen http_proxy
bind :80,:443    ---指监听在本地的80和443的所有ip地址
bind 10.0.0.1:10080,10.0.0.1:10443   ---监听在特定的ip地址

6、balance配置

  • 调度算法:
    roundrobin:基于权重轮询,动态算法,支持权重的运行时调整,支持慢启动,慢启动新加一个后端服务器后,逐渐的把一半的流量分配到新加的主机,而不是一下子就把流量分配过去,可能会造成后端服务器因为瞬间流量过大而死机;每个后端backend中最多支持4095个server
    static-rr:基于权重轮询,静态算法,不支持权重的运行时调整及慢启动;后端主机数量无上限
    leastconn:加权最少连接,动态算法,最少连接的后端服务器优先分配接收新连接,相同连接时轮询,推荐在较长会话的场景使用,例如MySQL、LDAP等,不适合http
    first:根据服务器在列表中的位置,自上而下进行调度;前面服务器的连接数达到上限,新请求才会分配给下一台服务
    source:源地址hash,新连接先按权重分配,后续连接按source分配请求
    uri:对URI的左半部分或整个uri做hash计算,并除以服务器总权重取模,以后派发至某挑出的服务器,适用于后端缓存服务器,以后只要访问同样的地址就给你调度到固定的后端服务器上去
    <scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>
    左半部分:/<path>;<params>
    整个uri:/<path>;<params>?<query>#<frag>
    url_param:对用户请求的uri<params>部分中的参数的值作hash计算,并由服务器总权重相除以后派发至某挑出的服务器;通常用于追踪用户,以确保来自同一个用户的请求始终发往同一个Backend Server
    hdr(<name>):对于每个http请求,此处由<name>指定的http首部将会被取出做hash计算;并由服务器总权重相除以后派发至某挑出的服务器;无有效值的会被轮询调度
    hdr(Cookie)
    rdp-cookie 远程桌面相关
    rdp-cookie(<name>)
  • 哈希算法
    hash-type <method> <function> <modifier>
    method:
    map-based:除权取余法,哈希数据结构是静态数组
    consistent:一致性哈希,哈希数据结构是一棵树
    <function> : 哈希函数
    sdbm djb2 wt6
    default_backend <backend>
    无use_backend匹配时,使用默认的backend,用于frontend中
    default-server [param*]
    为backend中的各server设定默认选项
示例1
vim /etc/haproxy/haproxy.cfg
frontend http
        bind :80
        default_backend websrvs
backend websrvs
        balance uri    --指明调度方式为基于源uri,
        hash-type consistent    ---指明调度算法为一致性哈希
        server web1 192.168.74.133:80 check weight 2
        server web2 192.168.74.129:80 check
测试
访问 curl 172.18.21.107/1.html   ----访问固定的uri将始终被调度到第一次被调度的后端的主机,即使在后端两个主机上都有1.html
示例2
frontend http
        bind :80
        default_backend websrvs
backend websrvs
        balance hdr(host)       ---表示请求的首部也就是host不一样,就会调度到不同的主机
        hash-type consistent
        server web1 192.168.74.133:80 check 
        server web2 192.168.74.129:80 check
在haproxy上再配置一个172.18.21.77/16的ip地址
在客户端测试
[root@node2 ~]#curl 172.18.21.77
<f1>welcome 106 </f1>
[root@node2 ~]#curl 172.18.21.107   ---发现请求的ip地址不同,将会调度到不同的后端服务器
<h1>welcome to 107 </h1>
示例3
frontend http
        bind :80
        default_backend websrvs
backend websrvs
        balance roundrobin
        default-server weight 3    ---表示不指定权重的情况下默认权重为3
        server web1 192.168.74.133:80 check weight 1
        server web2 192.168.74.129:80 check
测试 for i in {1..20};do curl 172.18.21.107;done

7、定义后端主机的各服务器及其选项

server <name> <address>[:port] [param*]
default-server [param*]
<name>:服务器在haproxy上的内部名称;出现在日志及警告信息
<address>:服务器地址,支持使用主机名
[:[port]]:支持端口映射,访问本机的80端口,可以调度到后端的8080端口;省略时,表示同bind中绑定的端口
[param*]:参数
weight <weight>:权重,默认为1
maxconn <maxconn>:当前server的最大并发连接数,只的是后端服务器的最大并发连接数
backlog <backlog>:当server的连接数达到上限后的后援队列长度
backup:设定当前server为备用服务器

8、健康状态检测

check:对当前server做健康状态检测,只用于四层检测
注意:httpchk,“smtpchk”, “mysql-check”, “pgsql-check” and “ssl-hello-chk” 用于定义应用层检测方法
addr:检测时使用的IP地址,可以实现后端的服务器检测时使用一个ip地址,提供服务使用另外一个ip地址,使流量分流,提高效率
port :针对此端口进行检测
inter <delay>:连续两次检测之间的时间间隔,默认为2000ms
rise <count>:连续多少次检测结果为“成功”才标记服务器为可用;默认为2
fall <count>:连续多少次检测结果为“失败”才标记服务器为不可用;默认为3
cookie <value>:为当前server指定cookie值,实现基于cookie的会话黏性
disabled:标记为不可用
redir<prefix>:将发往此server的所有GET和HEAD类的请求重定向至指定的URL

示例1
在后端的192.168.74.133的主机上再配置一个IP地址
ip addr add 192.168.74.88/24 dev eth1  
frontend http
        bind :80
        default_backend websrvs
backend websrvs
        balance roundrobin
        server web1 192.168.74.133:80 check  addr 192.168.74.88 port 80 inter 3000 rise 3 fal
l 3    ---指定检测时监控后端的服务器的ip地址为192.168.74.88,端口为80
        server web2 192.168.74.129:80 check disabled  --标记为此台服务器不可用
测试
curl 172.18.21.107    ---发现只能调度至后端的一台服务器
将新增加的ip地址删除ip addr del 192.168.74.88/24 dev eth1
再curl 172.18.21.107 ---发现后端服务器都不可用了。因为一个是标记为不可用,一个虽然是好的,但检测的ip地址没有了,就会认为后端的服务器坏了
示例2
frontend http
        bind :80
        default_backend websrvs
backend websrvs
        balance roundrobin
        server web1 192.168.74.133:80 check
        server web2 192.168.74.129:80 check redir http://www.baidu.com    ---表示将发往此server的所有GET和HEAD类的请求重定向至百度
测试 
在浏览器上http://172.18.21.107/   
或者用curl -L 172.18.21.107 ---用curl命令时不加-L无法看到重定向的内容

9、cookie配置

cookie <name> [ rewrite | insert | prefix ] [ indirect ] [ nocache ] [ postonly ] [ preserve ] [ httponly ] [ secure ] [ domain <domain> ]* [ maxidle <idle> ] [ maxlife <life> ]
<name>:cookie名称,用于实现持久连接
rewrite:重写
insert:插入
prefix:前缀

示例基于cookie的session sticky的实现
frontend http
        bind :80
        default_backend websrvs
backend websrvs
        balance roundrobin
        cookie WEBSRV insert nocache indirect  ----WEBSRV相当于一个变量,值由srv1和srv2决定, insert把cookie信息添加到响应报文首部,nocache不是不缓存,这样在浏览器的响应报文里会看到一个cookie值,下次浏览器再访问时就带着这个cookie值就被调度到相应的主机
        server web1 192.168.74.133:80 weight 1 check rise 3 fall 3 maxconn 3000 cookie srv1
        server web2 192.168.74.129:80 check weight 2 check rise 3 fall 3 maxconn 3000 cookie srv2
systemctl restart haproxy
测试
[root@node2 ~]#curl  172.18.21.107 -I
HTTP/1.1 200 OK
Date: Wed, 06 Sep 2017 04:45:45 GMT
Server: Apache/2.2.15 (CentOS)
Last-Modified: Sun, 03 Sep 2017 22:11:15 GMT
ETag: "220661-16-5585045d37040"
Accept-Ranges: bytes
Content-Length: 22
Content-Type: text/html; charset=UTF-8
Set-Cookie: WEBSRV=srv1; path=/   ---可以看到发给客户端的cookie是WEBSRV=srv1
Cache-control: private
[root@node2 ~]#curl -b WEBSRV=srv1 172.18.21.107
<f1>welcome 106 </f1>   ---当这个客户端端待着这个cookie值去访问时就会调度到固定的主机
[root@node2 ~]#curl -b WEBSRV=srv1 172.18.21.107  ---curl命令默认是不携带cookie的,要想携带cookie就要加-b选项
<f1>welcome 106 </f1>

在火狐浏览器上访问时,按F12进入调试页面也可以看到,第一次访问时响应报文里会有一个cookie值,这样浏览器下次访问时就会带着这个cookie值,从而被调度到固定的主机

QQ截图20171031230559.png

10、统计接口启用相关的参数

stats enable
启用统计页;基于默认的参数启用stats page
-stats uri: /haproxy?statsuri默认值
-stats realm : HAProxy\Statistics
-stats auth: no authentication
stats uri <prefix>
自定义stats page uri
stats auth <user>:<passwd>
认证时的账号和密码,可使用多次
stats realm <realm>
认证时的realm
stats hide-version
隐藏版本
stats refresh <delay>
设定自动刷新时间间隔
stats admin { if | unless } <cond>
启用stats page中的管理功能
示例

frontend http
        bind :80
        stats enable
        stats refresh 10    ---定义刷新间隔为10s
        stats uri /hastats   ---自定义统计页面
        stats realm "haproxy info"    ---输入账号和密码时的提示信息
        stats auth ha1:centos    ---设定账号和密码
        stats auth ha2:centos
        stats hide-version   ---在网页上打开时会隐藏版本信息
        stats admin if TRUE   --启用管理功能,在网页上就可以实现操作把后端的某个服务器down掉
        default_backend websrvs
backend websrvs
        balance roundrobin
        server web1 192.168.74.133:80 weight 1 check rise 3 fall 3 maxconn 3000
        server web2 192.168.74.129:80 check weight 2 check rise 3 fall 3 maxconn 3000

11、工作模式

maxconn <conns>:为指定的frontend定义其最大并发连接数;默认为2000
mode { tcp|http|health}
定义haproxy的工作模式
tcp:基于layer4实现代理;可代理mysql, pgsql, ssh, ssl等协议,https时使用此模式,默认模式
http:仅当代理协议为http时使用,centos实际默认模式
health:工作为健康状态检查的响应模式,当连接请求到达时回应“OK”后即断开连接,较少使用
TCP模式的健康状态检测示例

listen ssh
        bind 192.168.74.107:22   ---做这一步之前先把ssh服务的监听地址改为172.18.21.107,也就是外网网卡的IP地址监听22端口。这样内网网卡的ip地址的22端口就腾出来给haproxy使用
        mode tcp   ---一定要定义为tcp模式
        balance leastconn
        server ssh1 192.168.74.133:22 check
        server ssh2 192.168.74.129:22 check

12、健康状态检测

对后端服务器做http协议的健康状态检测:
option httpchk默认为:/ OPTIONS HTTP/1.0
option httpchk <uri>
option httpchk <method> <uri>
option httpchk <method> <uri> <version>
定义基于http协议的7层健康状态检测机制http-check expect [!] <match> <pattern>
http协议健康状态检测响应内容或指定响应码

frontend http
        bind :80
        stats enable
        stats refresh 10
        stats uri /hastats
        stats admin if TRUE
        default_backend websrvs
backend websrvs
        balance roundrobin
        option httpchk GET /index.html HTTP/1.1\r\nhost:  ---对后端服务器做http协议的健康状态检测,在后端服务器的日志中可以看到定期的发送http协议,默认为:OPTIONS / HTTP/1.0" 200 ,也可以自己定义为GET /index.html HTTP/1.1
        option httpchk /index.html  ---指定监控后端主机的哪个uri
        http-check expect status 200  ---表示只有返回200的状态码才认为后端的服务器是好的
        server web1 192.168.74.133:80 weight 1 check rise 3 fall 3 maxconn 3000
        server web2 192.168.74.129:80  weight 2 check rise 3 fall 3 maxconn 3000

13、forwardfor配置

option forwardfor[ except <network> ] [ header <name> ] [ if-none ]
在由haproxy发往后端主机的请求报文中添加“X-Forwarded-For”首部,其值为前端客户端的地址;用于向后端主发送真实的客户端IP
[ except <network> ]:请求报文来自此处指定的网络时不予添加此首部,如haproxy自身所在网络
[ header <name> ]:使用自定义的首部名称,而非“X-Forwarded-For”
[ if-none ]如果没有首部才添加首部,如果有使用默认值
示例

在default语句块里定义一个首部信息
vim /etc/haproxy/haproxy.cfg 
option forwardfor       except 127.0.0.0/8 header x-client   ---如果不加header x-client,默认添加的首部是X-Forwarded-For,这样在后端的日志格式中增加的首部不是x-client而是X-Forwarded-For
在后端主机的httpd的配置中日志格式要增加这个首部
vim /etc/httpd/conf/httpd.conf 
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %{x-client}i" combined
测试在客户端访问curl 172.18.21.107
在后端服务器上监控日志
tail /var/log/httpd/access_log -f   --可以看到真实客户端地址了

14、错误页配置

errorfile <code> <file> 自定义错误页
<code>:HTTP status code,支持200, 400, 403, 408, 500, 502, 503, 504,<file>:错误页文件路径
errorlo c<code> <url>
相当于errorloc 302 <code> <url>,利用302重定向至指URL
示例1

cd /etc/haproxy
mkdir error_pages
echo custom ERROR 503 > error_pages/503.html
frontend  http
        bind :80
        default_backend websrvs
        stats enable
        stats refresh 10
        stats uri /hastats
        stats admin if TRUE
        errorfile 503 /etc/haproxy/error_pages/503.html
backend websrvs
        balance roundrobin
        server web1 192.168.74.133:80 check
        server web2 192.168.74.129:80 check
systemctl reload haproxy.service 
测试的时候把后端的两个web服务器都停掉
[root@centos6 ~]#curl  172.18.21.107   ---这样访问的时候就会显示错误页面了
custom ERROR 503
示例2
frontend  http
        bind :80
        default_backend websrvs
        stats enable
        stats refresh 10
        stats uri /hastats
        stats admin if TRUE
        errorloc 503 http://www.baidu.com   ---表示出现错误页面就重定向到百度
backend websrvs
        balance roundrobin
        server web1 192.168.74.133:80 check
        server web2 192.168.74.129:80 check
测试:关闭后端的两个httpd服务
curl -L 172.18.21.107   ---发现跳转至百度了

15、修改报文首部
reqadd <string> [{if | unless} <cond>]
在请求报文尾部添加指定首部
rspadd <string> [{if | unless} <cond>]
在响应报文尾部添加指定首部
示例:rspadd X-Via:\ HAPorxy
reqdel <search> [{if | unless} <cond>]
reqidel <search> [{if | unless} <cond>] (ignore case) 不分大小写
从请求报文中删除匹配正则表达式的首部
rspdel <search> [{if | unless} <cond>]
rspidel <search> [{if | unless} <cond>] (ignore case) 不分大小写
从响应报文中删除匹配正则表达式的首部
示例1

在haproxy上的设置
frontend  http
        bind :80
        default_backend websrvs
        stats enable
        stats refresh 10
        stats uri /hastats
        stats admin if TRUE
        reqadd x-via:\ haproxy107    ---在请求报文的尾部添加一个首部的值为haproxy107
        rspadd server:\ zhanginx   ---添加一个新的服务器的类型
        rspidel server.*    ---删除响应报文中服务器的类型
backend websrvs
        balance roundrobin
        server web1 192.168.74.133:80 check
        server web2 192.168.74.129:80 check
systemctl reload haproxy.service
在后端服务器上设置
vim /etc/httpd/conf/httpd.conf 
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %{x-via}i" combined    ---添加这个首部
service httpd restart
测试
curl 172.18.21.107
tail -f /var/log/httpd/access_log  ---可以看到haproxy107
[root@centos6 network-scripts]#curl -I 172.18.21.107
HTTP/1.1 200 OK
Date: Thu, 02 Nov 2017 02:31:23 GMT
Last-Modified: Wed, 01 Nov 2017 23:11:04 GMT
ETag: "220660-20-55cf3fc63fd87"
Accept-Ranges: bytes
Content-Length: 32
Content-Type: text/html; charset=UTF-8
server: zhanginx     ---发现原来的被删除了,新增加了一个,这样可以伪装后端服务器的类型

16、连接超时

timeout client <timeout>
客户端最长空闲连接超时时长默认单位是毫秒
timeout server <timeout>
后端服务器最长空闲连接超时时长
timeout http-keep-alive <timeout>
持久连接的持久时长
timeout http-request <timeout>
一次完整的HTTP请求的最大等待时长
timeout connect <timeout>
成功连接后端服务器的最大等待时长
timeout client-fin <timeout>
客户端半连接的空闲时长,半连接就是分手包的时候,我和你分手,你却不同分手的连接
timeout server-fin <timeout>
后端服务器半连接的空闲时长

17、haproxy的ACL

示例1

frontend  http
        bind :80
        default_backend websrvs
        stats enable
        stats refresh 10
        stats uri /hastats
        stats admin if TRUE
       acl invalid_src src 172.18.21.106
        acl deny_port dst_port 80
        block if invalid_src deny_port    ---表示满足上面两个条件都要满足才被拒绝,是并且的关系,||是或者的关系,!表示非
backend websrvs
        balance roundrobin
        server web1 192.168.74.133:80 check
        server web2 192.168.74.129:80 check
systemctl reload haproxy.service 

示例2

 acl adminpath path_beg -i /admin    ---表示访问的uri以admin开头的就拒绝
        block if adminpath

示例3基于acl实现动静分离

在后端主机192.168.74.129上安装php,并重新启动httpd服务
yum install php
systemctl restart httpd
vim /var/www/html/index.php
<?php
phpinfo();
?>
在后端主机192.168.74.133上
mkdir static
cd static/
cp /usr/share/doc/db4-devel-4.7.25/gsg_txn/CXX/writeblock.jpg a.jpg
在haproxy上的设置
vim /etc/haproxy/haproxy.cfg 
listen stats
        bind :9527
        stats enable
        stats refresh 10
        stats uri /hastats
        stats admin if TRUE
frontend  http
        bind :80
        acl url_static path_beg -i /static /images /javascript  
        acl url_static path_end -i .jpg .gif.png .css .js .html .txt .
htm   ---以上两条定义了静态文件的acl
        use_backend staticsrvs if url_static   ---表示如果访问的是静态页面就用后端的staticsrvs中规定的服务器
        default_backend appsrvs  ---访问其他的就默认用后端的appsrvs
backend staticsrvs
        balance roundrobin
        server web1 192.168.74.133:80 check
backend appsrvs
        server web2 192.168.74.129:80 check
systemctl reload haproxy.service
在网页上测试
http://172.18.21.107/static/a.jpg
http://172.18.21.107/index.php

示例4实现不同的域调度到不同服务器

listen stats
        bind :9527
        stats enable
        stats refresh 10
        stats uri /hastats
        stats admin if TRUE
frontend  http
        bind :80
        acl imagehost hdr(host) images.magedu.com   ---表示在请求报文中添加一个首部host,host就是主机名,值为images.magedu.com时就访问staticsrvs
        use_backend staticsrvs if imagehost
        default_backend appsrvs
backend staticsrvs
        balance roundrobin
        server web1 192.168.74.133:80 check
backend appsrvs
        server web2 192.168.74.129:80 check
测试
vim /etc/hosts
172.18.21.107 images.magedu.com
[root@centos6 network-scripts]#curl images.magedu.com
<f1>welcome to centos 6.9 </f1>

示例5

acl deny_method method HEAD
block if deny_method   ---表示用客户端用HEAD方法就拒绝
http_request deny if deny_method   ---也可以用这种写法
测试
[root@centos6 network-scripts]#curl 172.18.21.107 -I
HTTP/1.0 403 Forbidden
Cache-Control: no-cache
Connection: close
Content-Type: text/html
[root@centos6 network-scripts]#curl 172.18.21.107
<h1>welcome to cenots7.4 </h1>

18、配置HAProxy支持https协议

1 、支持ssl会话;
bind *:443 ssl crt /PATH/TO/SOME_PEM_FILE
crt后证书文件为PEM格式,且同时包含证书和所有私钥
cat demo.crt demo.key> demo.pem
2、 把80端口的请求重向定443
bind *:80
redirect scheme https if !{ ssl_fc}
3、 向后端传递用户请求的协议和端口(frontend或backend)
http-request set-header X-Forwarded-Port %[dst_port] ---添加端口
http-request add-header X-Forwared-Proto https if { ssl_fc} ---添加https协议
支持https指的是客户端访问haproxy时使用https协议,因为这一段一般是外网,而haproxy访问后端的web服务器时不用https,因为这一段一般都是内网
示例

cd /etc/pki/tls/certs/
make haproxy.pem
vim /etc/haproxy/haproxy.cfg 
listen stats
        bind :9527
        stats enable
        stats refresh 10
        stats uri /hastats
        stats admin if TRUE
frontend  https
        bind 172.18.21.107:443 ssl crt /etc/pki/tls/certs/haproxy.pem
        redirect scheme https if !{ ssl-fc }     ---表示如果访问的是http就自动跳转至https,注意大括号里面前后都要有空格
        http-request set-header httpsrvport %[dst_port]
        default_backend websrvs
backend websrvs
        balance roundrobin
        server web1 192.168.74.133:80 check
        server web2 192.168.74.129:80 check
systemctl reload haproxy.service 
在后端的web服务器上的操作
vim /etc/httpd/conf/httpd.conf 
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %{httpsrvport}i" combined   ---在日志格式中添加httpsrvport首部
在客户端测试
[root@centos6 network-scripts]#curl 172.18.21.107 -Lk
<f1>welcome to centos 6.9 </f1>   --k表示忽略证书,-L表示跟踪重定向
[root@centos6 network-scripts]#curl -k https://172.18.21.107
<f1>welcome to centos 6.9 </f1>
[root@centos6 static]#tail -f /var/log/httpd/access_log    ---后端的web服务器上可以看到日志中含有客户端请求的端口443
192.168.74.132 - - [02/Nov/2017:14:05:26 +0800] "GET / HTTP/1.1" 200 32 "-" "curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.21 Basic ECC zlib/1.2.3 libidn/1.18 libssh2/1.4.2" 443
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 195,898评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,401评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,058评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,539评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,382评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,319评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,706评论 3 386
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,370评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,664评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,715评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,476评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,326评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,730评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,003评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,275评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,683评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,877评论 2 335

推荐阅读更多精彩内容

  • 互联网架构基础知识 一、网站常见架构 负载层 页面缓存层 web层 数据层 二、运维法则 缓存为王 尽量在前端(缓...
    魏镇坪阅读 4,776评论 0 9
  • 一.HAProxy介绍 HAProxy: 是法国人Willy Tarreau开发的一个开源软件,是 一款应对客户端...
    楠人帮阅读 1,082评论 0 2
  • HAProxy简介HAProxy配置ACL配置TCP转发SSL转发 一、HAProxy简介: (一)HAProxy...
    哈喽别样阅读 1,514评论 0 0
  • 转自(可能有一定的修改):http://freeloda.blog.51cto.com/2033581/12940...
    C86guli阅读 992评论 0 3
  • Haproxy是既可以工作在7层也能工作在4层的反代工具.Haproxy的功能: 路由HTTP请求到后端服务器,基...
    uangianlap阅读 1,525评论 0 1