# 업데이트
sudo apt-get update -y
# HTTP 패키지 설치
sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
gnupg-agent \
software-properties-common -y
# gpg 키 및 저장소 추가
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository --yes \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"
# Docker 엔진 설치
sudo apt-get install docker-ce docker-ce-cli containerd.io -y
# Docker sudo 권한 부여
sudo groupadd docker
sudo gpasswd -a $USER docker
# Docker 재시작
sudo service docker restart
# root 사용자로 변경
sudo su -
# 사용자로 변경
su - ubuntu
# Docker 버전 확인
docker -v
# Docker-Compose 설치
sudo curl -L https://github.com/docker/compose/releases/download/v2.5.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
# Docker-Compose 버전 확인
docker-compose -v
위 명령어를 사용하지 않고 도커를 다른 방식으로 깔았다가 https를 발급 받기 위한 패키지가 깔리지 않는 오류가 발생했다.
그리고 도커에 sudo 권한을 주고 사용자에서 sudo 명령어 없이 사용하기 위해서 도커를 재시작하고 재로그인을 하는 과정이 필요하다.
# Docker에서 nginx를 가져옴
docker pull nginx
# HTTP(80)로 들어오면 HTTPS(443)로 redirect
sudo docker run --name nginx -d -p 80:80 -p 443:443 nginx
# nginx 내부로 진입
sudo docker exec -it nginx /bin/bash
# Let’s Encrypt 클라이언트 설치
apt-get update
apt-get install vim
apt-get install certbot
apt-get install python3-certbot-nginx
# 여기에 도메인 파일 domain-name.conf를 정의
cd etc/nginx/conf.d
기본적인 패키지를 다운로드하고 nginx ssl 설정을 위해 /etc/nginx/conf.d 디렉토리로 이동한다.
domain‑name.conf 라는 파일을 만들고 아래의 내용을 작성한다.
https 인증서 발급을 위해 도메인에 대한 내용을 정의하는 거라고 보면 된다.
# 오류가 발생한 코드
server {
listen 80 default_server;
listen [::]:80 default_server;
root /var/www/html;
server_name example.com www.example.com; # 자신의 도메인
}
# 오류가 발생해서 위 내용에서 아래와 같이 수정했다.
server {
server_name example.com www.example.com; # 자신의 도메인
}
해당 내용은 example.com
, www.example.com
두 개의 host를 적용한 것이다.
sever_name 뒤에는 인증서 받을 도메인을 작성하면 된다.
나는 여러 개의 server{}를 정의하니 80포트에 여러 서버가 listen해서 오류가 발생했다.
아래 내용처럼 server_name만 정의했다.
exit
docker restart nginx
재시작된 nginx 컨테이너로 다시 접속해서 인증서를 발급받으면 된다.
certbot --nginx -d example.com -d www.example.com
활성화된 도메인만 발급 받을 수 있다.
성공하면 메세지가 출력되고 domain‑name.conf 파일에 자동으로 관련 설정이 업데이트된다.
사용해 본 결과 한 번에 최대 2개의 인증서를 받을 수 있다.
server {
server_name www.example.com example.com;
location / {
proxy_pass http://172.17.0.1:8080;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_buffer_size 128k;
proxy_buffers 4 256k;
proxy_busy_buffers_size 256k;
}
# 다른 코드 생략
}
이전에 만들었던 domain-name.conf에 이런 코드를 추가하면 된다.
간단하게 설명하면 172.17.0.1:8080는 Spring 서버:포트번호를 설정, proxy_pass는 Nginx 서버가 Spring 서버로 redirect 하기 위해 적용한 것이다.
위 내용을 작성한 뒤 nginx 컨테이너를 재실행하면 적용된다.
# 시간대를 한국으로 설정
apt-get install tzdata
dpkg-reconfigure tzdata # Asia-Seoul로 설정
date # 로컬 시간 조회
# crontab 설치
sudo apt install cron -y
# crontab 파일 열기
crontab -e
# 해당 명령어를 추가하고 저장
0 12 * * * /usr/bin/certbot renew --quiet
처음 인증서를 발급하면 60일 뒤에 만료된다.
위 명령어를 적용하면 자동으로 갱신된다.
certbot 매일 실행할 명령어를 추가한다.
이 명령문은 매일 정오에 명령을 실행
(서버의 인증서가 다음 30일 이내에 만료되는지 확인하고 만료되면 갱신, --quiet은 certbot이 출력을 생성하지 않게한다.)