AWS EC2 환경에서 Nginx를 통해 요청/응답이 가능한 웹 서비스를 배포하려 한다. 서비스를 배포시에 데이터를 보호하기 위해 https로 이루어져야 하는데 이때 SSL 인증서가 필요하다. 해당 과정에 대해서 진행한 내역을 기술하였다.
< 배포환경 >
AWS EC2 Ubuntu 20.04
엔진엑스 Nginx
Certbot이란?
https 웹 서비스를 제공하기 위해서는 SSL 인증서를 발급받아 적용해야한다. HTTPS 확산의 일환으로 Let's Encrypt SSL 인증서를 무료로 제공하는 certbot 라이브러리가 존재한다.
◾ SSL/TLS는 응용계층과 전송계층 사이에서 보안 채널을 형성해주는 역할하는 보안용 프로토콜이다. 사용자들의 민감 정보를 통신시에 매번 암호화하는 것이 번거롭기에 주로 SSL/TLS를 사용한다.
Nginx 설치
# 운영체제에서 사용 가능한 패키지들과 그 버전에 대한 정보(리스트) 업데이트
$ sudo apt-get update
# nginx 설치하기
$ sudo apt install nginx -y
# 설치한 nginx 버전 확인
$ nginx -v
# nginx running 상태 확인
$ sudo service nginx status
# nginx 실행
$ sudo service nginx start

< Let's Encrypt SSL 인증서 발급 방법 >
- Standalone
- 사이트 작동을 멈추고 이 사이트의 네크워킹을 이용해 사이트 유효성을 확인해 Let’s Encrypt SSL 인증서를 발급하는 방식
- 80 포트로 가상 standalone 웹서버를 띄워 인증서를 발급
- 장점 : 동시에 여러 도메인을 발급받을 수 있음
- 단점 : 발급 전에 Nginx를 중단하고 발급 완료 후 다시 Nginx를 시작해야 함
Let's Encrypt 의 인증 방식인 Standalone plugin 은 서버 인증을 위해서 80 포트를 이용한다. 따라서 nginx, apache 와 같이 80 포트를 이용하는 서비스가 있다면 서버를 일시적으로 정지시켜줘야 한다. 정지하지 않으면 오류가 발생한다.
# nginx 서버 정지
$ sudo service nginx stop
# nginx 서버 정지 확인
$ netstat -na | grep '80.*LISTEN'
추가적으로 ssl 인증서 발급 중 에러가 발생했었는데, 방화벽이 활성화 되어 있어서 80 port를 open해준 후에는 정상적으로 ssl 인증서가 발급되었다.
# 방화벽 포트 설정
$ ufw allow 80
# Let's Encrypt 설치
$ sudo apt-get install letsencrypt
# 인증서 적용 및 .pem 키 발급
$ sudo letsencrypt certonly --standalone -d [도메인]
# 설치한 인증서 확인 및 위치 확인
$ sudo certbot certificates
# LetsEncrypt 인증서 삭제
$ certbot delete
Nginx 설정 파일 작성
< Nginx의 기본 폴더, 파일 >
📝 /ets/nginx/nginx.conf
Nginx에 관련한 메인설정파일로 Nginx 설정에 관한 블록들이 작성되어 있다. 이 파일에서 sites-enabled 폴더에 있는 파일들을 include하여 파일들을 가져온다.
📁 /ets/nginx/sites-available
가상 서버 환경들에 대한 설정 파일들이 위치하는 디렉토리이다. 실제 가상 서버가 돌던 안 돌던 가상 서버와 관련된 설정 파일들은 여기에 놓도록 한다.
📁 /ets/nginx/sites-enabled
sites-available에 있는 가상 서버 파일들중에서 실행시키고 싶은 파일을 symbolic link로 연결한 폴더이다. 이 폴더에 위치한 가상서버 환경 파일들을 읽어서 실제 서버를 세팅한다.
🌼 Nginx 구성 파일 작성
$ cd /etc/nginx/sites-available
$ sudo vim [파일명].conf
SSL 인증서를 발급 받은 후, "/etc/nginx/sites-available"로 이동 후, 적절한 이름의 파일을 생성하여 아래와 같이 작성한다.
server {
location /{
proxy_pass http://localhost:3000;
}
location /api {
proxy_pass http://localhost:8081/api;
}
listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/[도메인]/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/[도메인]/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
}
server {
if ($host = [도메인]) {
return 301 https://$host$request_uri;
} # managed by Certbot
listen 80;
server_name [도메인];
return 404; # managed by Certbot
}
위의 파일을 작성 후 아래의 작업을 수행한다.
◾ 심볼릭 링크 (symbolic link) : 링크를 연결해 원본 파일을 직접 사용하는 것과 같은 효과를 내는 링크
- 특정 폴더에 링크를 걸어 원본파일을 사용하기 위해 사용
# 파일 연동
$ sudo ln -s /etc/nginx/sites-available/[파일명].conf /etc/nginx/sites-enabled/[파일명].conf
# 다음 명령어에서 successful이 뜨면 nginx를 실행할 수 있다.
$ sudo nginx -t
# nginx 재시작
$ sudo systemctl restart nginx
# nginx 상태 확인
$ sudo systemctl status nginx
'Infra' 카테고리의 다른 글
[Hadoop Error] failed on connection exception: java.net.ConnectException: Connection refused; 오류 해결 (0) | 2023.02.22 |
---|---|
[Hadoop] VMware 설치, Ubuntu 가상머신 생성, 하둡 설치 (0) | 2023.02.22 |
[CI/CD] Jenkins 프로젝트 설정 (0) | 2023.02.20 |