问题描述
我正在使用此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
这是使用Django
和uWsgi
运行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.
那么是什么导致了这个问题,有没有办法解决它?
解决方法
有两个步骤可以解决此问题:
- 如果没有URL路由与请求的
Django
的{{1}}设置匹配,则将APPEND_SLASH
附加到URL的末尾,并对该URL进行301重定向。我使用的是/
而不是/health-check
,因此请求已从/health-check/
重定向到/health-check
-
/health-check/
的{{1}}选项接受键和值。对于hdr
标头,该值必须在引号内,因此http-check
变为accept
这是后端配置的最后一个工作部分:
hdr Accept application\json