프로젝트를 진행하던 중 클라이언트가 http로 요청하는 경우 이를 https로 변환하여 전달 할 필요가 있어 방법을 찾던 중 Nginx를 이용하여 문제를 해결해보았다.
다음 블로그를 참고해서 작업하였다.
https://yeonyeon.tistory.com/253
여기서 Nginx의 Public IP를 morandi.co.kr에 맞춰서 도메인을 설정하였다. (Route 53 이용)
그런 다음 vi /etc/nginx/sites-available/morandi.co.kr 로 설정 파일을 생성한 후 다음과 같이 작성하였다.
server {
server_name morandi.co.kr;
access_log /var/log/nginx/access-log/morandi.log;
error_log /var/log/nginx/error-log/morandi.log;
location / {
proxy_pass http://3.35.135.90; // morandi-client (프론트 서버 public IP)
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;
}
}
여기서 access_log, error_log 주소에는 따로 mkdir로 생성해줘야 한다.
블로그의 심볼릭 링크까지 생성한 후에는 sudo nginx -t와 sudo service nginx restart 까지 처리하였다.
그 후에 다시 파일을 열어보면,
server { // Part 1
server_name morandi.co.kr;
access_log /var/log/nginx/access-log/morandi.log;
error_log /var/log/nginx/error-log/morandi.log;
location / {
proxy_pass http://3.35.135.90;
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;
}
listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/morandi.co.kr/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/morandi.co.kr/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 { // Part 2
if ($host = morandi.co.kr) {
return 301 https://$host$request_uri;
} # managed by Certbot
server_name morandi.co.kr;
listen 80;
return 404; # managed by Certbot
}
다음과 같이 내용이 추가되었음을 알 수 있다.
Part 2의 서버 블록은 Http(80) 요청을 Https로 리다이렉션하는 역할을 한다.
즉, http://morandi.co.kr 로 요청이 들어오면 301 리다이렉션을 통해 https로 리다이렉션을 한다.
Part 1 서버 블록은 morandi.co.kr에 대한 https 요청을 처리한다.
즉 Part 2에서 리다이렉션 되어 https://morandi.co.kr로 오게 되면 여기서 작업을 처리하게 되는 것이다.
여기서 모든 요청은 proxy_pass 지시문을 사용하여 http://3.35.135.90 으로 전달된다.
이때, https://morandi.co.kr/dashboard로 요청하더라도 nginx가 적용되어
http://3.35.135.90/dashboard 가 호출되는 것과 같다.
백엔드 서버 역시 마찬가지로 처리했다.
server {
server_name api.morandi.co.kr;
access_log /var/log/nginx/access-log/morandi.log;
error_log /var/log/nginx/error-log/morandi.log;
location / {
proxy_pass http://3.38.149.217: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;
}
listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/api.morandi.co.kr/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/api.morandi.co.kr/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 = api.morandi.co.kr) {
return 301 https://$host$request_uri;
} # managed by Certbot
server_name api.morandi.co.kr;
listen 80;
return 404; # managed by Certbot
}
http://api.morandi.co.kr/swagger-ui/?urls.primaryName=test-api#/ 다음과 같이 Swagger를 접속해도 https가 적용되어 접근이 가능해졌다.