본문 바로가기
AWS

[AWS] NGINX로 하나의 도메인에 여러개의 앱 연결하기

by 워뇨옹2 2024. 9. 26.
728x90
반응형

개요

하나의 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개의 각기 다른 애플리케이션을 실행하고 있다.

다른 방법이 더 있는지는 모르겠지만, 현재 내 상황에서는 이 정도로 충분하고 문제없이 잘 작동하고 있어 꽤나 만족스럽다.

728x90
반응형

'AWS' 카테고리의 다른 글

[AWS] Go 프로젝트 무중단 배포하기(w/ pm2)  (4) 2024.09.26