HAProxy配置示例和需要考虑的问题(2)

(3).aggressive:一种激进的策略,该策略的haproxy会重用空闲TCP连接来转发大多数客户端的第一次请求。之所以是大多数而不是所有,是因为haproxy会挑选那些已经被重用过至少一次的连接(即从建立开始转发过至少两次,不管源是否是同一客户端)进行重用,因为haproxy认为只有这样的连接才具有重用能力。

(4).always:它将总是为第一个请求重用空闲连接。当后端是缓存服务器时,这种策略比safe策略的性能要高许多,因为这样的请求行为都是一样的,且可以共享同一连接来获取资源。不过不建议使用这种策略,因为大多数情况下,它和aggressive的性能是一样的,但是却带来了很多风险。
 
因此,为了性能的提升,将它设置为safe或aggressive吧,同时再将http事务模型设置为http-keep-alive。

对于haproxy是否开启cookie以及stick table相关功能的设置必须严加考虑,它直接影响调度算法的选择和负载均衡的性能。不过如果后端应用程序服务器共享了session,haproxy可以不用设置会话粘性相关的选项。

haproxy的默认配置文件中关于超时时间的设置应该修改,不少项设置都很不合理。

建议开启haproxy的X-Forwarded-For选项,使得后端服务器能够记录客户端的真实源IP地址。

建议开启haproxy的状态页面,并设置访问权限。

为了实现Haproxy完善的功能,上面几个问题是远远不够的,但可以在边使用haproxy过程中边增加功能使其不断完美。

2. 配置haproxy提供反向代理功能

假如要实现这样的环境:haproxy反向代理4个nginx节点,nginx1和nginx2结合php提供动态web服务,nginx3和nginx4提供静态web服务。如下图:

HAProxy配置示例和需要考虑的问题

由于默认配置文件中和超时时间相关的设置比较不合理,所以建议修改这些时间。另外还有些建议开启或关闭的的项也尽量开启或关闭。

默认配置如下:

global
    log        127.0.0.1 local2      # 需要设置/etc/rsyslog.conf加上local2设备的日志记录级别和日志路径
    chroot      /var/lib/haproxy
    pidfile    /var/run/haproxy.pid
    maxconn    4000                  # 这是前段对外的最大连接数。代理http时,1G空闲内存承载20000以上没大问题
    user        haproxy
    group      haproxy
    daemon
    stats socket /var/lib/haproxy/stats  # 开启动态查看、管理haproxy的状态文件
                                        # 另外建议设置spread-checks全局项,且百分比建议为2-5之间
defaults
    mode                    http        # 7层http代理,另有4层tcp代理
    log                    global
    option                  httplog      # 在日志中记录http请求、session信息等
    option                  dontlognull  # 不要在日志中记录空连接
    option http-server-close            # 后端为动态应用程序建议使用http-server-close,后端为静态建议使用http-keep-alive
    option forwardfor      except 127.0.0.0/8  # haproxy将在发往后端的请求中加上"X-Forwarded-For"首部字段
    option                  redispatch  # 当某后端down掉使得haproxy无法转发携带cookie的请求到该后端时,将其转发到别的后端上
    timeout http-request    10s    # 此为等待客户端发送完整请求的最大时长,应该设置较短些防止洪水攻击,如设置为2-3秒
                                    # haproxy总是要求一次请求或响应全部发送完成后才会处理、转发,
    timeout queue          1m      # 请求在队列中的最大时长,1分钟太长了。设置为10秒都有点长,10秒请求不到资源客户端会失去耐心
    timeout connect        10s    # haproxy和服务端建立连接的最大时长,设置为1秒就足够了。局域网内建立连接一般都是瞬间的
    timeout client          1m      # 和客户端保持空闲连接的超时时长,在高并发下可稍微短一点,可设置为10秒以尽快释放连接
    timeout server          1m      # 和服务端保持空闲连接的超时时长,局域网内建立连接很快,所以尽量设置短一些,特别是并发时,如设置为1-3秒
    timeout http-keep-alive 10s    # 和客户端保持长连接的最大时长。优先级高于timeout http-request高于timeout client
    timeout check          10s    # 和后端服务器成功建立连接后到最终完成检查的时长(不包括建立连接的时间,只是读取到检查结果的时长),
                                    # 可设置短一点,如1-2秒
    maxconn                3000    # 默认和前段的最大连接数,但不能超过global中的maxconn硬限制数

所以修改后建议配置为如下:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/5af248ca3793b2aa81691e65f1c6cf8a.html