我已经使用 HaProxy 的 stick-table 配置了一条基于 IP 连接数的规则,如下所示:
global
log /dev/log local0
log /dev/log local1 notice
chroot /var/lib/haproxy
user haproxy
group haproxy
daemon
# Default SSL material locations
ca-base /etc/ssl/certs
crt-base /etc/ssl/private
maxconn 60000
backend connectionstablev4
stick-table type ip size 1m expire 60s store conn_cur
frontend smtpv4
bind :25
tcp-request connection track-sc0 src table connectionstablev4
acl connabuse sc_conn_cur(0,connectionstablev4) gt 5
tcp-request connection reject if connabuse
# Reject any client that speak before the aloha
tcp-request inspect-delay 1s
acl content_present req_len gt 0
tcp-request content reject if content_present
default_backend smtp_backend
backend smtp_backend
mode tcp
timeout server 1m
timeout connect 5s
# Health check
option smtpchk HELO mx1.improvmx.com
server srv1 127.0.0.1:2525 check send-proxy maxconn 500
而且效果非常好。
但是,一旦我添加更多流程,如下所示(在全局部分):
global
# ... same as above
nbproc 6
cpu-map 1 1
cpu-map 2 2
cpu-map 3 3
cpu-map 4 4
cpu-map 5 5
cpu-map 6 6
每个 IP 的最大连接数停止工作。
我怀疑 stick-table 是基于每个进程的而不是全局的,但我找不到有关此事的任何信息。
问题显然出在 nbproc/cpu-map 上,因为只要我删除这部分,其他一切都能正常工作。
是否有一些规则或配置可以设置来指示 HaProxy 对所有进程使用相同的 stick-table?
提前致谢。
答案1
使用线程而不是进程。文档中直接提到了进程方面的问题。
https://cbonte.github.io/haproxy-dconv/2.2/configuration.html#3.1-nbthread
此设置仅在内置线程支持时可用。它使 haproxy 在线程上运行。这与“nbproc”是互斥的。虽然“nbproc”在历史上曾经是使用多个处理器的唯一方法,但它也涉及许多与进程(健康检查、对等点、stick-tables、统计数据等)之间缺乏同步有关的缺点,这些缺点不会影响线程。因此,强烈建议任何现代配置从“nbproc”迁移到“nbthread”。当 HAProxy 在前台启动时,“nbthread”也可以工作。在某些支持 CPU 亲和性的平台上,当不使用 nbproc 时,默认的“nbthread”值会自动设置为进程在启动时绑定到的 CPU 数量。这意味着可以使用“taskset”或“cpuset”等命令从调用进程轻松调整线程数。否则,此值默认为 1。默认值在“haproxy -vv”的输出中报告。另请参阅“nbproc”。