Am un backend în spatele haproxy care transmite un fișier către client folosind un script CGI. Încerc să setez un timeout pentru serverele mele backend. Toate funcționează bine, cu excepția acestui timeout.
Când setez opțiunea „server de expirare” din configurația haproxy la 1 secundă (doar pentru a testa - backend-ul durează cel puțin 2-3 secunde) și fac o cerere, după 1 secundă pune o intrare în fișierul jurnal pt. cererea de backend (înainte ca cererea să fie finalizată) și de acolo, se blochează pentru totdeauna. Clientul nu primește niciodată un răspuns, nicio eroare, nimic.
M-am uitat prin toate documentele pentru configurația haproxy și nu am găsit nicio opțiune de timeout care să aibă sens aici. Dar acesta pare a fi un comportament prestabilit foarte ciudat, care se blochează pentru totdeauna dacă expirarea este atinsă fără un răspuns complet (de atunci mi-am dat seama că setarea ar trebui să fie un timeout doar pentru anteturi - dar se pare că nu găsesc o altă setare de timeout pentru backend).
Haproxy pur și simplu nu acceptă niciun fel de răspuns HTTP de streaming? Înțeleg că nu putem trimite un antet - dar îl pot seta să trimită orice date pe care le are, astfel încât clientul să înțeleagă că este malformat?
Iată o linie de jurnal pentru una dintre aceste solicitări care „a expirat”:
Apr 28 09:32:51 print haproxy[29896]: 127.0.0.1:37662 [28/Apr/2022:09:32:47.317] http_front http_back/SERVERNAME 2/3007/23/46/4080-2 - -00 - 1/1/0/0/+3 0/0 „POST / HTTP/1.1”
Configurație haproxy completă:
global
log /dev/log local0
log /dev/log local1 notificare
chroot /var/lib/haproxy
socket statistici /run/haproxy/admin.sock mod 660 nivel de administrare expose-fd ascultători
statistici timeout 30s
utilizator haproxy
haproxy de grup
demonul
# Locații implicite ale materialelor SSL
ca-base /etc/ssl/certs
crt-base /etc/ssl/private
# Vezi: https://ssl-config.mozilla.org/#server=haproxy&server-version=2.0.3&config=intermediate
ssl-default-bind-ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AESCMDHE-RSA-AES256-ECDSA-ECDSA-GCM -CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384
ssl-default-bind-ciphersuites TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256
ssl-default-bind-options ssl-min-ver TLSv1.2 no-tls-tickets
implicite
jurnal global
modul http
opțiunea httplog
opțiunea dontlognull
reexpedierea opțiunii
reîncercări 3
timeout queue 15m # Cât timp trebuie să aștepte un client pentru ca un server să devină disponibil.
#maxconn 10000
timeout client 15m
timeout conectare 1s
timeout server 10s
sesiuni cu rată-limită 10000
fişierul de erori 400 /etc/haproxy/errors/400.http
fişierul de erori 403 /etc/haproxy/errors/403.http
fişierul de erori 408 /etc/haproxy/errors/408.http
fişierul de erori 500 /etc/haproxy/errors/500.http
fişierul de erori 502 /etc/haproxy/errors/502.http
fişierul de erori 503 /etc/haproxy/errors/503.http
fişierul de erori 504 /etc/haproxy/errors/504.http
frontend http_front
lega *:88
statistici uri /haproxy?stats
default_backend http_back
#maxconn 10000
backend http_back
echilibru minimumconn
reîncercați toate erorile care pot fi reîncercate
default-server maxconn 1 observa layer7 error-limit 1 on-error mark-down
server NAME IP:PORT