[ 목적 ]
토이 프로젝트에서 nginx를 사용할 일이 있어서 좀 더 딥하게 이해하기 위해 이 글을 작성한다.
[ nginx란? ]
nginx는 웹 서버이다.

위 사진 처럼 여러 서버로 로드밸런싱을 할 수 있는 리버스 프록시 서버 역할을 수행한다.
우리 역시 위 사진 처럼 nginx를 사용하고 있고, 지금은 단일 서버로 구성해놓았지만, 여러 서버로 컨테이너를 늘리면 nginx가 컨테이너별로 로드밸런싱을 해 줄 수 있다.
[ nginx의 동작 방식 ]
nginx는 비동기 이벤트 기반( event driven )아키텍처로 요청을 처리한다.

nginx는 하나의 고정된 마스터 프로세스와 워커 프로세스를 만들어서 사용하기 때문에 요청이 들어오더라도 새로운 프로세스, 쓰레드를 만들지 않는다. 또한 비동기 방식을 concurrency하게 요청을 처리할 수 있다.
그렇기 때문에 경량, 효율적으로 많은 요청을 처리할 수 있다.
[ nginx 구조 ]
nginx는 master process와 worker process로 이루어져 있다.
master process는 nginx 서비스가 시작될 때 시작되는 첫번째 root 프로세스이다.
conf파일을 읽고 worker process를 만들고 제어한다. nginx 시스템 환경을 관리하는 프로세스라 생각하자
worker process : 클라이언트의 요청을 처리하고 웹 컨텐츠를 제공하며, 마스터 프로세스에 의해 생성된다. 사용자의 request에 따른 모든 작업을 담당한다 ( disk i/o, network i/o 등 )
non-blocking 방식으로 요청을 처리하기 때문에 컨텍스트 스위칭을 최소화하며 빠른 속도를 제공한다. 프로세스 단위이기 때문에 하나의 워커 프로세스가 죽더라도 다른 프로세스에는 영향을 미치지 않는다.
워커 프로세스는 다음과 같이 구성되어 있다.

메인 쓰레드가 이벤트 queue에 이벤트를 넣고 워커 쓰레드가 작업을 처리하고 응답하는 방식으로 되어 있다.
만약 요청을 처리하지 못하는 경우에는 워커 프로세스와 쓰레드 풀을 늘려야한다. 설정은 nginx.conf 파일을 수정해야한다.
워커 프로세스 개수 : worker_processes 3;
쓰레드 풀 : worker_threads 10;
추가적인 설정은 공식 문서를 참조하자. 워커 프로세스의 개수는 cpu의 개수와 동일하게 맞추는 것으로 권장되어 있다.
[ 젠킨스와 docker blue-green 배포 방식의 cicd 구축 ]
세부 깃허브 설정이나 젠킨스 설치는 생략한다.
[ 용어 ]
이벤트 기반 아키텍처 : 이벤트를 감지되면 상태가 변경되는 아키텍처. nginx에서는 http, tcp 커넥션 등을 이벤트라고 본다.
1. 먼저 nginx를 설치해야한다.
apt-get install -y nginx && sudo service nginx start && sudo service nginx status
2. nginx.conf 파일을 2개 작성한다.
nginx.green.conf, nginx.green.conf
컨테이너를 2개 사용해야하므로 외부에서 컨테이너로 접근하는 포트 2개를 사용해야한다.
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
server {
listen 80;
server_name ${ip 주소 혹은 도메인};
location / {
proxy_pass ${ip 주소 혹은 도메인};
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
}
green과 blue 포트 4000, 4001 또는 8000, 8001 등 맘에 드는 포트번호 2개를 각가 넣는다.
3. 배포 스크립트 작성
#!/bin/bash
EXIST_BLUE=$(docker-compose -p ${컨테이너 이름}-blue -f docker-compose.blue.yaml ps | grep Up)
if [ -z "$EXIST_BLUE" ]; then
echo "blue up"
docker-compose -p ${컨테이너 이름}-blue -f docker-compose.blue.yaml up -d
BEFORE_COMPOSE_COLOR="green"
AFTER_COMPOSE_COLOR="blue"
else
echo "green up"
docker-compose -p you_and_me_api-green -f docker-compose.green.yaml up -d
BEFORE_COMPOSE_COLOR="blue"
AFTER_COMPOSE_COLOR="green"
fi
sleep 10
EXIST_AFTER=$(docker-compose -p ${컨테이너 이름}-${AFTER_COMPOSE_COLOR} -f docker-compose.${AFTER_COMPOSE_COLOR}.yaml ps | grep Up)
if [ -n "$EXIST_AFTER" ]; then
cp ./nginx/default.${AFTER_COMPOSE_COLOR}.conf /etc/nginx/nginx.conf
nginx -s reload
docker-compose -p ${컨테이너 이름}-${BEFORE_COMPOSE_COLOR} -f docker-compose.${BEFORE_COMPOSE_COLOR}.yaml down
echo "$BEFORE_COMPOSE_COLOR down"
fi
4. 젠킨스 빌드 후 스크립트 실행 등
- 라이언 이모티콘 안에 스크립트를 작성한 노드를 넣는다.

5. 빌드 후 정상적으로 컨테이너가 올라왔는지 확인한다.
'네트워크' 카테고리의 다른 글
postgresql 로그인 실패 횟수에 따른 접속 제한 설정 (0) | 2023.08.10 |
---|---|
소켓과 HTTP (0) | 2023.02.22 |
~.ssh 폴더 및 ssh 접속 원리 (0) | 2023.01.07 |
path vector, distance vector, link state (0) | 2022.12.28 |
dhcp 동작과정 - 요약 (0) | 2022.12.27 |