# nginx.conf (relevant bits) events {} http { # This now governs idle close for HTTP/2, since http2_idle_timeout is obsolete. keepalive_timeout 75s; # ← set to 60–80s to reproduce your prod-ish drop # Good defaults for streaming sendfile off; # avoid sendfile delays for tiny frames tcp_nodelay on; upstream app_upstream { server host.docker.internal:3030; keepalive 16; } server { listen 8443 ssl; # ← no ‘http2’ here… http2 on; # ← …use the standalone directive instead server_name localhost; ssl_certificate /etc/nginx/certs/cert.pem; ssl_certificate_key /etc/nginx/certs/key.pem; location / { # Make SSE actually stream through NGINX: proxy_buffering off; # don’t buffer gzip off; # don’t compress add_header X-Accel-Buffering no; # belt & suspenders for NGINX buffering proxy_set_header Accept-Encoding ""; # stop upstream gzip (SSE + gzip = sad) # Plain h1 to upstream is fine for SSE proxy_http_version 1.1; proxy_set_header Connection ""; proxy_read_timeout 30s; proxy_send_timeout 30s; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $remote_addr; proxy_pass http://app_upstream; } } }