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)