Nginx로 NodeJS 컨테이너 확장 및 로드 밸런싱

따라서 NodeJS 애플리케이션은 많은 양의 요청을 받고 있으며 단일 서버가 처리하기에는 너무 많아졌습니다. 이제 여러분을 도와줄 멋진 AWS 관리형 서비스가 없습니다. 해결책은 수동으로 서버를 수평으로 확장하는 것입니다. 수평 확장은 더 많은 로드를 처리하기 위해 단일 서버의 CPU/메모리 조합을 늘리는 것과는 반대로 복제 서버를 프로비저닝합니다.

운 좋게도 Nginx를 사용한 Docker 및 Docker-compose는 작업을 쉽게 완료할 수 있습니다.
Docker는 서버를 원하는 수만큼 쉽게 확장할 수 있습니다. Docker-compose를 사용하면 항상 많은 명령docker을 입력할 필요가 없으므로 작업이 더욱 쉬워집니다.

좋습니다. Docker를 사용하여 서버를 3개로 복제했다고 가정해 보겠습니다. 즉, NodeJS 애플리케이션이 이제 3개의 복제 컨테이너에서 실행되고 있습니다. 문제는 각 서버가 언제 요청을 처리해야 하는지 어떻게 알 수 있는가 하는 것입니다. Nginx가 들어옵니다.

Nginx: The software load balancer, reverse proxy, web server, & content cache with the enterprise features and support you expect.



Nginx의 핵심은 웹 서버입니다.
3개의 컨테이너가 실행 중이고 그 중 하나가 언제 발생하여 요청을 처리해야 하는지 알지 못하는 동안 Nginx는 로드 밸런싱 기능으로 이러한 상황을 도울 수 있습니다.

Load balancing refers to efficiently distributing incoming network traffic across a group of backend servers, also known as a server farm or server pool. - Nginx



이 경우 Nginx는 클라이언트 요청과 3개의 서버 사이에 있는 프록시 서버 역할을 합니다.

© 피닉스냅

새로운 요청이 들어오면 Nginx는 이를 수락하고 서버 중 하나로 라우팅합니다. 시간당 트래픽을 라우팅할 서버를 알려주는 데 사용하는 3개의 알고리즘이 있습니다. 이러한 알고리즘의 기본값은 라운드 로빈입니다.

라운드 로빈:
첫 번째 요청은 server1에, 두 번째는 server2에, 세 번째는 server3에 요청한 다음 반복합니다.

NodeJS 서버가 포트 3000에서 수신 중이라고 가정하면 간단한 docker-compose 스크립트는 다음과 같습니다.

version: '3.9'

services:
  nodeapp:
    build: .
    ports:
      - "3000"

  nginx:
    image: nginx:latest
    ports:
      - "4000:80"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf


docker-compose.yml

작성 스크립트는 Dockerfile에서 NodeJS 앱을 빌드하고 Docker 공용 레지스트리에서 Nginx 서버를 가져옵니다. nodeapp 서비스는 지정된 시간에 단일 시스템만 호스트 포트에 매핑할 수 있기 때문에 특정 호스트 포트에 매핑되지 않습니다. 그러나 nginx 서버는 호스트의 4000에 매핑된 포트 80에서 요청을 받습니다.

또한 nginx에 구성 파일을 작성하여 빌드할 수 있도록 volumes 지시어를 추가했습니다. 이 구성은 이 설정의 핵심입니다.

events {
  worker_connections  4096;
}

http {
    server {
        listen 80;
        location / {
            proxy_pass http://nodeapp:3000;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
    }
}


nginx.conf

Nginx는 포트 /에서 80(홈 경로)를 수신한 다음 nodeapp 지시문을 사용하여 포트 3000에서 proxy_pass로 트래픽을 라우팅합니다.

Dockerfile 및 간단한 Express 앱을 포함한 전체 스크립트는 내 Github에서 사용할 수 있습니다https://github.com/zeelz/zeelz-developer/tree/nodejs-docker-compose-nginx.

좋은 웹페이지 즐겨찾기