들어가며
- HTTPS를 적용하기 위하여 많은 시도를 했다. 쉽지 않았다. linux 2, Nginx let's encrypt를 동시에 활용하여 적용한 글이 없었다. 비슷한 글이 있더라도 보안 등 다양한 이유로 설치 방법이 바뀌는 것으로 보였다. 많은 시간이 걸렸다. 여기저기 수많은 블로그를 보고 짜집기 하듯이 해결했다. 그리고 마침내.. HTTPS를 적용했다! 기쁘다!
- 사실 내가 셋 다 익숙하지 않아서 발생한 삽질? 일수도 있겠지만. 하지만 이런 삽질 과정 속에서 nginx와 https, 서버의 리다이렉트 방식에 대해 이해할 수 있었다. 나와 같은 초보가 있다면 도움이 조금이라도 되기를 바라는 마음에 글을 작성한다.
- 아직 공부할 것이 많아서 이 글이 완전하다 생각치 않는다. 그저 참고로 사용하기를 바란다! 그럼, Let's encrypt!
AWS에서 Nginx의 활용
- nginx는 다양한 기능이 있을 테지만, 현재의 조건에서는 입력된 포트를 다른 포트로 리다이렉트 하는 역할로 사용한다. listen -> location
/etc/nginx/nginx.conf
server {
listen 80;
listen [::]:80;
server_name doreview.ga
location /{
proxy_pass http://localhost:8080;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
}
- nginx 의 conf 파일이다. conf 파일을 보면 listen이 있다. doreview.ga:80(doreview.ga)로 접근할 경우 location으로 이동한다는 의미이다. location의 코드는 지역의 8080으로 이동하는 것이며, 현재 어플리케이션이 작동중인 포트이다.
Let's Encrypt의 설치 및 설정
- Let's Encrypt의 설치의 기본적인 도구는 certbot이다.내가 성공한 certbot 설치 과정은 아래와 같다. Certbot의 종속성에 필요로 한 EPEL7 저장소를 설치한 후 certbot을 설치한다.
cd /home/ec2-user
sudo wget -r --no-parent -A 'epel-release-*.rpm' http://dl.fedoraproject.org/pub/epel/7/x86_64/Packages/e/
sudo rpm -Uvh dl.fedoraproject.org/pub/epel/7/x86_64/Packages/e/epel-release-*.rpm
sudo yum-config-manager --enable epel*
sudo yum repolist
sudo yum install -y certbot
sudo yum install certbot-nginx
sudo service nginx stop
sudo certbot --nginx
참고 : https://flamingotiger.github.io/backend/devOps/aws-linux2-certbot-nginx/#lg=1&slide=2
- 여기서 nginx의 설치 과정에 문제가 발생했다. 설치 과정에서 domain을 요구할 때, doreview.ga을 입력해도 작업이 진행 되지 않았다. 그래서 아래의 코드를 대신하여 domain을 설정할 수 있었다.
sudo certbot --nginx -d doreview.ga
- 어떤 경우, certbot의 설치만으로도 nginx의 conf 설정을 자동으로 해준다고 한다. 나의 경우 그렇지 않았다. /etc/nginx/nginx.conf 을 아래와 같이 직접 수정했다.
nginx 설정 파일 수정
- nginx를 통해 포트의 흐름을 변경해야 한다. 우리가 해야할 것은 80포트를 433(https)으로 리다이렉트 해야하며, 433을 8080으로 리다이렉트 해야 한다.
- 먼저 80 -> 433을 해보자.
server {
listen 80;
listen [::]:80;
server_name doreview.ga
listen 443 ssl; # managed by Certbot
root /var/www/html;
# RSA certificate
ssl_certificate /etc/letsencrypt/live/doreview.ga/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/doreview.ga/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
if ($scheme != "https") {
return 301 https://$host$request_uri;
} # managed by Certbot
}
- 위의 코드에서 핵심은 $scheme != "https" 이다. https가 아니면 https로 리다이렉트 한다.
- 그 다음 과정은 433(https) -> 웹 어플리케이션(8080)이다. 그 코드는 아래와 같다.
# SSL configuration
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name doreview.ga
listen 443 ssl; # managed by Certbo
root /var/www/html;
ssl_certificate /etc/letsencrypt/live/doreview.ga/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/doreview.ga/privkey.pem;
# Required for LE certificate enrollment using certbot
include /etc/nginx/default.d/*.conf;
location /{
proxy_pass http://localhost:8080;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
}
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
}
나아가며
추가
갱신하기
- letsEncrypt의 경우 3개월마다 유효기간이 만료한다. 최근에 알람 메일이 왔고, 이번에 갱신했다. 아래의 명령어 한 번이면 끝난다!
- sudo certbot
- 기타 다양한 명령어는 꼭 공식문서를 보자. 블로그의 문서는 작동 안하는 경우가 많다ㅠ 그래서 삽질하다가 공식문서에서 해결했다.
- https://letsencrypt.org/
amazon linux extras에 epel 이 있어욥