티스토리 뷰

0. Express.js

: Node.js 위에서 실행되는 웹 애플리케이션 프레임워크

  • 특징
    1) 간단한 API를 제공
    2) 미들웨어 제공
    3) 쉬운 라우팅(HTTP 요청에 대한 경로와 처리를 쉽게 설정)
    4) 다양한 플러그인을 지원

0.1 Express.js 설치

: node.js 기반 프레임 워크이기 때문에 공식 사이트에서 설치

  1. Express 설치
cd 폴더명
npm init -y
npm install express

0.2  실행

: index.js 파일 생성

const express = require("express");

const app = express();

app.get("/", (req, res) => {
  res.send("I am a endpoint");
});

app.listen(7777, () => {
  console.log("listening on port 7777");
});

 


-> packge.json에서 npm run start 시, index.js파일을 실행하도록 함

-> 그냥 설정 없이 node index.js해도 됨 ㅎ.!


1. Express.js 서버 Docker 구동

1.1 작업 중인 디렉토리에 Dokerfile 생성 및 build

# node 버전 명시
FROM node:16

# 작업 디렉토리 지정 및 생성
WORKDIR /usr/src/app

#  의존성 설치
COPY package*.json ./

# node의 종속성 다운로드
RUN npm install

# 웹 리소스 추가
COPY . .

# 웹이 바인딩 된 포트 번호 명시 -> doker demon에 매핑핑
EXPOSE 7777
CMD [ "npm", "run", "start" ]
docker build . -t myserver

으로 빌드(Doker Image 생성)


1.2 Docker Container 구동

- 1.1에서 생성된 이미지를 바탕으로 Container 구동

// 총 4개의 서버를 띄움
// docker run -p <외부포트>:<컨테이너포트> -d <이미지명>

docker run -p 1111:7777 -d myserver
docker run -p 2222:7777 -d myserver
docker run -p 3333:7777 -d myserver
docker run -p 4444:7777 -d myserver
  1. -p
    : 이 옵션은 포트 포워딩을 설정
    : 외부에서 접근할 수 있는 호스트 포트(외부포트)를 지정
    : Docker 컨테이너 내에서 실행되는 애플리케이션의 컨테이너 포트에 매핑

  2. <외부포트>:<컨테이너포트>
    : <외부포트>: 호스트 시스템에서 외부에 노출될 포트 -> 클라이언트가 해당 포트로 요청
    : <컨테이너포트>: 컨테이너 내에서 실행 중인 애플리케이션의 포트 -> EXPOSE로 설정된 것

  3. -d
    : 백그라운드 모드에서 컨테이너 실행

  4. <이미지명>
    : Dokerfile에서 빌드한 이미지의 이름

1.3 Load Balancer (Reverse Proxy) 설정

: nginx.conf 내 Load Balancer (Reverse Proxy) 설정 추가

upstream backendserver {
		server 127.0.0.1:1111;
		server 127.0.0.1:2222;
		server 127.0.0.1:3333;
		server 127.0.0.1:4444 weight=3; // 특정 인스턴스에 가중치를 둘 수 있다.
}
  • upstream context
    - 백엔드의 서버를 그룹화(그룹 명을 명시 => /backendserver)
    - 요청을 로드 밸런싱 하는 역할
    - nginx는 4개의 서버중 하나로 클라이언트의 요청을 분배
server {
		listen 8080;
		location / {
        		proxy_pass http://backendserver/;
		}
}
  • server context
    - location + 포트번호 8080을 통해 접속 시, 
    - proxy_pass를 통해 reverse proxy 역할 명시
    - http://backendserver/로 전달
    ==> 지정된 백엔드 서버 그룹으로 역할을 명시하여 전달하여 로드밸런싱을 맞출 수 있음

이전 예제와 달리 지금은 Doker Container에서 구동되는 것을 받아 동작함을 다시 확인 할 수 있음


1.6 주의점

: Nginx 웹 서버를 통한 커스텀 로드밸런서 생성 시 worker_connections 유의

  • 문제) 병목 현상 발생 가능
  • 해결) Nginx 는 요청 트래픽을 FD(파일 디스크립터) I/O 형태로 처리 -> FD를 늘려서 해결
    : Nginx 의 처리가능한 FD = 프로세스 수 + 프로세스 당 처리 가능 FD + 총 처리 가능 FD 수
    • worker_processes : Nginx 가 운용하는 프로세스 수 < 서버 CPU 의 Core 수
    • worker_rlimit_nofile : 프로세스 당 처리 가능 FD
    • worker_connections : Nginx 가 열 수 있는 총 처리 가능 FD 수

읽어보기....

nginx유의점 10가지

nginx 유의점(병목현상)

부하 테스트 및 성능 개선

 


1.5 X-Forwarded-For Header를 통한 IP확인

: 클라이언트의 원본 IP 주소 + 홉핑한 모든 프록시 서버들의 IP 주소 포함 가능

-  헤더의 내용은 아래와 같이 구성

X-Forwarded-For: <client_ip>, <proxy1_ip>, <proxy2_ip>, ..., <proxyN_ip>

 

  • <client_ip>: 원 클라이언트의 IP 주소
  • <proxy1_ip>, <proxy2_ip>, ..., <proxyN_ip>: 홉핑된 프록시 서버 IP 주소

 

- proxy_pass 사용 시, proxy_set_header를 통해 지정 가능

location / {
    proxy_pass         http://backendserver/;
    proxy_redirect     off;
    proxy_set_header   Host $host; //클라이언트 요청한 호스트의 이름(최종 도착)
    proxy_set_header   X-Real-IP $remote_addr; //원 요청 클라이언트 IP(최초 출발)
    proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for; // 홉핑한 곳들의 IP
}

 

 

 

참조

ASAC 수업 자료

전체 진행 영상

dokerfile 설명 및 기본 설정

 

 

 

'정리용 > nginx' 카테고리의 다른 글

[Nginx] nginx 조작-2  (1) 2024.12.22
[Nginx] nginx 조작-1  (0) 2024.12.21
[Nginx] nginx 설치 및 실행  (0) 2024.12.21
[Nginx] nginx는 무엇인가?  (0) 2024.12.21
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/04   »
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
글 보관함