EC2에 배포한 후 Elastic IP에 가비아에서 구입한 도메인을 연동했다.
IP는 어차피 nslookup 하면 볼 수 있어서 가리진 않았다.

NginX 설치 및 HTTPS 리다이렉트 적용
프록시를 적용하기 위해 NginX를 설치하자.
sudo apt-get install nginx
NginX를 설치하면 /etc/nginx 폴더와 /var/log/nginx 가 생기는데, 각각 NginX를 설정하고, 로그를 남기는 역할을 한다.
.conf 파일을 /etc/nginx/conf.d 폴더에 넣어두면, NginX가 켜질 때 설정을 읽어 적용한다.
/etc/nginx/openroadmaps.conf 파일을 생성하고, HTTP로 온 요청을 HTTPS로 리다이렉트 해주는 코드를 작성하자.
server {
listen 80;
server_name develop.openroadmaps.co.kr;
root html;
location / {
return 301 https://develop.openroadmaps.co.kr$request_uri;
}
}
reload 명령어로 NginX를 재시작하지 않고도 변경된 설정을 적용할 수 있다.
sudo service nginx reload
http://develop.openroadmaps.co.kr로 접속하면, https://develop.openroadmaps.co.kr로 리다이렉트 된다.
SSL 인증서 설치

HTTPS로 접속해도 인증서가 설치되어있지 않다면, 위와 같이 보안 관련 경고가 뜬다. SSL 인증서를 설치해야 하는데, 무료로 인증서를 발급받을 수 있는 Let's encrypt를 사용했다.
서버에서 certbot을 실행하면 [webroot]/.well-known/acme-challenge 경로에 랜덤한 이름의 파일이 생기고, Let's Encrypt에서 http://[도메인]/.well-known/acme-challenge/[랜덤 파일 명] URL로 요청을 보내 인증이 진행된다.
때문에 외부에서 위 URL로 요청이 왔을 때 파일을 보내줄 수 있도록 아래와 같이 NginX에 코드를 추가해야 한다.
아래 코드는 webroot를 /var/www/letsencrypt로 설정할 것을 가정하고 작성한 것이다.
server {
listen 80;
server_name develop.openroadmaps.co.kr;
root html;
location / {
return 301 https://develop.openroadmaps.co.kr$request_uri;
}
# 추가된 코드
location ^~ /.well-known/acme-challenge/ {
default_type "text/plain";
root /var/www/letsencrypt;
}
}
추가 완료 후 nginx reload를 통해 설정을 적용하고, 오류 없이 적용되는지 확인하자. 만약 공백이나 세미콜론 오타와 같은 오류가 발생할 경우, status 확인 시 오류가 뜬다.
sudo service nginx reload
sudo systemctl status nginx
● nginx.service - A high performance web server and a reverse proxy server
Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
Active: active (running) since Tue 2023-02-28 01:23:38 UTC; 1 day 10h ago
Docs: man:nginx(8)
Process: 12162 ExecReload=/usr/sbin/nginx -g daemon on; master_process on; -s reload (code=exited, status=0/SUCCESS)
Main PID: 587 (nginx)
Tasks: 2 (limit: 1143)
Memory: 14.6M
CPU: 852ms
CGroup: /system.slice/nginx.service
├─ 587 "nginx: master process /usr/sbin/nginx -g daemon on; master_process on;"
└─12164 "nginx: worker process" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ""
Feb 28 01:23:37 ip-172-31-13-7 systemd[1]: Starting A high performance web server and a reverse proxy server...
Feb 28 01:23:38 ip-172-31-13-7 systemd[1]: Started A high performance web server and a reverse proxy server.
Mar 01 12:13:21 ip-172-31-13-7 systemd[1]: Reloading A high performance web server and a reverse proxy server...
Mar 01 12:13:21 ip-172-31-13-7 systemd[1]: Reloaded A high performance web server and a reverse proxy server.
오류가 없다면 certbot을 실행하자. 도메인과 webroot를 입력하면 된다.
sudo mkdir -p /var/www/letsencrypt/.well-known/acme-challenge
sudo snap install certbot --classic
sudo certbot certonly --webroot
Please enter the domain name: [도메인 ex) www.openroadmaps.co.kr]
Input the webroot for [도메인]: [webroot ex) /var/www/letsencrypt]
설정에 오류가 없었다면, 아래의 메시지와 함께 인증서가 생성될 것이다.
Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/www.openroadmaps.co.kr/fullchain.pem
Key is saved at: /etc/letsencrypt/live/www.openroadmaps.co.kr/privkey.pem
This certificate expires on 2023-05-30.
/etc/letsencrypt/live/[도메인] 경로에 생성된 인증서를 확인하자.
sudo ls -laF /etc/letsencrypt/live/www.openroadmaps.co.kr
total 12
drwxr-xr-x 2 root root 4096 Mar 1 12:18 ./
drwx------ 3 root root 4096 Dec 12 07:14 ../
-rw-r--r-- 1 root root 692 Dec 12 07:14 README
lrwxrwxrwx 1 root root 46 Mar 1 12:18 cert.pem -> ../../archive/www.openroadmaps.co.kr/cert2.pem
lrwxrwxrwx 1 root root 47 Mar 1 12:18 chain.pem -> ../../archive/www.openroadmaps.co.kr/chain2.pem
lrwxrwxrwx 1 root root 51 Mar 1 12:18 fullchain.pem -> ../../archive/www.openroadmaps.co.kr/fullchain2.pem
lrwxrwxrwx 1 root root 49 Mar 1 12:18 privkey.pem -> ../../archive/www.openroadmaps.co.kr/privkey2.pem
Proxy 설정
인증서 생성이 완료됐다면 NginX 프록시 설정을 해야 한다.
생성된 SSL 인증서 위치를 설정하고, /api로 오는 요청은 backend 컨테이너로, 이외의 요청은 S3 컨테이너로 보내도록 설정하자.
# 추가된 코드
upstream backend {
server localhost:8080;
keepalive 32;
}
server {
listen 80;
server_name www.openroadmaps.co.kr;
root html;
location / {
return 301 https://www.openroadmaps.co.kr$request_uri;
}
location ^~ /.well-known/acme-challenge/ {
default_type "text/plain";
root /var/www/letsencrypt;
}
}
# 추가된 코드
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name www.openroadmaps.co.kr;
ssl_certificate /etc/letsencrypt/live/www.openroadmaps.co.kr/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/www.openroadmaps.co.kr/privkey.pem;
location /api {
proxy_pass http://backend;
}
location / {
proxy_pass http://openroadmaps-product-s3.s3-website.ap-northeast-2.amazonaws.com;
}
}
설정 이후 NginX를 reload 하면, HTTPS로 연결이 가능해진다.

'Projects > OpenRoadmaps' 카테고리의 다른 글
[OpenRoadmaps] Github Actions를 통한 CI/CD 구축하기 (0) | 2023.03.08 |
---|---|
[OpenRoadmaps] 9. Docker 빌드 + AWS 배포하기 (0) | 2023.02.13 |
[OpenRoadmaps] 블로그 카테고리 Unique Constraint 오류 해결 (0) | 2023.02.06 |
[OpenRoadmaps] 8. 블로그 글 작성, 글 뷰어 기능 개발 (2) | 2023.02.05 |
[OpenRoadmaps] 7. 로드맵 뷰어 기능 개발 (0) | 2023.02.05 |