ECONNREFUSED

Network - Server actively refused the connection

Connection Refused Error

What It Means

Connection refused means the TCP connection was actively rejected. The server received your connection request but responded with a RST (reset) packet, indicating nothing is listening on that port.

# Browser error
ERR_CONNECTION_REFUSED

# Node.js/curl error
Error: connect ECONNREFUSED 127.0.0.1:3000

# Python error
ConnectionRefusedError: [Errno 111] Connection refused

Connection Refused vs Timeout

  • Connection Refused: Server is reachable but nothing is listening on that port (instant response)
  • Connection Timeout: Server is unreachable or packets are being dropped (slow, eventually fails)

Common Causes

  • Service not running: The application hasn't started or crashed
  • Wrong port: Connecting to the wrong port number
  • Bound to localhost only: Service only listening on 127.0.0.1
  • Firewall blocking: Local firewall rejecting connections
  • Wrong IP address: Server moved to different IP
  • Container not exposed: Docker port not mapped

Diagnosing the Issue

# Check if process is listening on the port
ss -tlnp | grep :3000
netstat -tlnp | grep :3000
lsof -i :3000

# Check if port is open
nc -zv localhost 3000
telnet localhost 3000

# Check from another machine
curl -v http://server-ip:3000

# Check service status
systemctl status nginx
systemctl status node-app
docker ps

# Check what the process is bound to
ss -tlnp | grep node
# 127.0.0.1:3000 = localhost only
# 0.0.0.0:3000   = all interfaces (accessible remotely)

Service Not Running

# Start the service
systemctl start nginx
systemctl start your-app

# Check logs if it won't start
journalctl -u nginx -n 50
journalctl -u your-app -n 50

# Start a Node.js app
node server.js &

# Or with PM2
pm2 start server.js
pm2 logs

Bound to Localhost Only

If your app binds to 127.0.0.1, it won't accept remote connections.

# Node.js - bind to all interfaces
app.listen(3000, '0.0.0.0', () => {
  console.log('Listening on all interfaces');
});

# Python Flask
app.run(host='0.0.0.0', port=5000)

# Django
python manage.py runserver 0.0.0.0:8000

# Nginx - check listen directive
listen 80;           # All interfaces
listen 127.0.0.1:80; # Localhost only

Docker Port Mapping

# Wrong - port not exposed
docker run myapp

# Correct - map host port to container port
docker run -p 3000:3000 myapp

# Check exposed ports
docker ps
docker port container_name

# docker-compose.yml
services:
  app:
    ports:
      - "3000:3000"

Firewall Rules

# UFW (Ubuntu)
sudo ufw status
sudo ufw allow 3000/tcp
sudo ufw reload

# iptables
sudo iptables -L INPUT -n --line-numbers
sudo iptables -A INPUT -p tcp --dport 3000 -j ACCEPT

# firewalld (RHEL/CentOS)
sudo firewall-cmd --list-all
sudo firewall-cmd --add-port=3000/tcp --permanent
sudo firewall-cmd --reload

# Windows
netsh advfirewall firewall show rule name=all

Quick Checklist

  • Is the service running? systemctl status
  • Is it listening on the right port? ss -tlnp
  • Is it bound to 0.0.0.0 or just localhost?
  • Is the firewall allowing the port?
  • Are you connecting to the right IP/hostname?
  • If Docker, is the port mapped?

How to Monitor for Connection Refused Errors

Connection refused means your service is down. UptimeSignal detects connection refused errors immediately and alerts you when services stop accepting connections. Monitor all critical ports: 80 (HTTP), 443 (HTTPS), 22 (SSH), 5432 (PostgreSQL), 6379 (Redis).

Frequently Asked Questions

What does "connection refused" mean?
Connection refused (ECONNREFUSED) means the server received your TCP connection request but actively rejected it with a RST packet. No process is listening on that port. The machine is reachable but the service isn't running. This is different from a timeout where you get no response at all.
What causes ECONNREFUSED?
The server application isn't running (crashed or never started), the app listens on a different port or interface (127.0.0.1 vs 0.0.0.0), a firewall actively rejects connections (REJECT rule), Docker container port mapping is wrong, or the application crashed after starting. Check with ss -tlnp | grep PORT.
How do I fix connection refused?
1. Check if service is running: systemctl status service-name. 2. Verify port: ss -tlnp | grep PORT. 3. Check bind address (use 0.0.0.0 for remote access). 4. Check firewall: ufw status. 5. For Docker: verify port mapping with docker ps.
What is the difference between connection refused and timeout?
Connection refused returns immediately -- the server sent a TCP RST. Connection timeout means no response at all, packets are silently dropped (usually by a firewall). Refused = server reachable but port closed. Timeout = server unreachable or firewall using DROP instead of REJECT.
Why does my Docker container return connection refused?
The app inside the container may bind to 127.0.0.1 (localhost) instead of 0.0.0.0 (all interfaces). Docker port mapping (-p 8080:3000) only works if the app inside listens on 0.0.0.0. Also verify the container is running (docker ps) and the port mapping matches your app's listen port.

Catch ECONNREFUSED before your users do

UptimeSignal detects connection refused errors within minutes and alerts you instantly.

Monitor all your ports and endpoints. 25 monitors free, unlimited for $15/month.

Related Errors & Resources