우여곡절 끝에 배포까지 완료했다😂 오늘까지였는데 10일 안에 처음 해보는 로그인/회원가입, 배포까지 해보는 것은 좀 빡셌던 것 같다..게다가 최종 디자인도 어제 나왔기 때문에..하루..이틀 내에 화면그리고 배포하고 테스트까지 할 시간이 부족했다ㅠ
시간내에 프로젝트를 제출하는 것은 실패했지만 끝까지 프로젝트를 완성하고 싶어서 로컬에서 API 테스트, AWS 배포까지 완료하고 현재 HTTP 프로토콜로 되어있는 주소를 HTTPS 로 바꿔주려고 한다!!
현재 80포트로 접속했을 때 3000으로 보내주는 포트포워드까지 적용된 상태이다.
HTTPS로 설정해주기 위해서는 인증서가 필요한데 무료로 발급해주는 인증서를 사용해볼 것이다.
그것이 바로 certbot이다. 인증서를 자동으로 발급하고 갱신해준다.
이전에 설치된 certbot과 충돌이 날 수 있으니 지워주고 시작
sudo apt-get remove certbot
certbot 공식 홈페이지에서는 snap을 통해 설치하는 것을 권장하고 있다.
snap을 설치해주고 진행하자
sudo apt update
sudo apt install snapd
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot
certbot --version
sudo certbot --nginx -d 도메인
# ex) sudo certbot --nginx -d abc.com
# ex) sudo certbot --nginx -d abc.com -d www.abc.com
본인 이메일을 적어준다.
ACME 서버에 등록할 것인지 동의 여부 → Y
를 입력하여 동의
EFF 소식을 이메일로 받을지 선택 → 이메일 수신 여부는 자유롭게 선택 (Y/N)
그럼 인증서가 성공적으로 발급 된 것을 확인할 수 있다!
sudo certbot certificates
발급받은 인증서의 만료 기간, 키 위치 등의 정보를 확인할 수 있다.
이제 마지막으로 80포트 접속 시 https 기본 포트인 443으로 리다이렉트 처리만 해주면 된다.
sudo vi /etc/nginx/conf.d/default.conf
내가 설정해준 파일로 가면 certbot이 알아서 설정들을 추가해준 것을 볼 수 있다! (# managed by Certbot 이 붙은 부분)
여기에 proxy 설정들을 추가로 작성해주었다.
server {
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_name 도메인주소;
root /home/ubuntu/프로젝트폴더이름/build;
index index.html index.htm;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
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;
proxy_redirect off;
}
}
server {
if ($host = memo-re.shop) {
return 301 https://$host$request_uri;
} # managed by Certbot
listen 80;
server_name memo-re.shop;
# 없애고 301 리디렉션 리턴하도록 수정 ✅
# return 404; # managed by Certbot
return 301 https://$host$request_uri;
}
sudo service nginx restart
nginx 설정 적용해주고 프로젝트를 실행하면 https://내 도메인주소
로 잘 접속된다!!🙆🏻♀️
삭제했다가 다시 설치하면 기존의 남아있는 설정들 때문에 제대로 동작하지 않을 수 있기 때문에 완전 꼬인게 아니면 에러를 해결해보는 쪽이 더 좋을 것 같다. 아래 명령어를 모두 입력해주었다. (참고)
일단 certbot으로 받았던 인증서를 다시 삭제해주었다.
sudo certbot delete
👉 Which certificate would you like to delete?
삭제할 주소의 번호를 선택하고 enter 쳐주면 된다.
sudo rm -rf /etc/letsencrypt/
sudo rm -rf /var/lib/letsencrypt/
sudo rm -rf /var/log/letsencrypt/
sudo apt update
sudo apt upgrade
sudo apt autoremove
sudo snap remove certbot
마지막으로 snap 파일에 남아있는 certbot 폴더도 지워주었다.
cd snap
rm -rf certbot
이렇게까지 한 이후에 다시 설치 명령어를 입력하니까 다시 설치할 때 이미 설치되어 있다는 오류가 나지 않고 다시 설치되기는 했다..!
파일 설정 한 후에 sudo service nginx start
하니까 이런 에러가 난다.ㅠ
Job for nginx.service failed because the control process exited with error code.
See "systemctl status nginx.service" and "journalctl -xeu nginx.service" for details.
뭔가 꼬였다 싶어서 삭제를 하고 다시 설치하고 진행해야겠다 싶어서 했떠니 똑같은 오류가 난다...
명령어를 입력하고 에러코드를 확인해보았다.
$ sudo systemctl status nginx.service
× nginx.service - A high performance web server and a reverse proxy server
Failed to start A high performance web server and a reverse proxy server.
이런 에러문구가 뜬다. 자세하게 확인하기 위해 위에 안내된 명령어를 입력해보았다.
$ journalctl -xeu nginx.service
그러면 이런 안내가 나온다.
[emerg] open() "/etc/letsencrypt/options-ssl-nginx.conf" failed (2: No such file or directory) in /etc/nginx/nginx.conf:76
nginx: configuration file /etc/nginx/nginx.conf test failed
이 부분들을 확인해봐야할 것 같다.
/etc/letsencrypt
의 파일 목록을 보니까 renewal-hooks 밖에 없다. options-ssl-nginx.conf 파일을 생성해준다. 아래 코드가 기존에 자동으로 생성되는 파일인 것 같다. (Certbot Github 참고)
# This file contains important security parameters. If you modify this file
# manually, Certbot will be unable to automatically provide future security
# updates. Instead, Certbot will print and log an error message with a path to
# the up-to-date file that you will need to refer to when manually updating
# this file. Contents are based on https://ssl-config.mozilla.org
ssl_session_cache shared:le_nginx_SSL:10m;
ssl_session_timeout 1440m;
ssl_session_tickets off;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers off;
ssl_ciphers "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384";
/etc/letsencrypt/
디렉토리로 이동해서 SSL 옵션 파일을 생성해주자.
sudo vi /etc/letsencrypt/options-ssl-nginx.conf
i
(편집) - 코드 붙여넣기 - esc
- :wq
저장후 나가기
그러고 다시 명령어를 입력해서 상태를 확인해봤다. 이번엔 다른 오류로 바뀌어있다.
nginx: [emerg] cannot load certificate "/etc/letsencrypt/live/[도메인이름]/fullchain.pem": BIO_new_file() failed
이건 Certbot에서 인증서를 발급할 때 같이 제공된 공개키/개인키 파일들에 관한 것인 것 같다.
아무래도 삭제할 때 delete 명령어로 인증서까지 같이 지운게 문제인 것 같다.....
Certbot이 완전히 지워지지 않은건지, 아니면 다시 설치하는 과정에서 꼬인것 같아서 인스턴스를 다시 밀고 시도해보았다🥲
+) 이 때는 nginx 설정 적용(재시작)하는 명령어 입력 - 오류 - certbot 설정문제인가? nginx 설정을 잘못 건드렸나? certbot 확인하는 명령어도 오류가 나니까 멘붕이 왔었는데
certbot도 고장나고 있다고 생각해서 인증서를 다시 발급받을 수 없다고 생각했던 것 같다
아마 이 때 certbot 인증서 발급받는 명령어를 다시 입력해서 시도를 해보면 좋았지 않았을까 생각이 든다..! 그러면 아마 다음 오류가 또 나오거나..진행이 되었지 않았을까🤔
참고