개요
하나의 EC2 인스턴스에서 여러개의 앱을 실행할 일이 생겼다. 이 때 생각해볼 수 있는 것으로는 도메인을 앱의 개수만큼 구매해서 연결하는 방법, 도메인 하나로 모든 앱을 연결하는 방법 이렇게 두가지 정도가 있었다.
도메인을 구매하면 장점은 명확한 도메인으로 내 프론트 앱에서 endPoint를 명확히 구분할 수 있다는 것이다.
근데 생각해보면, 장점이 이거 말고는 없다.(얄팍한 백엔드 인프라 지식으로 봤을때는)
게다가 도메인 하나에 돈이 얼마나 드는가. goDaddy사용하면 특가 도메인들이 많긴하지만 알아보기 어려운 도메인 주소가 많아 실제 사용하기는 어려울 것 같다.
그래서 기존 도메인은 그대로 두고 path를 nginx에서 파싱해서 알맞는 포트로 연결해주는 방법을 선택하게 되었다.
nginx
nginx에 관한것은 다음에 한 번 포스팅해보도록 하겠다. 지금은 nginx의 기본설정 및 https 연결이 돼있다는 것을 가정하고 진행해보도록 하자.
다음은 내 nginx/sites-available/default 파일의 코드이다.
server {
listen 443 ssl;
server_name 내 도메인;
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
location / { #메인으로 사용할 도메인
proxy_pass http://localhost:3030;
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;
}
location /other_service { # 8000번 포트를 사용할 서비스
rewrite ^/other_service(/.*)?$ $1 break;
proxy_pass http://localhost:8000/;
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;
}
location /other_service2 { #8090번 포트를 사용할 서비스
rewrite ^/other_service2(/.*)?$ $1 break;
proxy_pass http://localhost:8090/;
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 = 내 도메인) {
return 301 https://$host$request_uri;
} # managed by Certbot
listen 80;
server_name 내 도메인;
return 403;
}
다른 부분들은 https를 위해서 ssl설정을 해둔거라 크게 볼 필요는 없고, location 부분을 보면 된다.
주석을 달아 놓았듯이, /가 기본 주소로 3000번 포트에서 실행중인 애플리케이션을 호출한다.
그러면 다음 엔드포인트로 연결이 가능하다.
https://my.domain.com/some/path
이 엔드포인트를 호출하면 3000번 포트에서 실행중인 애플리케이션의 /some/path에 해당하는 api를 호출하고 결과를 반환받는다.
그러면 다음 엔드포인트는 어떻게 동작할까?
https://my.domain.com/other_service/some/path
nginx 코드에서 확인했듯 8000번 포트에서 동작중인 애플리케이션의 /some/path에 해당하는 api를 호출하게 된다.
so does for other_service2
그리고 또 중요한 부분이 아래 있는 코드이다.
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;
이건 공통적으로 헤더를 설정해주는 파트인데 사실 잘 모르겠다. 작성하지 않아도 nginx는 문제없이 작동한다.
rewrite ^/other_service2(/.*)?$ $1 break;
이 부분이 중요한데, 현재 프록시에서 /other_service2라는 문자를 지우고 host, 즉 https://my.domain.com/other_service2/some/path 가 아니라, https://my.domain.com/some/path 를 애플리케이션에 넘겨준다. 이 과정이 없으면 애플리케이션에서 /other_service2 path를 한 번더 라우팅 해줘야하기 때문에 그걸 nginx에서 처리하고 애플리케이션은 본래의 역할만 하도록 설정해주는 것이다.
결론
이렇게 해서 본인은 하나의 ec2 인스턴스와 하나의 도메인으로 총 3개의 각기 다른 애플리케이션을 실행하고 있다.
다른 방법이 더 있는지는 모르겠지만, 현재 내 상황에서는 이 정도로 충분하고 문제없이 잘 작동하고 있어 꽤나 만족스럽다.
'AWS' 카테고리의 다른 글
| [AWS] Go 프로젝트 무중단 배포하기(w/ pm2) (4) | 2024.09.26 |
|---|