[CI/CD] 3. Nginx 설치

bbolddagu·2023년 4월 25일
0

CI/CD 구축

목록 보기
3/3

🔧 Nginx란?

  • Nginx (pronounced "engine-x")는 오픈소스 웹 서버 및 리버스 프록시 소프트웨어입니다. Nginx는 기존의 Apache와 같은 웹 서버와는 다르게 비동기 이벤트 기반 아키텍처를 사용하여 높은 성능을 제공합니다. 이는 대규모 웹 사이트 및 애플리케이션에서 높은 요청 처리율을 달성할 수 있도록 도와줍니다.
  • Nginx는 대부분의 인기있는 운영 체제에서 작동하며, Reverse Proxy, Load Balancer, HTTP Cache, SSL/TLS Termination 등 다양한 기능을 제공합니다. 이러한 기능들은 Nginx를 웹 애플리케이션의 성능 향상과 확장성을 향상시키는 데 사용할 수 있습니다.
  • 또한 Nginx는 Apache와 달리 적은 메모리와 CPU를 사용하여 대규모 트래픽을 처리할 수 있으며, 이를 통해 웹 서버 환경에서의 비용을 절감할 수 있습니다.

📃 용어 정리

  • SSL (Secure Sockets Layer)
    : 웹 브라우저와 웹 서버 사이에서 안전한 통신을 가능하게 해주는 프로토콜입니다. SSL은 인터넷을 통해 전송되는 데이터를 암호화하여 해커가 데이터를 가로채어 읽거나 수정할 수 없도록 보호합니다.

  • TLS (Transport Layer Security)
    : 인터넷 통신에서 보안을 제공하는 프로토콜입니다. TLS는 SSL (Secure Sockets Layer)의 후속 버전으로, SSL 3.0의 취약점을 보완하고 보안 강화를 위한 다양한 기능을 제공합니다.

  • 리버스 프록시 (Reverse Proxy)
    : 클라이언트와 서버 간의 트래픽을 중개하는 서버입니다. 일반적으로, 클라이언트는 리버스 프록시를 통해 서버에 요청을 보내고, 리버스 프록시는 서버로부터 응답을 받아 클라이언트에 전달합니다. 이 과정에서 리버스 프록시는 클라이언트와 서버 사이에서 중개 역할을 수행합니다.


👊 Nginx 설치

1) Docker-compose 설치

sudo curl -L "https://github.com/docker/compose/releases/download/1.28.5/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

# chmod를 통해서 권한 설정
sudo chmod +x /usr/local/bin/docker-compose

# 설치되었는지 확인
docker-compose -v

2) Nginx 설정하기(SSL 인증)

1. docker-compose.yml 작성하기

https를 적용하기 위해서는 nginxcertbot 필요.

📃 Certbot 이란?

Certbot은 Let's Encrypt라는 인증 기관에서 제공하는 SSL 인증서를 무료로 발급받을 수 있도록 도와주는 도구입니다. SSL 인증서를 이용하여 HTTPS 프로토콜을 사용하는 웹사이트의 보안성을 강화할 수 있습니다.
.
Certbot은 Apache, Nginx, Docker 및 다른 서버 소프트웨어와 함께 작동하며, 간단한 명령어를 사용하여 SSL 인증서를 발급하고 자동으로 서버에 적용할 수 있습니다. 또한 인증서의 갱신도 자동으로 처리해 주어, 보안 인증서의 만료일을 계속해서 갱신할 필요가 없습니다.

1-1) 필요한 image pull

docker pull certbot/certbot
docker pull nginx:1.15-alpine

1-2) 프로젝트 최상단으로 이동

1-3) docker-compose.yml 파일 생성

sudo touch docker-compose.yml

# 확인
ls

1-4) docker-compose.yml 파일 편집

sudo vi docker-compose.yml

# INSERT 눌러서 편집 버전으로 변경

# 편집기에서 나가고 싶을 때
# 일단 INSERT 상황에서 나가기 
ESC 버튼 누르기

# 현재 편집 내용 저장 안하고 나가기
:q!
# 변경 사항 저장하고 나가기
:wq

아래 내용 입력

📃 docker-compose.yml

💡 certbot으로 발급 받는 SSL의 경우, 90일마다 만료되기 때문에 자동으로 재발급 받도록 해주어야 합니다. 따라서 entrypoint를 아래처럼 작성하여 자동으로 재발급받도록 합니다. (➡ entrypoint를 지원하지 않는다는 버전 문제 발생. command로 변경하여 실행)

version: '3.2'
services:
  nginx:
    container_name: nginx
    image: nginx:1.15-alpine
    volumes:
      - ./data/nginx:/etc/nginx/conf.d
      - ./data/certbot/conf:/etc/letsencrypt
      - ./data/certbot/www:/var/www/certbot
    ports:
      - "80:80"
      - "443:443"
    command: "/bin/sh -c 'while :; do sleep 6h & wait $${!}; nginx -s reload; done & nginx -g \"daemon off;\"'"
  certbot:
    container_name: certbot
    image: certbot/certbot
    restart: unless-stopped
    volumes:
      - ./data/certbot/conf:/etc/letsencrypt
      - ./data/certbot/www:/var/www/certbot
	entrypoint: ["/bin/sh", "-c", "trap exit TERM; while :; do certbot renew; sleep 12h & wait $$!; done;"]
  • nginx : nginx 웹 서버를 구동하는 서비스입니다. 이 서비스는 nginx:1.15-alpine 이미지를 기반으로 하고 있습니다.
  • container_name : 컨테이너의 이름을 nginx로 지정합니다.
  • volumes : 호스트와 컨테이너 간 데이터를 공유하기 위한 설정입니다. 이 설정에서는 nginx 설정 파일, certbot 설정 파일, certbot 웹 페이지 파일을 컨테이너 내부에 마운트합니다.
  • networks : 서비스가 속한 네트워크를 정의합니다. 이 파일에서는 D106-network이라는 네트워크를 정의하고, nginx 서비스가 이 네트워크에 속하도록 합니다. 또한 ipv4_address를 통해 컨테이너가 할당받을 IPv4 주소를 지정합니다.
  • ports : 호스트와 컨테이너 간의 포트 포워딩을 설정합니다. 이 설정에서는 호스트의 80번 포트와 443번 포트를 nginx 컨테이너의 80번 포트와 443번 포트로 연결합니다.
  • command : 컨테이너가 실행될 때 수행할 명령어를 정의합니다. 이 설정에서는 nginx 서버를 백그라운드 모드로 실행하고, 6시간마다 nginx 서버를 다시 로드(reload)합니다.
  • certbot : SSL 인증서를 발급받기 위한 certbot 서비스입니다. 이 서비스는 certbot/certbot 이미지를 기반으로 하고 있습니다.
    container_name : 컨테이너의 이름을 certbot으로 지정합니다.
  • volumes : 호스트와 컨테이너 간 데이터를 공유하기 위한 설정입니다. 이 설정에서는 certbot 설정 파일과 certbot 웹 페이지 파일을 컨테이너 내부에 마운트합니다.
  • restart : 컨테이너가 종료되었을 때 다시 시작하는 정책을 정의합니다. 이 설정에서는 unless-stopped를 지정하여, 컨테이너를 명시적으로 정지하지 않는 한, 컨테이너가 다시 시작되도록 합니다.
  • entrypoint : entrypoint는 certbot 서비스를 시작할 때 실행될 명령어를 정의하는 부분입니다.
    해당 명령어는 /bin/sh 셸을 실행하고, 셸 안에서 trap exit TERM; 명령어를 실행합니다. 이 명령어는 TERM 시그널을 받으면 셸에서 실행 중인 프로세스를 종료하도록 합니다.
    그 후, while :; do certbot renew; sleep 12h & wait $${!}; done; 명령어를 실행합니다. 이 명령어는 certbot을 계속해서 실행하며, 인증서 갱신이 필요한 경우에만 인증서를 갱신합니다. sleep 12h & wait $${!} 명령어는 12시간마다 certbot을 실행하도록 하며, 이 명령어에서 $${!}는 셸에서 실행 중인 마지막 백그라운드 프로세스의 PID를 참조합니다.

1-5) docker-compose 파일 실행 여기서 실행하지 말기

sudo docker-compose up -d

# 컨테이너가 잘 만들어졌는지 확인
docker ps
  • up 명령은 docker-compose.yml 파일에서 정의한 모든 서비스를 시작
  • -d 플래그는 컨테이너를 백그라운드에서 실행합니다.

2. data/nginx 경로에 app.conf 파일 작성하기

2-1) /etc/nginx/conf.d 생성하기

cd nginx
sudo mkdir nginx
cd nginx
sudo touch conf.d

2-2) app.conf 파일 편집

  • {host_name}: 서버 이름 or 도메인 이름으로 변경 필요
sudo vi conf.d

📃 app.conf

server {
  listen 80;
  server_name {host_name};
  server_tokens off;
  client_max_body_size 1G; # media type 파일 용량 설정
  
  location /.well-known/acme-challenge/ {
  root /var/www/certbot;
  }
  
  location / {
  return 301 https://$host$request_uri;
  }
}

server {
  listen 443 ssl;
  server_name {host_name};
  server_tokens off;
  client_max_body_size 1G;
  
  ssl_certificate /etc/letsencrypt/live/{host_name}/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/{host_name}/privkey.pem;
  include /etc/letsencrypt/options-ssl-nginx.conf;
  ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
  
  location /api {
  proxy_pass http://{host_name}:8000/api;
  proxy_set_header Host $http_host;
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  }
 
}

3. init-letsencrypt.sh 파일 작성 및 실행하기

  • init-letsencrypt.sh 파일: Let's Encrypt 인증서를 발급받기 위해 사용하는 스크립트 파일

3-1) init-letsencrypt.sh 코드 가져오기

sudo curl -L https://raw.githubusercontent.com/wmnnd/nginx-certbot/master/init-letsencrypt.sh > init-letsencrypt.sh

✋ Permission denied 발생 시

  • 원인 : 해당 디렉토리에 파일을 쓰기 권한이 없어서 발생할 수 있습니다.
  • 해결
  1. 현재 작업 중인 디렉토리 권한 확인
    	ls -ld .
  2. 만약 권한이 다음과 같이 설정되어 있다면
    drwx------  2 user user  4096 Apr 26 10:56 .
    ➡ 현재 사용자(user)에게만 쓰기 권한이 있어서 다른 사용자나 그룹에는 쓰기 권한이 없습니다.
  3. 다음과 같이 권한을 변경
    sudo chmod o+w .

3-2) init-letsencrypt.sh 파일 편집

  • domain명과 email을 본인에게 맞게 수정

3-3) init-letsencrypt.sh 파일 권한 설정

# 권한 설정
chmod +x init-letsencrypt.sh

# 실행
sudo ./init-letsencrypt.sh

3-4) nginx 실행하기

docker-compose up -d

0개의 댓글