[Spring Boot] EC2 배포하기 (Nginx, HTTPS, domain설정) - 2

빡개발·2024년 1월 24일
2
post-thumbnail

간단하게 EC2로 boot 프로젝트 배포하는 방법은 해당 포스팅을 보고와라
-> [Spring Boot] EC2 배포하기 (Nginx, HTTPS, domain설정) - 1

📒 Nginx 설치

📌 설치

먼저 Nginx를 설치해준다

sudo apt install nginx

방화벽 확인 필자는 EC2의 ubuntu 22.01LTS 사용중

sudo ufw app list

  • Nginx HTTP: 포트 80번만 허용
  • Nginx HTTPS: 포트 443번만 허용
  • Nginx Full: 포트 80, 443번 허용
ec2 인바운드 규칙에서 AWS 방화벽 자체에서 했다면 해당 내부방화벽인 ufw는 disable 상태로 두어야함 !


0.0.0.0/0 (IPv4): 이 표기법은 모든 IPv4 주소를 나타냅니다. 즉, 어떠한 출발지 IP 주소에서도 접근이 허용된다는 것을 의미 (여기서 보안을 위해 ssh 접근은 0.0.0.0으로 모두 허용하지 않고 개발할 컴퓨터의 공인IP로 지정 등록 하는 걸 추천)

::/0 (IPv6): 이는 모든 IPv6 주소를 나타냅니다. IPv6의 경우, 0.0.0.0/0 대신 ::/0을 사용하여 모든 IPv6 주소에 대한 연결을 허용하는 규칙

📌 nginx 실행 및 확인

$ sudo service nginx start // nginx 실행 시작
$ sudo service nginx stop // nginx 실행 종료

상태확인

$ sudo service nginx status // nginx 상태 확인

접속해보면 잘 접속된 것을 볼 수 있다! (http://3.xx.1.x/ 이걸로 해도 됨)

📒 도메인 설정

📌 도메인 구매 (가비아)

가비아에서 프로젝트 서비스 이름인 listywave.com 을 큰맘먹고 16,000원,.,. 주고 구매! (팀원이랑 뿜빠이라 괜찮다 ㅎ,.,.)

아래처럼 A 레코드에 호스트 이름을 dev.api로 지정하고 뒤에 EC2 ip 주소를 입력했다.
해당 호스트는 백엔드 api 서버로 이용될 것이다!

📌 nginx 도메인 설정

sites-available에 default 안쓸거면 하나 제작!

cd /etc/nginx/sites-available
sudo vi listywave.com

아래 처럼 입력해주는데 root~와 index~ 이부분은 정적파일을 서빙해주는 옵션이라 사실 해당 서버를 백엔드 api 서버로 사용할 거기에 없어도 무방하다

server {
        listen 80;
        listen [::]:80;

        root /var/www/listywave.com;
        index index.html index.htm index.nginx-debian.html;

        server_name dev.api.listywave.com; # 가비아에 A 레코드에 호스트를 dev.api로함

        location / {
                try_files $uri $uri/ =404;
        }
}

sites-available에 파일을 추가했는데, 실제로 이 파일을 적용시키려면 sites-enabled에도 작성해주어야한다.

그래서 주로 sites-available에서 파일을 수정하고 sites-enabled에서는 이 파일을 참조하고 있도록한다

sudo ln -s /etc/nginx/sites-available/listywave.com /etc/nginx/sites-enabled/

확인해보면 참조하고 있는 것을 확인할 수 있다!

이제 nginx.conf 파일에 해당 구문을 살펴보자

아래 주석 되어있는 부분은 default 값으로 32인데 만약 서버에 등록된 도메인이 많거나 특정 상황에서 충돌이 발생한다고 판단되면, 해당 설정 값을 조정하는 것이 좋음

📌 nginx 테스트 후 재실행

nginx -t는 nginx를 테스트 하는 과정이다, 테스트에 문제가 없다면 nginx를 재시작해준다

만약 서버블록 등에 오타가 있다면 테스트를 통과하지 못한다! (특히 세미콜론이나 중괄호 오타 조심!)

$ sudo nginx -t
$ sudo systemctl restart nginx

이렇게 나오면 테스트 성공!

📒 HTTPS 적용

이제 대망에 HTTPS 적용이다!!!!

https는 lets encrypt를 이용하여 발급받아야 하며 lets encrypt는 발급절차가 간단하고, 무료라는 장점이 있다. https를 이용하려면 인증서를 발급받은 뒤, 서버블록에 listen 443(https포트)을 추가하고, http로 접속했을 때 https로 리다이렉션 하는 등의 과정을 수행해야한다.
이때 인증서만 발급받으면 알아서 서버블록을 수정해주는 모듈이 있다!
💡 그게 바로 Certbot이다.
Certbot을 사용하면 간편하게 Let's Encrypt로부터 SSL/TLS 인증서를 발급 받을 수 있다.
Certbot은 Let's Encrypt 서버와 통신하여 도메인 소유 여부를 확인하고, 그 결과로 SSL/TLS 인증서를 발급받아 설치까지 자동으로 처리해줌. 이로써 HTTPS를 사용할 수 있게 된다!.

이제 본격적으로 적용해보자

📌certbot 설치

sudo service nginx stop

sudo certbot certonly --standalone -d dev.api.listywave.com

sudo service nginx start

위와 같이 발급 성공!

📌인증서 확인

sudo ls /etc/letsencrypt/live/dev.api.listywave.com

  • sites-available/listywave.com에 최종 https server 블록도 적용함!
  1. 첫번째 server 블록은 규칙으로 인해 http로(dev.api.listywave.com) 요청이 들어오면 가장 먼저 매칭되는 server 블록이며 https로 리다이렉트를 진행한다.

    이때, 요청 호스트, URI 정보를 유지함

  2. 두번째 server 블록에서는 443포트로 들어온 요청을 받으며 암호화된 요청을 받기 위해 ssl 암호화를 활성화함

  3. 아래 ssl_certificatessl_certificate_key에 SSL 인증서 파일 및 비밀키 경로를 지정함

  4. ssl_prefer_server_ciphers on; 이 옵션을 on하면 서버에서 지정한 암호화 알고리즘을 우선한다는 의미임
    → 만약 off로 할 시 외부에서 약화된 알고리즘 사용하여 공격할 수 있기 때문에 웬만해서 키는 게 좋음

server {
  listen 80;
  server_name dev.api.listywave.com;
  return 301 https://dev.api.listywave.com$request_uri;
}

server {
        listen 443;
        listen [::]:443;

      #  root /var/www/listywave.com;
      #  index index.html index.htm index.nginx-debian.html;

        server_name dev.api.listywave.com;

        ssl_certificate /etc/letsencrypt/live/dev.api.listywave.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/dev.api.listywave.com/privkey.pem;
        ssl_prefer_server_ciphers on;

        location / {
                   proxy_pass http://localhost:8080;
                   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;
        }
}

이제 설정을 다 했다!! 제발 원트로 끝나라.. 는 개뿔

📒 트러블 슈팅

💡 에러..

http://dev.api.listywave.com:8080으로 하면 접속이 잘 되는데 문제는

https://dev.api.listywave.com으로 하면 접속이 안된다는 것이다!.
문제 확인을 위해

sudo nginx -t

역시나 실수를 했다... 그놈의 실수...

여기 각 끝에 세미콜론(;)을 안붙여서 나는 에러였다!
또 privkey.pem가 아니라 privkey.com이라 쓴 나는 멍청이..

  ssl_certificate /etc/letsencrypt/live/dev.api.listywave.com/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/dev.api.listywave.com/privkey.pem;

혹시 모르니까 EC2 서버 시간 연동 안한사람은 해당 포스팅을 보고 꼭 변경하길!

📃 참고 : [AWS] EC2 ubuntu 서버 시간 설정하기

근데 그래도 안된다.... 이게 왜그러지..
자꾸 https://dev.api.listywave.com으로 접속하면
ERR_SSL_PROTOCOL_ERROR 라는 에러 코드의 연결할 수 없다는 페이지가 나온다.

📌해결

구글링해보니 listen 443; 에서 ssl 붙여야 한단다.. 진짜 붙이니까 잘됨

📃 참고 : Nginx ERR_SSL_PROTOCOL_ERROR

진짜 감격스러운 순간😹😹😹😹😹

📌최종 결과물

server {
  listen 80;
  server_name dev.api.listywave.com;
  return 301 https://dev.api.listywave.com$request_uri;
}

server {
        listen 443 ssl;
        listen [::]:443 ssl;

      #  root /var/www/listywave.com;
      #  index index.html index.htm index.nginx-debian.html;

        server_name dev.api.listywave.com;

        ssl_certificate /etc/letsencrypt/live/dev.api.listywave.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/dev.api.listywave.com/privkey.pem;
        ssl_prefer_server_ciphers on;

        location / {
                   proxy_pass http://localhost:8080;
                   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;
        }
}

📒 끝으로..

코드잇에서 진행하는 코드잇 스프린트 프론트 캠프에 최종 프로젝트에 백엔드로 참여하게 됐는데 이제 막 시작이라 두근거리기도 하면서 걱정되기도 하고 ~~~
그래도 팀원 잘만나서 다행이다 ㅎ.ㅎ

이번에 해당 인프라 구축하면 느낀점은 "하면 안되는 게 없다." 라는 것이다 이 기세로 끝까지 가보자~


📃 참고

https://celuveat.github.io/team-blog/back-blog/doggy/https/https/
https://suyeoniii.tistory.com/77

profile
개발자 공부만이 살길이다

3개의 댓글

comment-user-thumbnail
2024년 1월 25일

구웃웅우우우우웃 좋아요 👍

1개의 답글

안녕하세요!
한국대학생IT경영학회(KUSITMS)에서 '코드잇 부트캠프 커뮤니티 서비스 기획'을 주제로 산학협력 프로젝트를 진행하고 있는 코코아 팀의 민혜린이라고 합니다.
(학회 홈페이지: https://www.kusitms.com/ )

서비스 구체화를 위해, 코드잇 부트캠프 수강자/수료자 분들의 경험을 듣고 싶어서 설문을 진행하게 되었는데요...!
약 5분 정도 시간을 내어 설문에 참여해주실 수 있을지 부탁드리고 싶어 댓글을 쓰게 되었습니다...!

설문에 응답해 주신 분들 중 추첨을 통해서도 ☕️메가커피 아메리카노를 증정할 예정이며,
추가 📞전화인터뷰에 응해주신다면 "확정적으로" ☕️메가커피 아메리카노를 보내드릴 예정입니다.

바쁘시겠지만 시간 내어 설문에 참여해주신다면 저희 팀에 정말로 큰 도움이 될 것 같습니다!🥹
감사합니다!

🔗링크🔗 https://forms.gle/WqMvd3XrAgbeCXy78

답글 달기