Oracle Cloud VM 인스턴스에 Next.js 로 구성한 App을 서버에 띄우고 도메인 연결까지 했으나 SSL 적용이 안되어 있어서 http 로 들어가야 하고 보안인증서가 없어서 자물쇠가 안걸려 보이는게 자꾸 마음이 쓰였다. 이번 포스팅에서는 Nginx 설치를 하고 certbot 을 사용하여 let's encrypt 보안인증서까지 발급받는 과정을 정리해보려 한다.
목차
- Nginx 설치
- Nginx 서비스 실행 및 방화벽 포트 설정
- 리버스 프록시 설정
- Certbot 설치
- Crontab을 활용한 인증서 자동갱신
1. Nginx 설치
Nginx를 설치하는 이유는 앞서 말한 보안인증서를 발급받아 SSL적용을 하기 위해서도 있지만 리버스 프록시 기능을 사용하기 위해서이기도 하다. 리버스 프록시는 요약하면 클라이언트가 내 도메인으로 보내는 요청을 Nginx 웹 서버가 웹 애플리케이션 서버로 전달하는 기능을 말한다. 물론 이외에도 Nginx는 캐싱이나 로드밸런싱 기능등 뛰어난 성능과 안정성, 보안성을 가진 웹 서버이다.
Nginx는 CentOS 패키지 설치 도구인 yum 을 통해 간단하게 설치가 가능하다. 아래의 명령어를 실행하여 Nginx를 설치한다.
sudo yum install nginx
2. Nginx 서비스 실행 및 방화벽 포트 설정
Nginx 설치를 완료하면 아래 명령어를 실행하여 Nginx서비스를 실행하고 재부팅시에도 자동으로 실행되도록 설정한다.
sudo systemctl start nginx // nginx 서비스 실행
sudo systemctl enable nginx // nginx 자동실행 설정
다음으로 Nginx가 80 포트(http), 443 포트(https) 로 들어오는 요청을 받을수 있도록 방화벽에서 해당 포트들을 허용한다.
firewall-cmd --zone=public --permanent --add-port=80/tcp //http
firewall-cmd --zone=public --permanent --add-port=443/tcp //https
sudo firewall-cmd --reload
아래 명령어를 실행하여 정상적으로 설치가 되었는지 확인하고 브라우저에서 VM 인스턴스 공용 IP 로 접속하면 아래와 같은 Nginx 문구가 표출되는것을 확인할 수 있다.
sudo systemctl status nginx
3. 리버스 프록시 설정
클라이언트가 내 도메인으로 접속하여 요청을 보내면 Nginx 웹 서버가 요청을 받아 웹 애플리케이션 서버로 전달해줄수 있도록 리버스 프록시 설정을 한다.
nginx 경로에 있는 conf.d 파일을 수정해야 한다.
vi /etc/nginx/conf.d/default.conf
server {
listen 80;
server_name 도메인주소;
location / {
proxy_pass http://localhost:3000;
proxy_set_header Host $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;
}
}
server_name 에 요청을 받을 도메인주소를 입력하고 proxy_pass 에 전송해줄 웹애플리케이션 서버 주소를 적는다.
도메인 주소에 80 포트(http) 로 요청이 들어오면 http://localhost:3000 번으로 돌려주도록 설정해주었다.
✔︎참고
시스템에 SELinux가 활성화 되어있는경우, SELinux 정책이 Nginx가 3000번 포트에 접근하는 것을 제한하고 있어 정상적으로 리버스 프록시가 동작하지 않을 수 있다. 그런 경우 아래의 명령어를 실행시켜 SELinux 정책을 수정한다.
sudo setsebool -P httpd_can_network_connect 1
설정이 완료되면 아래 명령어로 nginx 를 재실행한다.
sudo systemctl reload nginx
sudo systemctl restart nginx
4. Certbot 설치
SSL 적용을 위해 Certbot을 설치하여 let's encrypt 보안인증서를 발급받아야 한다. 아래의 명령어를 실행하여 certbot을 설치한다.
sudo yum install epel-release
sudo yum install certbot python-certbot-nginx
설치가 완료되면 아래의 명령을 실행하여 certbot을 통해 Let's Encrypt 인증서를 발급받는다.
sudo certbot --nginx
명령어를 실행하면 이메일 구독 설정이나 호스트 선택등의 아래와 같은 문구가 뜬다.
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator nginx, Installer nginx
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Would you be willing to share your email address with the Electronic Frontier
Foundation, a founding partner of the Let's Encrypt project and the non-profit
organization that develops Certbot? We'd like to send you email about our work
encrypting the web, EFF news, campaigns, and ways to support digital freedom.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: n
이메일로 news 같은 소식을 받을 건지?
Which names would you like to activate HTTPS for?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: 도메인주소
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate numbers separated by commas and/or spaces, or leave input
blank to select all options shown (Enter 'c' to cancel): [엔터]
nginx에서 default.conf에 sever_name에 등록한 도메인이 표출된다. 해당 도멘인 번호를 입력하면 된다.
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for 도메인 주소
Waiting for verification...
Cleaning up challenges
Deploying Certificate to VirtualHost /etc/nginx/conf.d/default.conf
Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: No redirect - Make no further changes to the webserver configuration.
2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for
new sites, or if you're confident your site works on HTTPS. You can undo this
change by editing your web server's configuration.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 2
HTTPS 로 Redirect 로의 설정을 대신 certbot이 대신 해줄건지 ? 2 번 선택하면된다.
default.conf 에 들어가서 다시 확인해보면 certbot이 설정해준 ssl 설정 정보를 확인할 수 있다.
Redirecting all traffic on port 80 to ssl in /etc/nginx/conf.d/default.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Congratulations! You have successfully enabled 도메인주소,
5. Crontab을 활용한 인증서 자동갱신
인증서의 유효기간이 3개월이라 갱신을 해줘야 하지만 crontab을 사용하여 자동으로 갱신되도록 설정해줄 수 있다. 아래의 명령어를 실행하여 인증서가 자동으로 갱신되도록 설정한다.
crontab -e
// 아래 내용을 작성하고 저장
0 18 1 * * certbot renew --renew-hook="sudo systemctl restart nginx"
:wq
crontab -l //crontab 확인