在Django应用程序中使用HAProxy和uWSGI执行第7层运行状况检查

问题描述

我正在使用此uwsgi.ini运行一个Django应用程序。

[uwsgi]
http-socket = :8000
enable-proxy-protocol = true
chdir = /usr/local/src/api
module = api.wsgi
uid = root
gid = root
pidfile = /var/run/api-uwsgi.pid
master = true
processes = 10
chmod-socket = 664
threaded-logger = true
logto = /var/log/api/uwsgi.log
log-maxsize = 10000000
logfile-chown = true
vacuum = true
die-on-term = true

添加一个API网址,以在/health-check网址下执行数据库和缓存运行状况检查。如果一切正常,此API返回状态码200。现在,我希望能够使用带有HAProxy的此API在第7层进行健康检查,但是使用option httpchk的响应状态代码为301,因此健康检查失败。这是我的HAProxy配置的后端部分。

backend http_server
  mode http
  balance leastconn
  option forwardfor
  http-request set-header X-Forwarded-Port %[dst_port]
  http-request add-header X-Forwarded-Proto https if { ssl_fc }
  option httpchk
  http-check send meth GET uri /health-check ver HTTP/1.1 hdr Accept application\json
  http-check expect rstatus 200
  server app1 192.168.0.11:8000 check inter 500 downinter 5s fall 2 rise 3
  server app2 192.168.0.12:8000 check inter 500 downinter 5s fall 2 rise 3

这是使用DjangouWsgi运行HAProxy应用的结果。请注意,第4层的运行状况检查正在按预期方式工作。

Server http_server/app2 is DOWN,reason: Layer7 wrong status,code: 301,info: "Moved Permanently",check duration: 54ms. 0 active and 0 backup servers left. 0 sessions active,0 requeued,0 remaining in queue.

那么是什么导致了这个问题,有没有办法解决它?

解决方法

有两个步骤可以解决此问题:

  1. 如果没有URL路由与请求的Django的{​​{1}}设置匹配,则将APPEND_SLASH附加到URL的末尾,并对该URL进行301重定向。我使用的是/而不是/health-check,因此请求已从/health-check/重定向到/health-check
  2. /health-check/的{​​{1}}选项接受键和值。对于hdr标头,该值必须在引号内,因此http-check变为accept

这是后端配置的最后一个工作部分:

hdr Accept application\json