Issue: recv() failed (104: Connection reset by peer) while proxying/upgrading WebSocket in NGINX with Socket.IO
Nobody has claimed this yet.
- Dominant language
- TypeScript
- Stars
- 63.2k
- Forks
- 10.3k
- Avg merge
- 11d 20h
- Merged PRs (30d)
- 2
Description
Describe the bug
We're encountering the following NGINX errors while using it as a reverse proxy to a Node.js server running Socket.IO. These errors occur during WebSocket connections.
1. While proxying upgraded WebSocket connection:
*10088819 recv() failed (104: Connection reset by peer) while proxying upgraded connection, client: <internal-ip>, server: , request: "GET /socket.io/?EIO=4&transport=websocket HTTP/1.1", upstream: "http://127.0.0.1:8080/socket.io/?EIO=4&transport=websocket", host: "<hostname>"
2. While reading response header from upstream:
*13983419 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: <internal-ip>, server: , request: "GET /socket.io/?EIO=4&transport=websocket HTTP/1.1", upstream: "http://127.0.0.1:8080/socket.io/?EIO=4&transport=websocket", host: "<hostname>"
Environment
- Node.js: 18.x
- Socket.IO: 4.7.4
- NGINX: 1.28.0
- Deployment: NGINX as a reverse proxy to a Node.js server
- Transport: WebSocket (transport=websocket)
- Clients: Mobile app (Socket.IO client)
What We’ve Checked
- These errors consistently occur randomly.
- Socket.IO server logs do not show any corresponding exceptions or disconnect messages.
- Other HTTP (non-WebSocket) traffic through NGINX works without issues.
- No known memory or CPU bottlenecks on the Node.js server.
- No aggressive timeouts or buffer limits are configured in NGINX.
Current NGINX Configuration
location /socket.io/ {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_pass http://nodes;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_connect_timeout 75s;
proxy_send_timeout 75s;
proxy_read_timeout 75s;
proxy_buffering off;
proxy_request_buffering off;
}
Questions / Guidance Needed
- We’re seeking help to understand and troubleshoot this behavior. Specifically:
- What are the common causes of recv() failed (104: Connection reset by peer) in a Socket.IO + NGINX setup, particularly during WebSocket upgrades?
- Is it possible for the Socket.IO server to terminate a connection without logging it?
- How can we distinguish whether the disconnect is triggered by the client, network, NGINX, or Socket.IO server?
- What debugging strategies or additional logging/tracing can help us isolate the root cause?
Additional Context
- Issue is strictly limited to WebSocket transport.
- NGINX and Node.js server are hosted on the same machine (127.0.0.1 backend).
- Client devices are stable and do not indicate network issues at their end.
- Please let us know what diagnostics or traces from the Socket.IO server we can enable to better trace or isolate this.
Thanks in advance for your help!
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start with the shown NGINX location /socket.io/ configuration and correlate its error logs with Socket.IO server logs and client-side disconnects during WebSocket upgrades. Done means determining whether the client, network, NGINX, or Node.js/Socket.IO server resets the connection, supported by diagnostic traces.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- nginx, node.js
- Domain
- backend, networking
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Quiet
- Clarity
- Needs clarification
- Newbie friendliness
- 35/100