Post

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 자세히 설명)

Image

✅ EC2 instance security group setting

  • 보안그룹에 port 443 열어주기 Screenshot 2024-12-18 at 18 27 00

Screenshot 2024-12-18 at 19 23 23

✅ 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

Screenshot 2024-12-14 at 14 10 55

✅ 이제 앞으로 할일을 설명하자면

  • 여기까지하면 /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-availableHTTP configuration
  • 아직 HTTPS configuration은 안 된 상태이며,
  • 추후 SSL 인증서를 발급받으면 certbot이 자동으로 완성해준다.
  • 일단 파일을 만들기는 해야 하니까 아래 HTTP내용만 작성해주자

Screenshot 2024-12-18 at 18 35 31

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

Image

  • ls -l로 명령어를 치면 결과는 다음과 같을 것이다.
  • solidtodo.conf파일은 없어도 됨, 무시하기

Screenshot 2024-12-14 at 22 28 14

Screenshot 2024-12-14 at 22 29 12

  • solidtodo.conf파일은 없어도 됨

Image

Image

✅ Configure nginx.conf

  • include link in nginx.conf
  • Include sites-enabled in nginx.conf
1
include /etc/nginx/sites-enabled/*;

Screenshot 2024-12-18 at 18 40 41

  • test configuration
1
sudo nginx -t
  • If ok, reload Nginx
1
sudo systemctl reload nginx

⚠️ private IP만 불러와지는 error

  • 내가 본 에러 메세지 Screenshot 2024-12-14 at 14 09 45

  • 이렇게 했을 때 Public IP가 나와야 하는데 나는 계속 private IP가 출력되었다.

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이 출력되어야 함
  • 성공 결과: A 밑에 public IP있음 Image
1
2
3
curl -I http://solidtodo.shop
## curl: (6) Could not resolve host: solidtodo.shop
## ❌ 200이 출력되어야 한다.
  • 성공 결과: 301로 HTTPS로 redirect되고 있는 모습 Image
1
2
nslookup solidtodo.shop
## public IP를 return해야 한다.
  • 성공 결과 Image

  • 만약 실패한다면 결론: Public IP를 불러오지 못하고 있다

✅ A record setting for domain

  • AWS에서 A record 세팅을 해준다. Screenshot 2024-12-18 at 18 52 17

Screenshot 2024-12-18 at 19 10 50

  • Route 53에서 설정 방법

Screenshot 2024-12-18 at 19 04 12

  • ❓ 저번에는 이런 에러가 뜨지 않았는데, 이번에는 뜬 이유를 고민해보자면
  • 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

Screenshot 2024-12-14 at 18 53 20

✅ Configure Nginx HTTPS

  • configure sites-available
  • Nginx가 대부분 해주지만, 조금 수정해야 하는 부분도 있으니 꼼꼼하게 보기
1
sudo vim /etc/nginx/sites-available/default

Screenshot 2024-12-18 at 18 39 30

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

  • swagger https://solidtodo.shop/swagger-ui/index.html Screenshot 2024-12-18 at 19 27 22

  • HTTPS https://solidtodo.shop/ Screenshot 2024-12-18 at 19 28 18

This post is licensed under CC BY 4.0 by the author.