민스씨의 일취일장

TIssue | Nginx | EC2 | 도커 컨테이너로 띄운 로드밸런서가 하나의 서버만 연결하는 이슈 본문

Projects/MetaPay

TIssue | Nginx | EC2 | 도커 컨테이너로 띄운 로드밸런서가 하나의 서버만 연결하는 이슈

읻민스 2024. 8. 14. 18:12
반응형

로드 밸런서가 한 곳만 포워딩하는 이슈 해결방법에 대한 글입니다.

로드 밸런서가 하나의 서버만 연결하는 이슈

Tissue

Tissue Load Balancer 한 곳만 연결하는 이슈 썸네일 이미지이다.
TIssue Load Balanceer

오늘의 이슈는 다음과 같다.

EC에 띄운 Nginx 로드밸런서가 요청을 하나의 컨테이너로만 전달한다.
(원래는 두 컨테이너에 번갈아 가면서 전달해야 한다.)

상황파악 - 기존 Nginx 설정

events{
        worker_connections 1024;
}

http{
        upstream payment_service{
                server metapay-payment:8080;
                server metapay-payment2:8081;
        }

        server {
                listen 80;

                location /payments {
                        proxy_pass http://payment_service;
                        proxy_set_header Host $host;
                        proxy_set_header X-Real-IP $remote_addr;
                        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                }
        }
}

원인 파악 과정 1 - 컨테이너 포트 이해 부족 

http  upstream-payment_service 설정을 보면 하나는 8080포트 다른 하나는 8081로 되어있는 있는 것을 볼 수 있다. 도커파일에서 EXPOSE 값을 8081로 해주면 해당 스프링 서비스가 8081로 생성될거라고 생각했다. 하지만 EXPOSE 8081은 해당 컨테이너 포트가 열린 것이고, 스프링 서비스는 8080을 사용할 수 있으면 기본적으로 8080포트를 사용한다.

원인 파악 과정 2 - 같은 네트워크 내의 컨테이너간 통신

컨테이너를 생성할 때 포트 매핑을 한다.

<Port of Host>:<Port of Service in Container>
<호스트포트>:<컨태이너 내 서비스 포트>

외부에서 해당 서비스에 접근하기 위해선 호스트포트로 접근하면 컨테이너가 컨테이너 내 열린 포트로 포워딩을 해준다. 하지만 이것 어디까지나 "외부"에서 접근할 때 이야기이다. 만약 같은 네트워크로 구성돼 있는 컨테이너들끼리 통신할 땐 "호스트포트"를 사용하지 않는다. 즉 바로 "컨테이너이름:컨테이너 내 서비스 포트"를 사용해서 접근한다.

<컨테이너이름>:<컨테이너 내 서비스 포트>

원인 - http upstream 잘못 설정

즉, 위와 같이 작성된 로드밸런서가 하나의 서비스만 연결해준 이유는 http.upstream에서 두 번째 주소에 잘못된 포트가 작성돼 있었기 때문이다. 같은 네트워크에 위치한 Nginx와 두 서비스는 모두 자신의 포트를 이용해서 접근할 수 있다. (호스트 포트 사용없이) 따라서 서비스1과 서비스2 모두 8080포트를 사용해야 한다.

해결책

위의 Nginx 설정에서 포트를 서비스 포트인 8080으로 설정해 줘야 한다.

...
http{
        upstream payment_service{
                server metapay-payment:8080;
                server metapay-payment2:8080; // <- 수정내용
        }
...

이렇게 바뀌고 아주 잘 작동하는 로드밸런서를 확인할 수 있었다.

728x90
반응형