Hello,
since a while I see connection errors in my HAProxy-Logs, looking like this:
<134>Nov 20 13:19:10 haproxy[8]: <redacted>:60923 [20/Nov/2023:13:18:41.494]
http~ nextcloud/nextcloud 0/0/18/-1/28956 500 208 - - IH-- 19/19/0/0/0 0/0
{<redacted>} "PUT
https://<redacted>/remote.php/dav/uploads/<redacted>/5D56BCEB-AE7E-423A-B424-DCAB3F98C590/3
HTTP/2.0"
According to the documentation, a termination state of "I" should never happen
and be reported together with logs.
Now my Problem is: I don't have any more logs, besides that one line being
logged.
Therefore my question: What can I do to get further information about when/why
this occurs?
To give more background information: I am running HAProxy 2.9-dev10-db09cd6
(the docker image "haproxytech/haproxy-ubuntu-quic:2.9"
As you can see from the log line, (even though I have enabled HTTP/3), this
error occurs on a HTTP/2 SSL-Connection.The backend is a "NextCloud" instance.
So far, I only observed those "IH" Errors when uploading photos via the
smartphone application. I am not able to reproduce those errors on purpose, but
once one happens, there is a chance that retrying the request will produce the
same error again."In front" of nextcloud actually is an Apache2-Webserver (that
ships with the nextcloud docker container).
I was able to find the request in the apache logs:
<redacted> - <redacted> [20/Nov/2023:13:19:39 +0000] "PUT
/remote.php/dav/uploads/<redacted>/5D56BCEB-AE7E-423A-B424-DCAB3F98C590/3
HTTP/1.1" 204 656 "-" "Mozilla/5.0 (iOS) Nextcloud-iOS/4.9.1"
(Don't be surprised that the timestamps don't perfectly match. Apparently the
clock on both machines are not in sync).
(And: Actually this request returned a 204, because this was already a retry
form the client. In the initial request, the response was 201, but caused the
same IH error)
I tried restarting HAProxy multiple times, but every now and then, it happens
again.
I remember, that I also had that issue with older 2.9 builds, but I don't
remember any more, if this also happened on 2.8 build.
If helpful to you, this is my haproxy -vv:
HAProxy version 2.9-dev10-db09cd6 2023/11/18 - https://haproxy.org/Status:
development branch - not safe for use in production.Known bugs:
https://github.com/haproxy/haproxy/issues?q=is:issue+is:openRunning on: Linux
6.4.9-arch1-1 #1 SMP PREEMPT_DYNAMIC Tue, 08 Aug 2023 22:14:05 +0000
x86_64Build options : TARGET = linux-glibc CPU = generic CC = cc
CFLAGS = -O2 -g -Wall -Wextra -Wundef -Wdeclaration-after-statement
-Wfatal-errors -Wtype-limits -Wshift-negative-value -Wshift-overflow=2
-Wduplicated-cond -Wnull-dereference -fwrapv -Wno-address-of-packed-member
-Wno-unused-label -Wno-sign-compare -Wno-unused-parameter -Wno-clobbered
-Wno-missing-field-initializers -Wno-cast-function-type -Wno-string-plus-int
-Wno-atomic-alignment OPTIONS = USE_PTHREAD_EMULATION=1 USE_LINUX_TPROXY=1
USE_GETADDRINFO=1 USE_OPENSSL=1 USE_LUA=1 USE_SLZ=1 USE_TFO=1 USE_QUIC=1
USE_PROMEX=1 USE_PCRE2=1 USE_PCRE2_JIT=1 DEBUG = -DDEBUG_STRICT
-DDEBUG_MEMORY_POOLS
Feature list : -51DEGREES +ACCEPT4 +BACKTRACE -CLOSEFROM +CPU_AFFINITY +CRYPT_H
-DEVICEATLAS +DL -ENGINE +EPOLL -EVPORTS +GETADDRINFO -KQUEUE -LIBATOMIC
+LIBCRYPT +LINUX_CAP +LINUX_SPLICE +LINUX_TPROXY +LUA +MATH -MEMORY_PROFILING
+NETFILTER +NS -OBSOLETE_LINKER +OPENSSL -OPENSSL_AWSLC -OPENSSL_WOLFSSL -OT
-PCRE +PCRE2 +PCRE2_JIT -PCRE_JIT +POLL +PRCTL -PROCCTL +PROMEX
+PTHREAD_EMULATION +QUIC -QUIC_OPENSSL_COMPAT +RT +SHM_OPEN +SLZ +SSL
-STATIC_PCRE -STATIC_PCRE2 -SYSTEMD +TFO +THREAD +THREAD_DUMP +TPROXY -WURFL
-ZLIB
Default settings : bufsize = 16384, maxrewrite = 1024, maxpollevents = 200
Built with multi-threading support (MAX_TGROUPS=16, MAX_THREADS=256,
default=8).Built with OpenSSL version : OpenSSL 3.1.2+quic 1 Aug 2023Running on
OpenSSL version : OpenSSL 3.1.2+quic 1 Aug 2023OpenSSL library supports TLS
extensions : yesOpenSSL library supports SNI : yesOpenSSL library supports :
TLSv1.0 TLSv1.1 TLSv1.2 TLSv1.3OpenSSL providers loaded : defaultBuilt with Lua
version : Lua 5.4.4Built with the Prometheus exporter as a serviceBuilt with
network namespace support.Built with libslz for stateless
compression.Compression algorithms supported : identity("identity"),
deflate("deflate"), raw-deflate("deflate"), gzip("gzip")Built with transparent
proxy support using: IP_TRANSPARENT IPV6_TRANSPARENT IP_FREEBINDBuilt with
PCRE2 version : 10.39 2021-10-29PCRE2 library supports JIT : yesEncrypted
password support via crypt(3): yesBuilt with gcc compiler version 11.4.0
Available polling systems : epoll : pref=300, test result OK poll :
pref=200, test result OK select : pref=150, test result OKTotal: 3 (3
usable), will use epoll.
Available multiplexer protocols :(protocols marked as <default> cannot be
specified using 'proto' keyword) quic : mode=HTTP side=FE mux=QUIC
flags=HTX|NO_UPG|FRAMED h2 : mode=HTTP side=FE|BE mux=H2
flags=HTX|HOL_RISK|NO_UPG fcgi : mode=HTTP side=BE mux=FCGI
flags=HTX|HOL_RISK|NO_UPG <default> : mode=HTTP side=FE|BE mux=H1
flags=HTX h1 : mode=HTTP side=FE|BE mux=H1 flags=HTX|NO_UPG
<default> : mode=TCP side=FE|BE mux=PASS flags= none : mode=TCP
side=FE|BE mux=PASS flags=NO_UPG
Available services : prometheus-exporterAvailable filters : [BWLIM] bwlim-in
[BWLIM] bwlim-out [CACHE] cache [COMP] compression [FCGI] fcgi-app [SPOE] spoe
[TRACE] trace
And finally the hopefully relevant bits of my config: (I left out unrelated
backends and "use_backend XX if {...}")
global stats socket /tmp/haproxy.sock mode 660 level admin expose-fd
listeners
maxconn 10000 log stdout local0 log stdout local1 notice
user haproxy stats timeout 30s daemon
ssl-default-bind-ciphers
ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384
ssl-default-bind-options no-sslv3 no-tlsv10 no-tlsv11 no-tls-tickets
ssl-default-server-ciphers
ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384
ssl-default-server-options no-sslv3 no-tlsv10 no-tlsv11 no-tls-tickets
tune.ssl.default-dh-param 2048 tune.bufsize 10485760
peers myCluster peer <local-instance> *:10000 peer <peer-instance>
10.255.255.8:10000
defaults mode http option dontlognull timeout connect 5s timeout
client 10m timeout server 10m default-server inter 3s option
http-server-close errorfile 503 /usr/local/etc/haproxy/5xx.http
frontend http capture request header Host len 32 log-format %hr\ %r\ %st\
%B\ %Tr
bind *:80 bind *:443 ssl crt /usr/local/etc/haproxy/certs/ alpn
h2,http/1.1 bind quic4@:443 ssl crt /usr/local/etc/haproxy/certs/ alpn h3
mode http log global option httplog
maxconn 8000
stats enable stats uri /stats http-request use-service
prometheus-exporter if { path /<redacted>/prometheus/metrics } # sraped by
influxdb
http-response set-header Strict-Transport-Security max-age=16000000;\
includeSubDomains;\ preload; # 'Alt-Svc' header invites client to switch to
the QUIC protocol # Max age (ma) is set to 15 minutes (900 seconds), but #
can be increased once verified working as expected http-response set-header
alt-svc "h3=\":443\";ma=3600;"
acl internal_ip src 10.0.0.0/8 192.168.5.0/24 172.18.0.0/24
http-response set-header X-Frame-Options "SAMEORIGIN" http-response
set-header X-Content-Type-Options "nosniff"
http-request track-sc0 src table table-ip-whitelist if TRUE acl
isAuthenticated src_get_gpc0(table-ip-whitelist) gt 0 http-request
set-header X-Forwarded-For %[src] # Setting header explicit, as default
behavior is append
use_backend nextcloud if { hdr(Host) <redacted> } default_backend
deny
backend table-ip-whitelist stick-table type ip size 1m expire 86400s store
gpc0 peers myCluster
backend nextcloud mode http server nextcloud 192.168.5.63:80 check
is there a way to get more information about when/why the "IH" termination
happens?
Thanks a lotMarno