티스토리 뷰
0. Express.js
: Node.js 위에서 실행되는 웹 애플리케이션 프레임워크
- 특징
1) 간단한 API를 제공
2) 미들웨어 제공
3) 쉬운 라우팅(HTTP 요청에 대한 경로와 처리를 쉽게 설정)
4) 다양한 플러그인을 지원
0.1 Express.js 설치
: node.js 기반 프레임 워크이기 때문에 공식 사이트에서 설치
- 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
- -p
: 이 옵션은 포트 포워딩을 설정
: 외부에서 접근할 수 있는 호스트 포트(외부포트)를 지정
: Docker 컨테이너 내에서 실행되는 애플리케이션의 컨테이너 포트에 매핑 - <외부포트>:<컨테이너포트>
: <외부포트>: 호스트 시스템에서 외부에 노출될 포트 -> 클라이언트가 해당 포트로 요청
: <컨테이너포트>: 컨테이너 내에서 실행 중인 애플리케이션의 포트 -> EXPOSE로 설정된 것 - -d
: 백그라운드 모드에서 컨테이너 실행 - <이미지명>
: 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 수
읽어보기....
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 수업 자료
'정리용 > 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
링크
TAG
- useReducer
- ASAC
- asac#asac7기
- useMemo
- ssh
- useContext
- useEffect
- useCallback
- asac7
- useRef
- asac7기
- memo
- acac
- Nginx
- git
- react
- asac7#asac
- acas#acas7기
- useLayoutEffect
- useState
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함