이번에 사이드 프로젝트로 앱을 출시하게 되었다.
그런데 생각해보니 HTTPS 적용을 해주지 않았던거 같아 이번에 적용했던 과정을 글로 쓰게 되었다.
HTTPS 인증서를 적용하려면 WS(Web Server)가 필요하다. Nginx, Apache등 여러개가 있지만 서버의 사양이 좋지 않기 때문에 Nginx를 설치하였다.
그 이유는 다음과 같다.
Apache의 단점으로 커넥션 형성 구조가 연결당 1개의 프로세스를 할당하여 커넥션이 증가할수록 메모리와 리소스가 부족해지는 현상이 발생하며, CPU 코어가 별도의 과정을 통해 부하를 얻는 상황이 발생한다. Nginx는 태생적으로 Apache의 C10K 문제점을 해결하기 위해 탄생하였다. 비동기적으로 연결을 진행하며 동시 커넥션의 부하를 분산시킬 수 있다.
따라서 Nginx를 적용하게 되었다.(Turnserver 적용할때 Nginx가 더 쉬웠어서 적용한 이유도 있음.)
# 업데이트
apt-get update
# 설치
apt install nginx -y
# 상태 확인
systemctl status nginx
위와 같은 과정을 거치면 nginx 설치가 완료된다. 간혹 오류가 발생하는데 그럴 경우 에러 로그를 분석한다음 구글링을 하면 된다.
systemctl start nginx.service
cat /var/log/nginx/error.log
둘 중 하나를 사용해서 로그를 분석하자!
nginx 설치를 완료 했다면 이제 HTTPS 적용을 해야한다. SSL 적용전 우선 리버스 프록시를 설정해주자.
리버스 프록시란 특정 포트로 클라이언트가 요청시 실제 서버의 특정 포트로 연결을 돌려주는 기능이다.
우리는 http에 ssl을 적용할것이고 http port로 오는 요청을 실제 서버의 포트로 매핑시켜줄것이므로 리버스 프록시 설정을 해줘야한다.
우선 프록시 로그를 따로 관리해주기 위해 폴더를 하나 생성해줬다.
mkdir /var/log/nginx/proxy/
프록시 설정을 해주기 위해 값을 세팅해주자
vi /etc/nginx/proxy_params
아래 내용을 복사해서 저장해주자
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;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-NginX-Proxy true;
client_max_body_size 256M;
client_body_buffer_size 1m;
proxy_buffering on;
proxy_buffers 256 16k;
proxy_buffer_size 128k;
proxy_busy_buffers_size 256k;
proxy_temp_file_write_size 256k;
proxy_max_temp_file_size 1024m;
proxy_connect_timeout 300;
proxy_send_timeout 300;
proxy_read_timeout 300;
proxy_intercept_errors on;
이제 본인이 가지고 있는 도메인 정보를 등록해줘야 한다.
vi /etc/nginx/sites-available/${domain_name}
아래 내용을 작성해서 저장해주자
server { # server 블록
listen 80;
server_name ${domain_name} www.${domain_name};
access_log /var/log/nginx/proxy/access.log;
error_log /var/log/nginx/proxy/error.log;
location / { # location 블록
include /etc/nginx/proxy_params;
proxy_pass http://${public_ip}:${port}; # reverse proxy의 기능
}
}
proxy_pass에 본인이 소유한 서버의 실제 ip와 port를 기재해주면 된다.
그리고 마지막으로 nginx 설정 파일에서 주석 제거가 필요하다.
sudo vi /etc/nginx/nginx.conf
내리다 보면 다음 문구가 주석처리된 상태로 있을텐데 주석을 제거해주자.
server_names hash_bucke_size 64;
이제 새로 생성한 설정 파일을 활성화 시켜야 한다. 그전에 기존 연결 파일을 제거해주자
# remove
rm /etc/nginx/sites-available/default
rm /etc/nginx/sites-enabled/default
# new setting
ln -s /etc/nginx/sites-available/${domain_name} /etc/nginx/sites-enabled/
그리고 나서 nginx 구성이 잘 작동하는지 테스트후 재실행 해주자.
nginx -t
service nginx reload
리버스 프록시 설정은 위 과정을 거치면 끝났다.
이제 SSL 적용이 필요하다. 유료 인증서도 있지만 간단한 앱 출시(개인정보 이메일만 받음)의 API 서버 역할을 하기 때문에 무료 인증서로 유명한 Let's Encrypt 인증서를 사용하기로 했다.
다음 명령어를 통해 패키지를 설치해주자.
#스냅 패키지 설치
snap install core
snap refresh core
#certbot 패키지 설치
snap install --classic certbot
설치가 끝나면 다음 명령어를 통해 인증서를 발급 받을 수 있다.
certbot --nginx -d ${domain_name}
그리고 무료 인증서의 경우 유효기간이 90일 이기 때문에 자동 발급 기능을 활성화 해주자.
ertbot renew --dry-run
실제 결과는 다음과 같다.
또한 SSL 활성화 테스트는 다음 주소에서 가능하다.
https://www.ssllabs.com/ssltest/index.html