본문 바로가기

콘서트 티켓 프로젝트

Nginx 로드밸런싱 설정하기

 

1) 서문

- 이 글에서는 Nginx 로드밸런서를 도커로 GCP에 배포한 과정에 대해서 다뤄보겠습니다.

  콘서트 티켓 프로젝트에서는 고가용성, 부하 조절을 위해 Nginx를 도입했습니다.

 

 

2) Nginx 도입 과정

 

(1) Nginx용 GCP 인스턴스 생성

 

- Nginx 배포를 위한 GCP 인스턴스를 독립적으로 생성합니다. 

 

(2) Nginx 도커 이미지 다운로드

 

- docker pull nginx를 통해 Nginx 도커 이미지를 다운로드할 수 있습니다. 

 

(3) nginx.conf 설정 

 

-nginx.conf는 Nginx의 기본 설정 파일로, 모든 설정에 대한 진입점입니다.

 워커 프로세스 개수, 튜닝, 동적 모듈 적재와 같은 글로벌 설정 항목을 포함하여,

 다른 Nginx 세부 설정 파일에 대한 참조를 지정합니다. 

 


(3-1) 설정 분석

- 전역 설정

worker_processes auto; events { worker_connections 1024; }
  • worker_processes auto; → CPU 코어 수에 맞춰 워커 프로세스를 자동으로 조정
  • worker_connections 1024; → 각 워커가 동시에 처리할 수 있는 최대 연결 수 설정


- Upstream 서버 설정
(1) 웹소켓 서버 그룹
upstream websocket_servers
{ least_conn;
  server 34.64.102.105:8081;
  server 34.64.36.141:8081; }

  • upstream websocket_servers → 웹소켓 서버들을 하나의 그룹으로 묶음
  • least_conn; → 가장 적은 연결을 가진 서버로 우선 라우팅
  • 두 개의 웹소켓 서버(8081 포트 사용)로 요청을 분배

(2) Spring 서버 그룹

upstream spring_servers {
 least_conn;
 server 34.64.102.105:8080;
 server 34.64.36.141:8080; }
  • upstream spring_servers → Spring 서버들을 하나의 그룹으로 묶음
  • least_conn; → 현재 연결 수가 가장 적은 서버로 트래픽 분배
  • 두 개의 백엔드 서버(8080 포트 사용)로 요청을 전달

-서버 블록

- 기본 설정

server { listen 80;
  • listen 80; → 80번 포트(HTTP)에서 요청을 받음
  • 이 서버 블록 안에서 웹소켓과 API 요청을 각각 처리

- 웹소켓 요청 처리

location /gs-guide-websocket {
proxy_pass http://websocket_servers;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
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-Proto $scheme; }

- 설명

  • /gs-guide-websocket 경로로 요청이 들어오면 websocket_servers 그룹으로 보냄
  • proxy_http_version 1.1; → 웹소켓은 HTTP 1.1 이상에서 지원되므로 설정 필수
  • proxy_set_header Upgrade $http_upgrade;
    웹소켓 핸드셰이크(연결 업그레이드) 지원
  • proxy_set_header Connection "Upgrade";
    웹소켓 연결을 유지하도록 설정
  • proxy_set_header Host $host;
    원본 요청의 Host 헤더를 유지
  • proxy_set_header X-Real-IP $remote_addr;
    클라이언트의 실제 IP를 전달
  • proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    프록시를 거치는 모든 IP 정보를 전달
  • proxy_set_header X-Forwarded-Proto $scheme;
    HTTP/HTTPS 스키마 정보를 전달

- API 요청 처리

location /api/
{ proxy_pass http://spring_servers;
  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-Proto $scheme; }


- 설명

  • /api/ 경로로 들어오는 요청을 spring_servers 그룹으로 보냄
  • proxy_set_header 설정을 통해 원본 요청 정보를 유지하면서 전달