Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- MySQL
- 부트캠프
- 에프랩
- 자바
- 후기
- 백엔드
- 로드밸런서
- backend
- java
- nGrinder
- 멘토링
- 도커
- Spring
- redis
- 알고리즘
- EC2
- 트러블슈팅
- 성능테스트
- AWS
- F-Lab
- 레디스
- 코딩테스트
- FLAB
- github
- Flutter
- error
- grafana
- 데이터구조
- 플러터
- 자바백엔드
Archives
- Today
- Total
민스씨의 일취일장
TIssue | Nginx | EC2 | 도커 컨테이너로 띄운 로드밸런서가 하나의 서버만 연결하는 이슈 본문
반응형
로드 밸런서가 한 곳만 포워딩하는 이슈 해결방법에 대한 글입니다.
로드 밸런서가 하나의 서버만 연결하는 이슈
Tissue
오늘의 이슈는 다음과 같다.
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
반응형
'Projects > MetaPay' 카테고리의 다른 글
Grafana | 성능 테스트 | 모니터링 | 필요한 지표들 선정한 뒤 그라파나 대시보드 생성하기 (0) | 2024.08.16 |
---|---|
성능 테스트 | 컨테이너 메모리 제한 설정 (0) | 2024.08.16 |
TIssue | EC2 내 컨테이너에서 로컬 PC로의 요청이 전달되지 않는 이슈 (feat. Public IP vs. Private IP) (0) | 2024.08.14 |
VisualVM | Java 애플리케이션의 모니터링 도구 with Docker (0) | 2024.08.07 |
프로젝트 | PaymentService 만들며 익힌 기본기 - PR, 예외처리, Test Code, SRP (0) | 2024.07.24 |