nginx docker container: 502 localhost에서 nginx가 돌아가지 않는 이슈

김현재·2022년 6월 10일
1
post-thumbnail
post-custom-banner

문제 상황

docker container를 사용하는 pc를 host로 해서 올려보았다.
nginx에 루트 server port : 80으로 받고, proxy로 localhost:3000으로 보내주도록 설정을 짰다.

# 아래처럼 돌렸을 때 프록시를 연결 못하는 문제 발생
server {
        listen 80;
        server_name frontend;

        location / {
            proxy_pass http://localhost:3000;
        }
    } 
}

근데, localhost:80에서는 502 error가 뜨고,
localhost:3000으로 들어갔을때는 frontend앱이 잘 돌아가고 있다..!
도대체 뭐지;;

원인

docker container가 올라간 ip랑 내 local computer의 ip가 달라서 발생한 일
(docker container IP : 172.30… 내 컴퓨터는 172.20… 로 ip주소가 달랐다)

왜 host ip를 따르지 않는지 의문..(TBD 알아보겠음..)

해결 방법

  1. 무식하게 host ip를 nginx.conf에 지정해버린다

    server {
            listen 80;
            server_name frontend;
    
            location / {
                proxy_pass http://999.99.9:3000; # 임의의 ip입니다..!
            }
        } 
    }

    하지만 이 방법은 권장되지 않는다. 왜냐면, IP주소라는 건 유동적일 수 있기 때문에 매번 수정해줘야한다는 불편함 + 불안함과 함께해야하기 때문이다

  2. docker compose 설정을 통해 nginx가 host ip를 받아올 수 있도록 세팅한다
    nginx 설정을 통해서 위와 같은 문제를 해결할 수 있는데, host.docker.internal읈 사용하는 것이다.
    Host.docker.internal은 docker container의 host ip를 담고 있는 녀석으로, 아무리 host ip가바뀌어도 알아서 척척 잘 가져온다.
    사용하는 방법은 아래와 같다.

    1. docker-compose.yml 설정

      service:
      	nginx:
      		extra_hosts:
      			- "host.docker,internal:host-gateway"
    1. Nginx.conf 수정

      server {
      	listen 80;
      	server_name localhost;
      
      	location / {
      		proxy_pass http://host.docker.internal:3000
      	}
      }

참고자료

https://stackoverflow.com/questions/38346847/nginx-docker-container-502-bad-gateway-response
https://shanepark.tistory.com/209

profile
쉽게만 살아가면 재미없어 빙고!
post-custom-banner

0개의 댓글