이 문서는 총 3 단계로 이루어진 구현
파트의 두 번째에 해당합니다.
이 과정을 통해서 Nginx 를 이용해서 HTTPS 를 구현하는 방법을 학습할 수 있습니다.
해당 과정을 통해서 80번 포트, HTTP
로 들어온 요청을 TLS/SSL 암호화를 하여 443번 포트, HTTPS
로 넘겨줄 수 있게 됩니다.
이 문서는 시리즈로 이어지고 있습니다. 따라서, 원활한 진행을 위해서 사전 과정을 따라 오시는 것을 추천해드립니다.
단, 구현
파트의 첫 번째는 단순한 Nginx 의 체험에 불과하므로, 한 번 이상 사용해 보셨다면 패스하셔도 무관할 것 같습니다.
본 과정을 이수하기 위해서는 DNS 시스템에 등록된 도메인 과 도메인 인증 기관이 필요합니다.
다음의 무료 제공 업체 혹은 별도의 업체를 사용하시면 이 코스를 따라갈 수 있을 것입니다.
이번 실습은 ubuntu 22.04
에서 이루어지고 있습니다.
자세한 내용은 다음 프로젝트의 저장소 링크 를 클릭하셔서 ### ✔ 진행 절차
이번에는
apt
라는 패키지 관리 매니저를 사용할 것입니다. 직전에 사용한apt-get
보다 조금 더 빠르고 안정적인 친구이며 더 자세한 내용은 이 포스트 를 참고해주세요.
다음 명령어로 관리자 계정
으로 전환하세요.
sudo -s
ubuntu 패키지 관리 매니저인 apt 를 업데이트하고 nginx
를 설치해주세요.
sudo apt update
sudo apt install nginx
service + nginx 로 사용할 수 있는 명령어는 다음과 같습니다.
명령어 | 기능 |
---|---|
sudo nginx -t | /etc/nginx/nginx.conf 파일이 정규 문법을 맞춰서 작성되었는 지, 테스트합니다. |
sudo service nginx start | /etc/nginx/nginx.conf 를 기반으로 nginx 의 server 를 실행시킵니다. |
sudo service nginx stop | nginx 의 server 를 종료시킵니다. |
sudo service nginx restart | nginx 의 server 를 종료 후 실행 시킵니다. |
sudo service nginx reload | nginx 의 server 를 실행을 유지한 채, 설정 파일 값만 새로 고침 해서 반영 시킵니다. |
Nginx 가 서비스 엑세스 권한을 터득하기 위해서는 방화벽 소프트웨어를 구성해야 합니다. 이번에는 ufw 라고 불리는 초심자를 위한 방화벽 솔루션을 사용할 생각입니다. 더 자세한 정보가 필요하시다면 이 포스트 를 참고하시길 바랍니다.
ubuntu 22.04
에서는 ufw 가 비활성화 상태일 것입니다. 다음의 명령어를 입력해서 확인해주세요.
sudo ufw status
만약 inactice
상태라면 다음의 명령어로 활성화 시켜주세요.
sudo ufw enable
ufw 가 활성화 되고 나면 다음의 항목을 활성화 시켜주세요.
sudo ufw allow 'OpenSSH'
sudo ufw allow 'Nginx HTTP'
방화벽 설정이 끝나면 다음의 systemctl
명령어를 사용해서 Nginx 서버를 가동 시킬 수 있습니다. 이 명령어는 service
계열 명령어 보다 더 강력하고 세세한 제어 권한을 설정할 수 있는 명령어 입니다.
systemctl status nginx
systemctl + nginx 로 사용할 수 있는 명령어는 다음과 같습니다.
명령어 | 기능 |
---|---|
sudo systemctl stop nginx | 서버를 중지 시킵니다. |
sudo systemctl start nginx | 서버를 가동 시킵니다. |
sudo systemctl restart nginx | 서버를 재가동 시킵니다. |
sudo systemctl reload nginx | 가동 중인 서버를 새로고침 할 수 있습니다. |
sudo systemctl disable nginx | Nginx 가 서버 실행 시 켜지지 않게 바꿉니다. |
sudo systemctl enable nginx | Nginx 가 서버 실행 시 켜지도록 바꿉니다. (기본값) |
ubuntu 22.04
에서는 기본 지원 되고 있는 스냅 패키지
를 이용해서 certbot 을 설치할 것 입니다.
일단, snapd 코어를 가장 최신 버전으로 업데이트 해줍니다.
sudo snap install core; sudo snap refresh core
이전 버전의 certbot 이 있다면 제거하고, certbot
을 설치해야 합니다.
sudo apt remove certbot
sudo snap install --classic certbot
최종적으로 certbot
이 다른 시스템 패키지와 충돌하지 않도록 링크 파일로 구성해야 합니다.
sudo ln -s /snap/bin/certbot /usr/bin/certbot
위 과정을 따라했다면 다음의 두 핵심 파일이 자동으로 구성 됩니다.
각 폴더 및 파일에 대한 더 자세한 설명은 다음 포스트 의 Step 6 - Nginx FIles and Directory
을 참고해주세요.
다음 명령어를 입력해서 nginx 실행 초기 파일을 열어 주세요.
sudo nano /etc/nginx/nginx.conf
해당 파일의 주된 변경점은 다음과 같습니다.
server_names_hash_bucket_size 64
항목을 주석 해제해 주세요.default_type application/octet-stream;
을 default_type application/json
으로 변경해주세요.다음 명렬어를 입력해서, 해당 디렉토리로 진입해주세요.
cd /etc/nginx/sites-available
ls
명령어를 입력하면 파일 및 폴더 목록을 확인할 수 있습니다.
해당 경로에는 default
라는 기본 서버 파일이 존재합니다.
server {
listen 80 default_server;
listen [::]:80 default_server;
root /var/www/html;
server_name _;
location / {
try_files $uri $uri/ =404;
}
}
이제 해당 파일을 삭제하고 본격적으로 HTTPS 서버 구현을 위한 절차에 들어가겠습니다.
sudo rm /etc/nginx/sites-available/default
현재, /etc/nginx/sites-available/default
를 제거한 상태이므로, 다음의 명령어를 입력해서 SSL 인증서를 발급 받으면 자연스럽게 default
파일이 생성됩니다.
sudo certbot --nginx -d 도메인-주소
또한 다음의 명령어를 통해서 certbot 자동 갱신을 설정하고 확인할 수 있습니다.
sudo systemctl status snap.certbot.renew.service
sudo certbot renew --dry-run
마지막으로 다음과 같이 bypass 설정을 더하는 것으로 default 파일을 변경하고 나면 서버가 정상적으로 실행이 됩니다. 자세한 내용은 이 GitHub 문서 를 참고해주세요.
server {
root /var/www/도메인주소/html/;
index index.html index.htm index.nginx-debian.html;
server_name 도메인주소;
location / {
try_files $uri $uri/ =404;
}
listen [::]:443 ssl ipv6only=on; # managed by Certbot
listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/도메인주소/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/도메인주소/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}
server {
listen 80;
listen [::]:80;
server_name 도메인주소;
root /var/www/도메인주소/html;
location / {
return 301 https://도메인주소$request_uri;
}
}