olrlobt
[INFRA] Docker에서 Nginx 컨테이너 실행과 https 설정하기 본문
지난번 포스팅에서 EC2에 Nginx를 직접 설치하고, https 설정까지 마쳤다.
이번에는 Docker를 이용하여 Nginx를 컨테이너로 실행하고 https를 적용하는 방법까지 알아보자.
Nginx
Nginx는 가볍고, 고성능의 HTTP 웹 서버, 리버스 프록시, 이메일 프록시(POP3/IMAP), TCP/UDP 프록시 서버로 사용된다.
Nginx를 Docker 컨테이너로 실행하는 것과 Amazon Ec2 인스턴스에서 직접 설치하는 것은 각각의 장단점이 있어서 상황에 따라 선택하면 된다.
EC2에 직접 설치
장점 :
- Docker, docker-compose에 관한 지식이 없어도 된다.
- 단순하며, 직접 제어가 가능하다.
- 가상화 오버헤드 없이 직접 실행되기 때문에 최적의 성능을 제공할 수 있다.
Docker 컨테이너로 실행
장점 :
- Docker의 중요 특징 중 하나인, 어느 환경에서나 동일하게 실행된다.
- 컨테이너로 실행되기 때문에 가볍고 빠르다.
- 격리된 컨테이너에서 실행되기 때문에, 응용 프로그램 사이의 충돌을 방지하고 보안을 강화할 수 있다.
Docker에서 Nginx 컨테이너 실행하기
Docker 설치와 Docker-compose 설치는 아래 링크를 참조하자.
2024.02.21 - [Infra] - [INFRA] Docker와 Dockerfile, Docker-compose 구성하기
Docker가 설치되어 있다면 아래 명령어로 간단하게 Nginx 이미지를 Docker hub에서 pull 하고, 실행할 수 있다.
하지만, 이 방법은 사용하지 않는다. 그냥 이렇구나 하고 다음 챕터로 넘어가자.
$ docker run --name nginx -d -p 80:80 nginx #이 부분은 건너 뛰고 아래로 넘어가자
아무 설정을 하지 않고 도메인에 접속하게 되면, 아래와 같이 Nginx의 Welcome 페이지를 볼 수 있다.
하지만, 이렇게 실행하게 되면 Nginx 설정에 접근하기 위하여 컨테이너에 접속해야 하는 번거로움이 생긴다.
따라서 Docker 컨테이너에 볼륨을 설정하여 EC2 인스턴스의 폴더와 Nginx 컨테이너 간 데이터를 공유하게 해 주자. 이렇게 설정하면 Nginx 설정이 바뀌더라도 컨테이너에 직접 접속하지 않고 쉽게 설정을 변경할 수 있다.
컨테이너 볼륨 설정을 컨테이너 run 명령어에서 처리할 수도 있지만, 볼륨 개수가 늘어나면 한 명령어에 3줄씩 차지하는 현상이 발생한다. 따라서 Docker-compose를 이용하여 쉽게 관리하자.
docker-compose.yml 작성
version: '3'
services:
nginx:
image: nginx:latest
container_name: nginx
ports:
- "80:80"
- "443:443"
volumes:
- ./data/nginx:/etc/nginx/conf.d
- ./data/certbot/conf:/etc/letsencrypt
- ./data/certbot/www:/var/www/certbot
depends_on:
- certbot
certbot:
image: certbot/certbot
volumes:
- ./data/certbot/conf:/etc/letsencrypt
- ./data/certbot/www:/var/www/certbot
여기서 version은 docker compose의 버전을 나타낸다. 그리고 nginx, certbot를 컨테이너로 올리고 있으며, volumes를 통해 EC2의 설정 파일들을 nginx 내부와 연동시킨다. 예를 들어, "./data/nginx:/etc/nginx/conf.d"로 볼륨이 설정되면, "./data/nginx" 폴더 안에 파일들이 nginx 컨테이너 내부의 "/etc/nginx/conf.d"로 복사된다고 이해하면 편할 것이다.
위와 같이 docker compose 작성이 끝났다면,
먼저 여러 설정 파일을 관리할 폴더를 생성한다.
$ mkdir -p /home/ubuntu/data/
docker-compose.yml 파일을 작성하여 EC2 안으로 옮긴다.
scp -i {pem key} {복사할 파일} {호스트}@{도메인}:{복사할 위치}/{이름}
scp -i .\readme-blog-key.pem .\docker-compose.yml ubuntu@ec2:/home/ubuntu/data/docker-compose.yml
SSL/TLS 인증서 설치
그다음, EC2에 접속하여 볼륨 설정을 해 둔 nginx 설정파일 경로에 conf 파일을 작성한다.
server {
listen 80;
server_name blogwidget.com; #여기에는 본인의 도메인이 들어간다.
server_tokens off;
location /.well-known/acme-challenge/ {
root /var/www/certbot;
}
location / {
return 301 https://$host$request_uri;
}
}
이제 docker-compose up 명령어로 도커 컴포즈를 실행시키자.
이때, -d 옵션을 붙여 백그라운드로 실행되게 한다.
$ docker-compose up -d
$ docker ps
그런 다음에는 docker ps 명령어로 nginx 컨테이너나 certbot 컨테이너가 죽지 않았는지 확인해 주자.
만약 설정이 잘못되었다면 컨테이너가 실행되지 않은 것이 확인될 것이다.
잘 실행되었다면, certbot을 이용하여 도메인에 대한 SSL/TLS 인증서를 생성해야 한다.
아래 명령어를 입력하여, certbot 인증서를 설치한다.
$ docker-compose run --rm certbot certonly --webroot --webroot-path=/var/www/certbot -d your_domain.com -d www.your_domain.com
--webroot : 방식을 이용하여 웹 서버의 루트 디렉터리에 특정 파일을 생성하도록 하여 도메인 소유권을 증명한다.
--webroot-path=/var/www/certbot : 인증 과정에서 생성되는 파일을 저장할 경로이다.
여기서, yourdomain에는 도메인 명이 들어가야 하며, EC2 서버에서 발급받은 기본 도메인으로는 진행할 수 없다. 만약 진행하게 된다면 아래와 같이 더 진행할 수 없을 것이다.
따라서, 만약 도메인이 없다면 아래 포스팅을 참고하여 도메인을 구매하고 설정하자. 500원이면 구매 가능한 도메인도 많다.
도메인 구매 관련 포스팅 추가 예정입니다! 잠시만 기다려 주세요!
위와 같이 SSL/TLS 인증서 설치가 제대로 마쳤다면, 다시 Nginx conf 설정에 Https 리버스 프록시 설정을 해 준다.
server {
listen 80;
server_name blogwidget.com;
server_tokens off;
location /.well-known/acme-challenge/ {
root /var/www/certbot;
}
location / {
return 301 https://$host$request_uri;
}
}
server {
listen 443 ssl;
server_name blogwidget.com;
server_tokens off;
ssl_certificate /etc/letsencrypt/live/blogwidget.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/blogwidget.com/privkey.pem;
location / {
proxy_pass http://blogwidget.com:8080;
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;
}
}
설정을 잘 마쳤다면, nginx 컨테이너를 재 실행해 설정을 적용해 준다.
$ docker restart nginx
HTTPS 설정 완료
도메인에 접속하면 정상적으로 https접근이 가능해졌다.
'Infra' 카테고리의 다른 글
[INFRA] Jenkins 설치하기 (0) | 2024.03.30 |
---|---|
[INFRA] AWS EC2 프리티어 인스턴스 생성하기 (2) | 2024.03.25 |
[INFRA] Docker와 Dockerfile, Docker-compose 구성하기 (1) | 2024.02.21 |
[INFRA] Nginx를 사용하여 HTTPS 요청 처리하기 (3) | 2024.02.20 |
[INFRA] EC2 서버 기본 설정과, SWAP메모리 할당하기 (1) | 2024.02.19 |