이제 마지막이다.
도메인을 구매해서 도메인과 ec2가 연결시키고, ssl인증서를 적용해 https가 가능하도록 해보자
(과정중에 막히는 부분이 있었는데 해결을 했다)
1. 가비아에서 도메인 구입후 레코드에 퍼블릭주소를 등록한다
타입 A , @ , 퍼블릭주소
타입 A , www , 퍼블릭주소

2. nginx 설정 도메인설정 (https x)
80포트로 들어오는 요청을 /경로는 frontend:3000으로 전달하고, /api경로는 backend:8080으로 전달한다.
이렇게 실행해보면 http로 들어갔을 경우 잘 동작하는 것을 볼 수 있다.
아래는 nginx설정파일이다.
server {
    listen 80;
    server_name domain;
    # Certbot 경로 유지
    location /.well-known/acme-challenge/ {
        root /var/www/certbot;
    }
    location / {
        # 루트 경로는 프론트엔드로 전달
        proxy_pass http://frontend: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;
    }
    location /api {
        proxy_pass http://backend:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}
3. certbot으로 인증서 만들고 이를 갱신하도록 설정
3-1. 인증서 만들기
이제 ssl인증서로 https가 가능하도록 하기 위해 certbot을 이용한다.
이를 위해 certbot의 도커 컴포즈 파일을 이렇게 작성한다.
certbot:
    image: certbot/certbot
    container_name: certbot
    volumes:
      - ./certbot/conf:/etc/letsencrypt
      - ./certbot/www:/var/www/certbot
    # 초기 인증서 발급 시에는 entrypoint를 사용하지 않을 수 있으므로, 아래와 같이 command로 임시 변경하거나 주석 처리
    command: sleep 1d
docker compose up -d nginx 로 실행하고 다음 명령어로 ssl인증서를 생성해준다. [ ] 이 부분은 본인걸로 변경하면 됨
docker compose run --rm certbot certonly --webroot --webroot-path /var/www/certbot -d [domain] --email [your-email@example.com] --agree-tos --no-eff-email
그럼 certbot폴더 아래 www가 생긴것을 볼 수 있다.
3-2. 인증서 적용하기 https
우선 nginx를 설정해줘야 한다. 80으로 들어오면 https 433으로 리다이렉트 하고, 이 443포트로 전달된 요청을 front와 back에 전달한다.
server {
    listen 80;
    server_name domain;
    # Certbot 경로 유지
    location /.well-known/acme-challenge/ {
        root /var/www/certbot;
    }
    # 80번 포트로 온 다른 모든 요청은 443 포트(HTTPS)로 리디렉션
    location / {
        return 301 https://$host$request_uri;
    }
}
server {
    listen 443 ssl;
    server_name domain;
    # SSL 인증서 경로 지정
    ssl_certificate /etc/letsencrypt/live/harudoyak.store/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/harudoyak.store/privkey.pem;
    location / {
        # 루트 경로는 프론트엔드로 전달
        proxy_pass http://frontend: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;
    }
    location /api {
        proxy_pass http://backend:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}
한가지 더, certbot의 도커컴포즈파일에 인증서가 자동 갱신되도록 설정해주자.
이는 12시간마다 갱신이 필요한지 확인한 후 갱신하라는 이야기
certbot:
    image: certbot/certbot
    container_name: certbot
    volumes:
      - ./certbot/conf:/etc/letsencrypt
      - ./certbot/www:/var/www/certbot
    entrypoint: "/bin/sh -c 'trap exit TERM; while :; do certbot renew; sleep 12h & wait $${!}; done;'"
4. 이제 https로 접근이 가능하도록 하기 위해 ec2의 443포트를 열어줘야 한다.
브라우저로 도메인을 쳐서 들어가보면 잘 되는 것을 확인할 수 있다.
5. 도커컴포즈를 사용하니 훨씬 간편하게 서버를 이전할 수 있어서 좋았다. 처음에 걱정을 너무 많이 했는데 생각보다 잘 진행되어서 기뻤다. 혹시나 front에 내가 미처 변경못한 코드가 있을까봐 거기서 시간이 오래걸릴까 걱장이 되었고, 데이터를 옮기다가 날리면 어쩌지 하는 걱정이 있었는데 문제없이 잘 되어서 다행이다. 걱정하느라 더블체크를 넘어 몇번을 체크했는지,, 다음엔 이번보단 가벼운 마음으로 자신감을 가지고 시도해볼 수 있을 것 같다.
근데 비용이.. 고민이다. 바뀐 프리티어 정책으로 이전 정책보다 요금이 더 나온다. 대신 추가 크레딧을 받아 $200가 있어 괜찮을 것 같긴 한데 rds비용, ec2비용 순대로 커서 간당간당 하다. gemini는 db를 ec2내부에 두는 방법과 특정 시간에는 꺼두는 것을 추천했다. 일단 1달 지나보고 결정하려고 한다. 아마 특정 시간에 꺼두는걸 택하지 않을까 싶다. (ec2를 껐다 켜도 도커컨테이너가 중지되지 않도록 하는 설정도 있다고 하니 할만한것 같다.)
이걸 서버옮기기대장정(5)에 쓸지말지는 음.. 미정^.^
댓글