힐링 휴식 그리고 개발

한개의 EC2 인스턴스와 도메인으로 여러 개의 웹서비스를 하기 위한 프록시 설정 가이드 - 까먹는 개발자 본문

개발관련/AWS

한개의 EC2 인스턴스와 도메인으로 여러 개의 웹서비스를 하기 위한 프록시 설정 가이드 - 까먹는 개발자

하루정도 2024. 9. 4. 18:04

하나의 인스턴스에서 다수의 웹서비스 및 API 서버를 나누어 운영하고 싶을 때 EC2 인스턴스의 프록시 설정 방법에 대해서 설명합니다.

 

https://aws.amazon.com/ko/

 

클라우드 서비스 | 클라우드 컴퓨팅 솔루션| Amazon Web Services

필요한 만큼 이용할 수 있는 것은 물론 필요에 따라 몇 분 만에 확장 또는 축소할 수 있습니다. 자세히 알아보세요.

aws.amazon.com

 

기본적으로 AWS EC2와 Node.js Express 프로젝트가 준비된 상황에서 이 글을 참고해주시면 감사하겠습니다.

 

[그림 1-1]

 

 

 

AWS EC2는 [그림 1-1]대로 생성한 후, 아래의 명령어를 통해 환경을 세팅해줬습니다.

sudo apt-get update

sudo apt-get install nodejs

sudo apt-get install npm

 

 

이후 프로젝트를 생성합니다(프로젝트의 경로는 임의로 하셔도 무방합니다). 

sudo su

npm install express-generator -g

express --view=ejs multi-proxy

express --view=ejs multi-proxy-sub

 

 

 

생성한 multi-proxy, multi-proxy-sub 프로젝트가 동작하는 지 확인하기 위해 [그림 1-2]와 같이 인바운드를 설정합니다.

[그림 1-2]

 

 

 

인스턴스의 아이피와 포트를 브라우저의 주소창에 입력하여 Express 웹서버의 동작 확인.

[그림 1-3]

 

 

인스턴스 접속 및 기본 설정을 해보지 않은 분은 https://ookm1020.tistory.com/4 글을 보시면 보다 상세한 설명을 보실 수 있습니다.

 

 

두 개의 프로젝트를 우선 동작시켜놔야 하기 때문에 PM2를 설치하겠습니다.

sudo npm install pm2 -g

pm2 start ./bin/www --watch

 

 

 

이제 생성한 각 프로젝트의 폴더로 이동하여 pm2 start 명령어를 통해 실행해줍니다. --watch 옵션은 코드가 변경되었을 때 자동적으로 서버를 재시작 해주는 옵션이니 참고바랍니다.

 

 

 또한 Express 프로젝트의 기본 포트는 3000으로 되어 있기 때문에 제가 생성한 multi-proxy-sub의 www파일을 편집기를 통해 수정해야 합니다. 아래의 [그림 1-4]처럼 3001번 포트로 열리도록 코드를 수정해주었습니다.

 

[그림 1-4]

 

 

수정을 하셨다면 이제 pm2로 두개의 프로젝트를 실행하겠습니다. 각 프로젝트의 폴더로 이동하여 명령어를 입력합니다.

cd multi-proxy

pm2 start ./bin/www --watch

cd multi-proxy-sub

pm2 start ./bin/www --watch

 

 

 

아래의 명령어를 통해 [그림 1-5]와 같이 정상적으로 동작되고 있는지 확인할 수 있습니다.

pm2 list

[그림 1-5]

 

 

 

이제 브라우저의 주소창에 아이피+3000포트와 3001번 포트를 입력했을 때 두 개의 웹서버가 동작되는 것을 확인합니다. Express 옆의 프로젝트 명은 구분하기 쉽게 하기 위해 views/index.ejs에 임의로 텍스트를 추가했습니다.

[그림 1-6]

 

 

 

 

이제 도메인에 EC2를 연결합니다. 아래의 [그림 1-7]은 고대디 DNS 설정이며, @는 원래 도메인을 가리키고 sub는 서브도메인으로 지정한 것을 확인할 수 있습니다. 도메인의 정확한 연결에는 일정 시간이 필요할 수도 있으니 바로 안된다고 해도 최대 1일에는 정상적으로 동작하니 참고하여 주시기 바랍니다.

 

도메인이 제대로 연결되었는지 확인하기 위해 브라우저를 통해 확인합니다. 기존에 아이피+포트로 입력했던 것 대신 도메인+포트를 통해 확인하시면 됩니다.

 

 

개인이 사용할 것이라면 도메인+포트 형식으로 입력하면 문제가 없지만, 다수가 사용할 상황이라면 도메인만 입력했을 경우 원하는 서비스가 로드되는 것이 좋기 때문에 도메인 이름에 따라 라우팅되도록 nginx 프록시를 설정하도록 하겠습니다.

 

우선 nginx를 설치합니다.

sudo apt-get install nginx

 

 

설치가 완료되었다면 /etc/nginx/sites-enabled/default를 수정해주어야 합니다. 편하신 편집기를 통해 진행하시면 됩니다.

server {
    listen 80;
    server_name forget-developer.com;

    location / {
        proxy_pass http://172.31.5.123:3000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

server {
    listen 80;
    server_name sub.forget-developer.com;

    location / {
        proxy_pass http://172.31.5.123:3001;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

 

 

위의 내용을 추가하고 nginx를 재시작 합니다.

sudo service nginx restart

 

 

이제 브라우저를 통해 확인하시면 해당 도메인 별로 각각의 서비스가 동작하는 것을 확인 할 수 있습니다.

 

 

만약 https연결을 하고 싶을 때는 아래의 예제를 통해 진행할 수 있습니다.

server {
    listen 443 ssl;
    server_name forget-developer.com;

    ssl_certificate /etc/ssl-keys/발급받으신 .crt파일;
    ssl_certificate_key /etc/ssl-keys/발급받으신 .key파일;
    ssl_protocols TLSv1.1 TLSv1.2;

    location / {
        proxy_pass http://172.31.5.123:3000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

server {
    listen 443 ssl;
    server_name sub.forget-developer.com;

    ssl_certificate /etc/ssl-keys/발급받으신 .crt파일;
    ssl_certificate_key /etc/ssl-keys/발급받으신 .key파일;
    ssl_protocols TLSv1.1 TLSv1.2;

    location / {
        proxy_pass http://172.31.5.123:3001;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

server {
    listen 80;
    server_name forget-developer.com sub.forget-developer.com;

    location / {
        return 301 https://$host$request_uri;
    }
}

 

 

#마치며

 

제 글이 도움이 되었기를 바라며 문제가 있거나 궁금한 점이 있으신 분들은 언제든지 질문해주세요. 읽어주셔서 감사합니다 :)

Comments