[Fixed] Connection refused nginx proxy for Docker containers – Docker

by
Ali Hasan
boot2docker jwilder-nginx-proxy nginx-reverse-proxy

Quick Fix: To rectify the connection refused error while using nginx proxy for Docker containers, make sure to specify the containers’ internal port instead of the exposed port in the proxy_pass directive. For instance, use :80 instead of :3000 and :8080.

The Problem:

The user is trying to set up an nginx proxy pass between two docker containers. The frontend container seems to be working fine, but the backend container is returning a 502 error. The user has checked that the IP addresses and ports for the containers are correct, but the problem persists.

The Solutions:

Solution 1: Use Internal Port of the Backend Container

In the nginx local.conf file, change the proxy_pass directives to use the internal port of the backend container instead of the host port. The internal port is typically 80 for web containers.

location / {
    proxy_pass http://frontend:80;
    error_log /var/log/frontend_errors.log;
}

location /api {
    proxy_pass http://backend:80;
    error_log /var/log/backend_errors.log;
}

Solution 2: Expose Backend and Frontend Ports

In the docker-compose.yml file, expose the ports for both the backend and frontend containers. This will allow the proxy container to communicate with them on specific ports.

Modified docker-compose.yml:

...
services:
  backend:
    ...
    ports:
      - "8000:8000"  # Expose backend port
  frontend:
    ...
    ports:
      - "3000:3000"  # Expose frontend port
  proxy:
    ...
...

In the nginx.conf file, update the proxy_pass directives to use the exposed ports:

events {
    worker_connections 1024;
}

http {
    server {
        listen 80 default_server;

        location / {
            proxy_pass http://localhost:3000;
            error_log /var/log/frontend_errors.log;
        }

        location /api {
            proxy_pass http://localhost:8000;
            error_log /var/log/backend_errors.log;
        }
    }
}

By exposing the ports and updating the proxy_pass directives, the proxy container will be able to access the backend and frontend containers on the correct ports, resolving the connection refused error.

Solution 3: Troubleshooting the Connection Refused Error

To resolve the “connect() failed (111: Connection refused)” error, follow these troubleshooting steps:

  1. Verify Backend Container: Ensure the backend container is running; start it using `docker-compose up backend`.
  2. Confirm Backend Container’s Port: Check if port 8000 is open in the backend container using `docker-compose exec backend netstat -tlnp`.
  3. Network Connectivity: Test network communication between frontend and backend containers using `docker-compose exec frontend ping backend` and `docker-compose exec backend ping frontend`.
  4. Nginx Configuration: Verify the correct spelling of the backend service in the `nginx.conf` file. Use `docker-compose exec proxy ping backend` to ensure reachability from the proxy container.
  5. Backend Container Logs: Examine the backend container logs for errors using `docker-compose logs backend`.
  6. Backend Container’s IP Address: Confirm that the backend container’s IP address matches the one Nginx is attempting to connect to, obtained using `docker-compose exec backend netstat -tlnp | grep 8000`.

If these steps do not resolve the issue, you may encounter the problem elsewhere (e.g., in Dockerfiles or frontend container logs). Additional information may be necessary for further investigation.

Q&A

when i run npm run dev get error: error TS2304: Cannot find name 'pending'.?

you should remove esModuleInterop: true from the tsconfig.json file.

How to fix ora error: error TS2339: Property 'start' does not exist on type 'typeof import('ora')',

add --noEmitOnError to tsconfig.json

Video Explanation:

The following video, titled "How To Configure NGINX To Avoid 502 Bad Gateway When ...", provides additional insights and in-depth exploration related to the topics discussed in this post.

Play video

... Docker container