• Feed
  • Explore
  • Ranking
/
/
    DevOps

    Nginx 리버스 프록시 502 에러 해결 방법

    Nginx 리버스 프록시 환경 구성중 특정 서비스에서 502 Bad Gateway 에러가 발생했고 이를 해결하는 과정
    NginxNext.jsPython FlaskReverse Proxy
    X
    Xeros
    2025.04.02
    ·
    4 min read

    두 가지 웹서비스 AAA 서비스와 BBB 서비스를 Docker Compose로 구성하여 운용 중이었으며, 각각 Python Flask, Next.js로 작성된 두 서비스는 서로 유기적으로 설계되어있어서 (로그인 세션 공유 등) Nginx의 리버스 프록시를 사용하여 다음과 같은 라우팅을 설정했습니다:

    • /, /service1, /service2 경로 → BBB 서비스 (포트 3000)

    • 나머지 모든 경로 → AAA 서비스 (포트 8000)

    그러나 BBB 서비스로 라우팅되는 경로들에서 502 Bad Gateway 에러가 발생했고 이를 해결하는 과정에서 알게 된 내용에 대해 포스팅합니다."

    원인 분석

    1. Nginx 로그 확인

    Nginx 로그를 확인해보니 다음과 같은 에러가 반복적으로 발생했습니다:

    connect() failed (111: Connection refused) while connecting to upstream
    

    이는 Nginx가 BBB 서비스에 연결할 수 없다는 것을 의미합니다.

    2. 컨테이너 상태 확인

    Docker 컨테이너들의 상태를 확인해보니

    • BBB 서비스 컨테이너는 정상적으로 실행 중

    • 포트 매핑도 정상적으로 되어 있음 (3000:3000)

    • 컨테이너 로그에서 서버가 정상적으로 시작되었다는 메시지 확인

    3. 네트워크 설정 확인

    BBB 서비스 컨테이너의 네트워크 설정을 확인해보니:

    {
        "Ports": {
            "3000/tcp": [
                {
                    "HostIp": "0.0.0.0",
                    "HostPort": "3000"
                }
            ]
        }
    }
    

    문제의 원인

    문제의 핵심은 BBB 서비스(Next.js)의 바인딩 주소였습니다. 기본적으로 Next.js는 localhost:3000으로만 바인딩되어 있어서, Docker 컨테이너 내부의 다른 서비스(Nginx)에서 접근할 수 없었습니다.

    해결 방법

    BBB 서비스의 package.json 파일에서 start 스크립트를 수정했습니다:

    { "scripts": { "start": "next start -H 0.0.0.0"  // 변경 전: "next start"  }}
    • H 0.0.0.0 옵션을 추가하여 Next.js 서버가 모든 네트워크 인터페이스에 바인딩되도록 했습니다.

    적용 및 결과

    변경 후 Docker 컨테이너를 재시작했습니다:

    docker-compose down
    docker-compose up -d

    이제 BBB 서비스가 0.0.0.0:3000으로 바인딩되어 Nginx가 접근할 수 있게 되었고, 502 에러가 해결되었습니다.

    결론

    1. Docker 컨테이너 간 통신에서는 서비스가 0.0.0.0으로 바인딩되어야 합니다.

    2. Next.js와 같은 웹 서버를 Docker 환경에서 사용할 때는 호스트 바인딩 설정을 확인해야 합니다.

    3. Nginx의 502 에러는 종종 업스트림 서버의 접근성 문제와 관련이 있습니다.

    참고: Nginx 설정

    문제 해결 후의 Nginx 설정은 다음과 같습니다:

    upstream bbb {
        server aaa:3000;
    }
    
    location /challenges {
        proxy_pass <http://visualizer>;
        proxy_redirect off;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Host $server_name;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }






    - 컬렉션 아티클