Estoy usando este uwsgi.ini para ejecutar una aplicación 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

Agregué una URL de API para realizar comprobaciones de estado de la base de datos y la caché en la URL /health-check. Esta API devuelve el código de estado 200 si todo está bien. Ahora quiero poder verificar el estado de la capa 7 usando esta API con HAProxy pero usando option httpchk el código de estado de respuesta es 301, por lo que el control de estado falla. Aquí está la parte de backend de mi configuración de 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

Este es el resultado de ejecutar las aplicaciones Django con uWSGI y HAProxy. Tenga en cuenta que la verificación de estado en la capa 4 está funcionando como se esperaba.

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.

Entonces, ¿qué está causando este problema y hay alguna manera de solucionarlo?

2
MehrdadEP 29 ago. 2020 a las 20:06

1 respuesta

La mejor respuesta

Había dos pasos para resolver este problema:

  1. Si ninguna ruta de URL coincide con la solicitada, la configuración de Django APPEND_SLASH agrega un / al final de la URL y realiza un redireccionamiento 301 en eso. He utilizado /health-check en lugar de /health-check/, por lo que la solicitud se redirigió de /health-check a /health-check/
  2. La opción hdr de http-check acepta una clave y un valor. Para el encabezado accept, el valor debe estar entre comillas para que hdr Accept application\json se convierta en hdr accept "application/json"

Aquí está la parte final y funcional de la configuración de backend:

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 192.168.0.11:8000 check inter 500 downinter 2s fall 2 rise 3
  server 192.168.0.12:8000 check inter 500 downinter 2s fall 2 rise 3
3
MehrdadEP 30 ago. 2020 a las 17:20