跳转至

HAProxy代理

参考配置

# Global settings
#---------------------------------------------------------------------
global
    maxconn     20000
    log         /dev/log local0 info
    # debug
    # log         127.0.0.1 local0 debug 
    chroot      /var/lib/haproxy
    pidfile     /var/run/haproxy.pid
    user        haproxy
    group       haproxy
    daemon

    # turn on stats unix socket
    stats socket /var/lib/haproxy/stats

#---------------------------------------------------------------------
# common defaults that all the 'listen' and 'backend' sections will
# use if not designated in their block
#---------------------------------------------------------------------
defaults
    mode                    http
    log                     global
    option                  httplog
    option                  dontlognull
    # option http-server-close
    option forwardfor       except 127.0.0.0/8
    option                  redispatch
    retries                 3
    timeout http-request    10s

    timeout tunnel 1h
    timeout client-fin 30s
    timeout queue           1m
    timeout connect         10s
    timeout client          300s
    timeout server          300s
    timeout http-keep-alive 10s
    timeout check           10s
    maxconn                 200000

listen stats
    bind :9000
    mode http
    stats enable
    stats uri /

frontend route-80
    bind *:80
    acl denylist src 171.83.9.9 113.108.77.24 139.224.229.201
    tcp-request connection reject if denylist
    redirect scheme https if !{ ssl_fc }
    capture request header Host len 20
    capture request header Referer len 60
    default_backend route-80
    mode http
    option tcplog
    option httplog

backend route-80
    balance source
    mode http
    option forwardfor
    server      master1 192.168.146.211:80  send-proxy  check inter 3000 fall 3 rise 5
    server      master2 192.168.146.212:80  send-proxy  check inter 3000 fall 3 rise 5
    server      master3 192.168.146.213:80  send-proxy  check inter 3000 fall 3 rise 5

frontend route-443
    bind *:443
    acl denylist src 171.83.9.9 113.108.77.24 139.224.229.201
    tcp-request connection reject if denylist
    default_backend route-443
    mode tcp
    option tcplog
    option httplog

backend route-443
    balance source
    option forwardfor
    mode tcp
    server      master1 192.168.146.211:443  send-proxy  check inter 3000 fall 3 rise 5
    server      master2 192.168.146.212:443  send-proxy  check inter 3000 fall 3 rise 5
    server      master3 192.168.146.213:443  send-proxy  check inter 3000 fall 3 rise 5

frontend route-6443
    bind *:6443 npn spdy/2 alpn h2,http/1.1
    #bind *:6443
    default_backend route-6443
    mode tcp
    option forwardfor

backend route-6443
    balance source
    mode tcp
    option forwardfor
    maxconn         8000
    timeout client  60s
    server      master1 192.168.146.211:6443   check inter 3000 fall 3 rise 5
    server      master2 192.168.146.212:6443   check inter 3000 fall 3 rise 5
    server      master3 192.168.146.213:6443   check inter 3000 fall 3 rise 5

如果不需要 proxy protocol 的话,去掉 send-proxy 参数

内核参数调整

fs.file-max = 12453500
# 表示单个进程较大可以打开的句柄数;

fs.nr_open = 12453500
# 单个进程所允许的文件句柄的最大数目

kernel.shmall = 4294967296
# 内核允许使用的共享内存大 Controls the maximum number of shared memory segments, in pages

kernel.shmmax = 68719476736
# 单个共享内存段的最大值 Controls the maximum shared segment size, in bytes

kernel.msgmax = 65536
# 内核中消息队列中消息的最大值 Controls the maximum size of a message, in bytes

net.ipv4.tcp_tw_reuse = 1
# 参数设置为 1 ,表示允许将 TIME_WAIT 状态的 socket 重新用于新的 TCP 链接,这对于服务器来说意义重大,因为总有大量 TIME_WAIT 状态的链接存在;

ner.ipv4.tcp_keepalive_time = 600
# 当 keepalive 启动时,TCP 发送 keepalive 消息的频度;默认是 2 小时,将其设置为 10 分钟,可以更快的清理无效链接。

net.ipv4.tcp_fin_timeout = 30
# 当服务器主动关闭链接时,socket 保持在 FIN_WAIT_2 状态的较大时间

net.ipv4.tcp_max_tw_buckets = 5000
# 这个参数表示操作系统允许 TIME_WAIT 套接字数量的较大值,如果超过这个数字,TIME_WAIT 套接字将立刻被清除并打印警告信息。
# 该参数默认为 180000,过多的 TIME_WAIT 套接字会使 Web 服务器变慢。

net.ipv4.ip_local_port_range = 1025 65000
# 定义 UDP 和 TCP 链接的本地端口的取值范围。

net.ipv4.tcp_rmem = 10240 87380 12582912
# 定义了 TCP 接受缓存的最小值、默认值、较大值。

net.ipv4.tcp_wmem = 10240 87380 12582912
# 定义 TCP 发送缓存的最小值、默认值、较大值。

net.core.netdev_max_backlog = 8096
# 当网卡接收数据包的速度大于内核处理速度时,会有一个列队保存这些数据包。这个参数表示该列队的较大值。

net.core.rmem_default = 6291456
# 表示内核套接字接受缓存区默认大小。

net.core.wmem_default = 6291456
# 表示内核套接字发送缓存区默认大小。

net.core.rmem_max = 12582912
# 表示内核套接字接受缓存区较大大小。

net.core.wmem_max = 12582912
# 表示内核套接字发送缓存区较大大小。

# 注意:以上的四个参数,需要根据业务逻辑和实际的硬件成本来综合考虑;

net.ipv4.tcp_syncookies = 1
# 与性能无关。用于解决 TCP 的 SYN 攻击。

net.ipv4.tcp_max_syn_backlog = 8192
# 这个参数表示 TCP 三次握手建立阶段接受 SYN 请求列队的较大长度,默认 1024,将其设置的大一些可以使出现繁忙来不及 accept 新连接的情况时,Linux 不至于丢失客户端发起的链接请求。

net.ipv4.tcp_tw_recycle = 1
# 这个参数用于设置启用 timewait 快速回收。

net.core.somaxconn=262114
# 选项默认值是 128,这个参数用于调节系统同时发起的 TCP 连接数,在高并发的请求中,默认的值可能会导致链接超时或者重传,因此需要结合高并发请求数来调节此值。

net.ipv4.tcp_max_orphans=262114
# 选项用于设定系统中最多有多少个 TCP 套接字不被关联到任何一个用户文件句柄上。如果超过这个数字,孤立链接将立即被复位并输出警告信息。这个限制指示为了防止简单的 DOS 攻击,不用过分依靠这个限制甚至认为的减小这个值,更多的情况是增加这个值。