AWS, Nginx, Let's encrypt, Certbot, HTTPS
✅ Connect SSH into instance
- SSH로 instance에 연결할 수 있어야 한다.
- 햔재
Elastic public IP = 43.201.173.136
1
ssh -i solidtodo.pem ec2-user@43.201.173.136
✅ 가비아에서 도메인 구매
✅ AWS Route 53
- 위 블로그 참고
- 특히
A
서버가 있어야 한다. (아래에 trouble shooting 자세히 설명)
✅ EC2 instance security group setting
✅ Install Nginx
- update bash
1
2
3
4
sudo yum update -y
## linux
sudo dnf update -y
- install nginx
1
2
3
4
sudo amazon-linux-extras install nginx1 -y
## linux
sudo dnf install -y nginx
- start, enable Nginx
1
2
3
4
5
6
sudo systemctl start nginx
sudo systemctl enable nginx
## linux
sudo systemctl start nginx
sudo systemctl enable nginx
- check nginx status
1
sudo systemctl status nginx
- If Nginx is running successfully, check
http page
- Nginx running page should show
- Welcome to Nginx!
1
http://43.201.173.136
✅ Install Certbot, Let’s encrypt
1
2
3
4
sudo yum install -y certbot python3-certbot-nginx
## linux
sudo dnf install -y certbot python3-certbot-nginx
✅ Restart Nginx
1
sudo systemctl restart nginx
✅ 이제 앞으로 할일을 설명하자면
- 여기까지하면
/etc/nginx
까지 있는 상태이다. - 다음 명령어들로
/etc/nginx/sites-available
,/etc/nginx/sites-enabled
를 만들고 sites-available
안에default
를 만든 다음- HTTP, HTTPS 설정을 하고
sites-enabled
로 symbolic link를 만들 것이다.
1
2
3
4
5
6
/etc
└── nginx
├── sites-available
│ └── default (내가 실제로 건드릴 config 파일)
└── sites-enabled
└── default -> /etc/nginx/sites-available/default (symbolic link)
✅ Configure Nginx sites-available
- create
sites-available
, go and configure
1
2
sudo mkdir -p /etc/nginx/sites-available /etc/nginx/sites-enabled
sudo vim /etc/nginx/sites-available/default
sites-available
에HTTP configuration
- 아직
HTTPS configuration
은 안 된 상태이며, - 추후
SSL 인증서
를 발급받으면 certbot이 자동으로 완성해준다. - 일단 파일을 만들기는 해야 하니까 아래
HTTP
내용만 작성해주자
1
2
3
4
5
6
7
8
9
10
11
server {
if ($host = solidtodo.shop) {
return 301 https://$host$request_uri;
} # managed by Certbot
listen 80;
listen [::]:80;
server_name solidtodo.shop;
return 301 https://$host$request_uri;
}
- create symbolic link
1
sudo ln -s /etc/nginx/sites-available/default /etc/nginx/sites-enabled/
/etc/nginx/sites-enabled/
안에default
는 실제로 존재하는 파일이 아니다.- 만약 존재하면, symbolic link 만드는데 실패함
- 만약 존재한다면 지워버리자 (파일 위치로 이동해서)
sudo rm -r default
ls -l
로 명령어를 치면 결과는 다음과 같을 것이다.solidtodo.conf
파일은 없어도 됨, 무시하기
solidtodo.conf
파일은 없어도 됨
✅ Configure nginx.conf
- include link in
nginx.conf
- Include sites-enabled in nginx.conf
1
include /etc/nginx/sites-enabled/*;
- test configuration
1
sudo nginx -t
- If ok, reload Nginx
1
sudo systemctl reload nginx
⚠️ private IP만 불러와지는 error
1
2
3
hostname -I
## result: 172.31.0.49
## ❌ public IP 43.201.173.136가 출력되어야 함
1
2
3
dig solidtodo.shop
## result: answer 0
## ❌ answer 1이 출력되어야 함
1
2
3
curl -I http://solidtodo.shop
## curl: (6) Could not resolve host: solidtodo.shop
## ❌ 200이 출력되어야 한다.
1
2
nslookup solidtodo.shop
## public IP를 return해야 한다.
✅ A record setting for domain
Route 53
에서 설정 방법
- ❓ 저번에는 이런 에러가 뜨지 않았는데, 이번에는 뜬 이유를 고민해보자면
Route 53
에서 호스팅 영역을 생성했을 때,- 저번에는
CNAME 레코드
가 자동으로 만들어졌었다. - 이번에는 어떤 이유로
NS
,SOA
만 만들어졌고, 그래서 별도로A레코드
설정이 필요하지 않았나 싶다.
✅ Obtain SSL Certificate with certbot
1
2
3
4
sudo certbot --nginx -d your_domain_name
## example.com
sudo certbot --nginx -d exmaple.com
✅ Configure Nginx HTTPS
- configure
sites-available
- Nginx가 대부분 해주지만, 조금 수정해야 하는 부분도 있으니 꼼꼼하게 보기
1
sudo vim /etc/nginx/sites-available/default
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
server {
listen [::]:443 ssl; # managed by Certbot
listen 443 ssl; # managed by Certbot
server_name solidtodo.shop;
root /var/www/html;
index index.html index.htm;
ssl_certificate /etc/letsencrypt/live/solidtodo.shop/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/solidtodo.shop/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
location / {
proxy_pass http://solidtodo.shop: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;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
server {
if ($host = solidtodo.shop) {
return 301 https://$host$request_uri;
} # managed by Certbot
listen 80;
listen [::]:80;
server_name solidtodo.shop;
return 301 https://$host$request_uri;
}
- test configuration
1
sudo nginx -t
- If ok, reload Nginx
1
sudo systemctl reload nginx
- 잠깐 기다리기
✅ Check error logs if needed
1
2
sudo tail -f /var/log/nginx/error.log
sudo tail -f /var/log/nginx/access.log
✅ Check HTTPS browser and swagger
1
https://43.201.173.136
✅ Result
This post is licensed under CC BY 4.0 by the author.