클라우드 환경에서 Rocky Linux 서버 인스턴스 생성 후, nginx 설치 및 Let’s Encrypt 설정하는 방법에 대해서 알아보도록 하겠습니다.
아래 그림과 같이 하나의 서버에서 여러 웹 서버를 운영하면서 nginx를 사용해서 호스트에 따라 적절한 포트로 라우팅하도록 설정하는 방법에 대해서 알아보겠습니다.
nginx 설치
시스템 업데이트
서버 접속 후 Rocky Linux 최소 보안 업데이트를 진행합니다.
sudo dnf -y upgrade-minimal
nginx 저장소 추가
Rocky Linux의 기본 패키지 저장소에도 nginx가 있지만, 최신 버전을 설치하려면 EPEL(Extra Packages for Enterprise Linux) 저장소를 사용하는 것이 좋습니다.
sudo dnf install epel-release -y
nginx 설치
EPEL 저장소를 추가한 후, 다음 명령어를 사용해 nginx를 설치합니다.
sudo dnf install nginx -y
nginx 서비스 시작 및 부팅 시 자동 시작 설정
nginx를 설치한 후에는 서비스를 시작하고, 부팅 시 자동으로 시작되도록 설정합니다.
# nginx 서비스 시작
sudo systemctl start nginx
# 부팅 시 자동 시작 설정
sudo systemctl enable nginx
방화벽 설정
nginx가 외부에서 접근할 수 있도록 방화벽 설정을 추가해야 합니다. HTTP와 HTTPS 트래픽을 허용합니다.
# HTTP(80번 포트) 허용
sudo firewall-cmd --permanent --add-service=http
# HTTPS(443번 포트) 허용
sudo firewall-cmd --permanent --add-service=https
# 방화벽 재로드
sudo firewall-cmd --reload
설치 확인
nginx가 제대로 설치 되었는지 확인하려면 웹 브라우저에서 Rocky Linux 서버의 IP 주소로 접속해 봅니다. 아래 명령어로 서버 IP 주소를 확인할 수 있습니다.
hostname -I
웹 브라우저에서 http://서버_IP주소
로 접속했을 때 nginx 테스트 페이지가 보이면 정상적으로 nignx가 설치된것입니다.
Let’s Encrypt 설정
certbot 설치
certbot을 설치하기 위해서는 EPEL(Extra Packages for Enterprise Linux) 저장소를 사용하도록 해야 합니다. nginx를 설치할 때 이미 했기 때문에 생략해도 됩니다.
# enable EPEL
sudo dnf install epel-release -y
# certbot 설치
sudo dnf install certbot -y
SSL 인증서 획득
Let’s Encrypt를 획득하기 위해서는 여러 방법이 있는데, 가장 무난한 standalone 방식으로 인증서를 획득하겠습니다. 인증을 받기 위해 nginx 서버를 잠시 정지합니다.
certbot 명령어에서 -d 옵션을 여러 개 입력하여 여러 도메인을 한번에 인증 받을 수 있는데, 개인적으로 하나씩 받는걸 추천합니다. 또 와일드 카드 인증서는 DNS 인증을 받아야 하기 때문에 자동 연장이 안되서 standalone 방식으로 인증서 만드는 것을 추천합니다.
# nginx 정지
sudo systemctl stop nginx
# SSL 인증서 획득
sudo certbot certonly --standalone -d example.com -d host.example.com -d ... -d ...
/etc/letencrypt/live
폴더에 가면 도메인 이름으로 폴더가 생성되고, 그 폴더 하위에 인증서가 생성된 것을 확인할 수 있습니다.
nginx 설정
이제 nginx 설정을 해보겠습니다. nginx 설정 폴더로 이동 후 sites-enabled
폴더를 생성합니다. sites-enabled
는 도메인 별로 설정을 관리하기 위해서 생성하는 폴더입니다.
# nginx 폴더로 이동
cd /etc/nginx
# sites-enabled 폴더 생성 후 이동
mkdir sites-enabled && cd sites-enabled
# 도메인 설정 파일 생성
vi example.com.conf
도메인 설정 파일에 아래와 같이 입력 후 내용을 작성합니다. 만약 도메인이 여러 개 있다면 server { … } 부분을 여러 개 추가하면 됩니다.
# api.example.com -> http://localhost:9000 으로 라우팅
server {
listen 443 ssl http2;
# URL : api.example.com
server_name api.example.com;
# certbot으로 생성한 인증서 위치
ssl_certificate /etc/letsencrypt/live/api.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/api.example/privkey.pem;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 10m;
location / {
# 서버 주소 입력
proxy_pass http://localhost:9000;
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;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
기존 nginx 설정에 위 설정을 추가합니다.
# nginx 폴더로 이동
cd /etc/nginx
# conf 수정
vi example.com.conf
위 그림과 같이 include /etc/nginx/sites-enabled/*.conf
를 추가합니다.
인증서 자동 갱신
Let’s Encrypt는 인증서 유효기간이 90일 이며, 만료 30일 이내에 갱신이 가능합니다. 따라서 매일 월요일 오전 3시에 자동으로 갱신할 수 있도록 crontab에 등록해보겠습니다.
우선 갱신이 정상적으로 되는 환경인지 테스트 해보겠습니다. ( nginx는 중지 상태여야 합니다. )
# 갱신 모의 테스트
sudo certbot renew --dry-run
갱신하는데 문제가 없다면, crontab에 등록하겠습니다.
crontab 설정 파일을 열고 아래 내용을 입력합니다.
# cronetab 설정 열기
crontab -e
# 월요일 오전 3시에 갱신
0 3 * * 1 /usr/bin/certbot renew --quiet --pre-hook "/usr/sbin/service nginx stop" --post-hook "/usr/sbin/service nginx start"
crontab 서비스를 재시작합니다.
systemctl restart crond.service
적용 확인
이제 nginx를 시작하여 정상적으로 인증서가 반영되어 HTTPS 처리가 되는지 확인하면 됩니다.
sudo systemctl start nginx
참고 자료 및 관련 사이트
참고 사이트
1. Nginx Documentation
2. Let’s Encrypt Documentation