我有三个服务器:
server (A)= a nginx(port 80) as reverse proxy to kestler (5000 port)
server (B)= a nginx(port 80) as reverse proxy to kestler (5000 port)
server (C)= a HAProxy as load balancer for port 80 of server (A) and (B)
and server A & B are quite similar.每件事情都运行得很好,haproxy将请求转发给服务器(A)和(B),但是如果其中一个服务器(例如A)中的kestrel被杀死,nginx会响应502个错误的网关错误,haproxy没有检测到这个问题,并且仍然将请求重定向到它,这是错误的!此时它必须将请求重定向到服务器(B)。
global
log 127.0.0.1 local2 info
chroot /var/lib/haproxy
stats socket /run/haproxy/admin.sock mode 660 level admin
stats timeout 30s
user haproxy
group haproxy
daemon
defaults
log global
mode http
option httplog
option dontlognull
option redispatch
retries 3
timeout connect 5s
timeout client 50s
timeout server 50s
stats enable
stats hide-version
stats auth admin:admin
stats refresh 10s
stats uri /stat?stats
frontend http_front
bind *:80
mode http
option httpclose
option forwardfor
reqadd X-Forwarded-Proto:\ http
default_backend http_back
backend http_back
balance roundrobin
mode http
cookie SERVERID insert indirect nocache
server ServerA 192.168.1.2:80 check cookie ServerA
server ServerB 192.168.1.3:80 check cookie ServerB我怎样才能解决这个问题?非常感谢。
发布于 2018-05-31 08:00:19
您只检查nginx是否正在运行,而不是应用程序是否健康到可以使用。
在backend中,添加option httpchk。
option httpchk GET /some/path HTTP/1.1\r\nHost:\ example.com将some path替换为一个路径,该路径将证明如果应用程序返回200 OK (或任何2xx或3xx响应)应用程序在该服务器上是否可用,并将example.com替换为应用程序所期望的HTTP Host报头。
option httpchk默认情况下,服务器健康检查只包含试图建立TCP连接。当指定option httpchk时,一旦建立了TCP连接,就会发送一个完整的HTTP请求,响应2xx和3xx被认为是有效的,而所有其他响应都表示服务器故障,包括没有任何响应。
如果应用程序不健康,这会将服务器标记为不健康,因此HAProxy将停止向其发送流量。您将希望在每个服务器entey上使用inter、downinter和fastinter选项为每个服务器配置一个检查间隔,以指定HAProxy应该多久执行一次检查。
https://stackoverflow.com/questions/50590174
复制相似问题