- 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)
: 클라이언트와 서버 간의 트래픽을 중개하는 서버입니다. 일반적으로, 클라이언트는 리버스 프록시를 통해 서버에 요청을 보내고, 리버스 프록시는 서버로부터 응답을 받아 클라이언트에 전달합니다. 이 과정에서 리버스 프록시는 클라이언트와 서버 사이에서 중개 역할을 수행합니다.
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
https를 적용하기 위해서는 nginx와 certbot 필요.
📃 Certbot 이란?
Certbot은 Let's Encrypt라는 인증 기관에서 제공하는 SSL 인증서를 무료로 발급받을 수 있도록 도와주는 도구입니다. SSL 인증서를 이용하여 HTTPS 프로토콜을 사용하는 웹사이트의 보안성을 강화할 수 있습니다.
.
Certbot은 Apache, Nginx, Docker 및 다른 서버 소프트웨어와 함께 작동하며, 간단한 명령어를 사용하여 SSL 인증서를 발급하고 자동으로 서버에 적용할 수 있습니다. 또한 인증서의 갱신도 자동으로 처리해 주어, 보안 인증서의 만료일을 계속해서 갱신할 필요가 없습니다.
docker pull certbot/certbot
docker pull nginx:1.15-alpine
sudo touch docker-compose.yml
# 확인
ls
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;"]
trap exit TERM;
명령어를 실행합니다. 이 명령어는 TERM 시그널을 받으면 셸에서 실행 중인 프로세스를 종료하도록 합니다.while :; do certbot renew; sleep 12h & wait $${!}; done;
명령어를 실행합니다. 이 명령어는 certbot을 계속해서 실행하며, 인증서 갱신이 필요한 경우에만 인증서를 갱신합니다. sleep 12h & wait $${!}
명령어는 12시간마다 certbot을 실행하도록 하며, 이 명령어에서 $${!}는 셸에서 실행 중인 마지막 백그라운드 프로세스의 PID를 참조합니다.sudo docker-compose up -d
# 컨테이너가 잘 만들어졌는지 확인
docker ps
/etc/nginx/conf.d
생성하기cd nginx
sudo mkdir nginx
cd nginx
sudo touch conf.d
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;
}
}
sudo curl -L https://raw.githubusercontent.com/wmnnd/nginx-certbot/master/init-letsencrypt.sh > init-letsencrypt.sh
✋ Permission denied 발생 시
ls -ld .
drwx------ 2 user user 4096 Apr 26 10:56 .
➡ 현재 사용자(user)에게만 쓰기 권한이 있어서 다른 사용자나 그룹에는 쓰기 권한이 없습니다.sudo chmod o+w .
# 권한 설정
chmod +x init-letsencrypt.sh
# 실행
sudo ./init-letsencrypt.sh
docker-compose up -d