Infra

[Infra] AWS EC2 Server에서 Http통신에서 Https (도메인) 사용하는 방법

HJ922 2024. 2. 22. 00:27

전제조건 : EC2 서버내 Docker 설치 (https://hjustin.tistory.com/8)

 

[Infra] EC2 서버에서 Docker 사용하기

※ 함부로 설치하게되면 Docker 통신에서 오류가 날 수 있으니 설치는 무조건 공식 홈페이지에 나와있는대로 따라하는 것이 좋다. 1. Docker 설치 https://docs.docker.com/engine/install/ubuntu/#install-using-the-rep

hjustin.tistory.com

 

1. Docker내 Nginx에 접속후 인증받기

# Docker에서 nginx를 가져옴
docker pull nginx

# HTTP(80)로 들어오면 HTTPS(443)로 redirect
sudo docker run --name nginx -d -p 80:80 -p 443:443 nginx

# nginx 내부로 진입
sudo docker exec -it nginx /bin/bash

# Let’s Encrypt 클라이언트 설치 <A>
apt-get update

apt-get install vim

apt-get install certbot

apt-get install python3-certbot-nginx

# 여기에 도메인 파일 domain-name.conf를 정의
cd etc/nginx/conf.d

※ EC2 서버의 HTTPS 설정을 하고싶으면 <A> 부터 따라하면 된다.

server {
    listen 80 default_server;
    listen [::]:80 default_server;
    root /var/www/html;
    server_name example.com www.example.com;	# 자신의 도메인
}

# 자신의 도메인이 핵심

exit

docker restart nginx

certbot --nginx -d example.com -d www.example.com

※활성화된 도메인만 받을 수 있다.

본 경험에 따르면 위의 명령어를 치고난 후

1. 본인의 이메일 입력

2. Y

3. N

하면 알아서 인증된다.

2. Ec2서버의 nginx conf 설정파일 + 인증서 복사하기

1번의 방법을 따르게되면 컨테이너를 매번 재실행할때마다 인증을 해줘야하는 불편함이 존재한다.

따라서 2번 방법을 추천한다

 

1."default.conf" 파일 설정

server {
    listen 80;
    server_name i10a207.p.ssafy.io;

    # HTTP 요청을 HTTPS로 리디렉션
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl;
    server_name i10a207.p.ssafy.io;

    ssl_certificate /etc/nginx/ssl/cert2.pem;
    ssl_certificate_key /etc/nginx/ssl/privkey2.pem;

    # 기타 SSL 설정 (필요에 따라 추가)
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;

    # 웹 서버의 설정 내용
    root /user/share/nginx/html;
    index index.html index.htm;

    location /{
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }
    error_page 404 /404.html;
    error_page 500 502 503 504 /50x.html;
    location = /50x.html{
        root /user/share/nginx/html;
    }

}

 

2."Dockerfile" 설정

FROM nginx

COPY init_script.sh /usr/local/bin/init_script.sh
RUN chmod +x /usr/local/bin/init_script.sh

ENTRYPOINT ["/usr/local/bin/init_script.sh"]

 

3. "init_script.sh" 설정

#!/bin/bash

# Create directory if it doesn't exist
mkdir -p /etc/nginx/ssl/

# Start Nginx
nginx -g "daemon off;"

 

4. default.conf 파일 볼륨마운트 + 호스트 80포트 <매핑> 도커 80포트 + 호스트 443포트 <매핑> 도커 443포트  + ssl 인증서 마운트 + 루트 권한부여

docker run -p 80:80 -p 443:443 --name testnginx -d -v /home/ubuntu/testnginx/default.conf:/etc/nginx/conf.d/default.conf -v /etc/letsencrypt/archive/"도메인주소":/etc/nginx/ssl/ -u root mytestnginx

 

 

============================================================

추가 내용

Let's Encrypt 인증서 자동 갱신

# crontab 설치
sudo apt install cron -y

# crontab 파일 열기
crontab -e

# 해당 명령어를 추가하고 저장
0 12 * * * /usr/bin/certbot renew --quiet

처음 인증서를 발급하면 60일 뒤에 만료된다. 위 명령어를 적용하면 자동으로 갱신된다. certbot 매일 실행할 명령어를 추가한다. 이 명령문은 매일 정오에 명령을 실행 (서버의 인증서가 다음 30일 이내에 만료되는지 확인하고 만료되면 갱신, --quiet은 certbot이 출력을 생성하지 않게한다.)

 

 

참고 사이트 : EC2에서 도메인에 NGINX + HTTPS 적용 (velog.io)