개발 도메인과 배포 도메인 - innovationacademy-kr/slabs-munetic GitHub Wiki

현재 프로젝트의 개발 도메인은 https://munetic.dev.42cadet.kr 이며 배포 도메인은 https://munetic.42cadet.kr 입니다.

둘 다 동일한 서버로 접속되는 문제가 있었으며 guthub cd로 배포를 할 때 develop과 main이 충돌하는 문제가 있었습니다.

nginx의 reverse proxy server 기능 활용

nginx를 이용하면 같은 서버에 다른 도메인 네임으로 요청이 올 때 내부 네트워크에 다른 엔드포인트로 요청을 우회시킬 수 있습니다. 이 기능은 munetic 내부에서도 사용하고 있으며 여기서 다루는 것은 AWS EC2 서버에서 직접 구동되는 nginx의 설정에 관한 것입니다.

AWS EC2에 nginx 설치

EC2는 아마존 리눅스를 사용하며 CentOS 기반입니다. 패키지 매니저는 CentOS의 yum을 사용할 수 있지만 EC2는 amazon-linux-extras 라는 것을 사용할 수 있습니다.

이 툴을 이용해 도커나 nginx 등을 쉽게 설치할 수 있습니다.

$> amazon-linux-extras # nginx를 설치할 수 있는지, 이미 설치되어 있는지 확인
$> sudo amazon-linux-extras install -y nginx1 # nginx 설치
$> nginx -v # 설치 확인

nginx 설정 확인 및 변경

nginx가 참조하는 설정 파일의 경로는 다음 명령어로 찾을 수 있습니다.

$> nginx -V

V 옵션은 nginx의 버전과 설정 파일의 경로, 바이너리가 컴파일 될 때의 옵션 등을 출력해 줍니다.

--conf-path 뒤에 있는 것이 설정파일 경로입니다.

설정 파일을 보면 중간에 include /etc/nginx/conf.d/*.conf; 와 같은 항목이 있는데 이는 해당 경로에 있는 conf 파일을 끌어와 설정으로 사용하겠다는 의미입니다.

그러모로 설정파일을 변경하지 않고 해당 경로 설정파일을 추가하는 방법을 사용합니다.

개선 전 구동 환경

개선 전 구동 환경은 다음과 같았습니다.

1

이런 형태로 구동되고 있었고, 두개의 서버가 동시에 구동되지 못하는 이유는 docker-compose.yaml 내부 이미지들의 port를 개방해두었기 때문에 로컬 서버의 포트를 두 서버가 동시에 사용하고자 하려고 하기 때문에 docker-compose 실행에 실패하는 문제가 있었습니다.

그래서 내부 이미지들의 port를 개방하지 않고 network-main.yaml 또는 network-develop.yaml을 이용해 필요한 포트만 노출하도록 설정을 바꿨습니다.

하지만 여기서 문제가 하나 더 있는데 외부에서 바라보는 도메인명은 다를지라도 실제 구동 서버는 하나의 서버에서 구동되기 때문에 443/80 포트를 공유할 수 없다는 문제가 있습니다. 그래서 두개의 서버를 동시에 구동하더라도 다음과 같이 접근해야 하는 문제가 있습니다.

2

dev 도메인에 접근을 할 때에는 도메인이 다르더라도 포트번호를 별도로 붙여야 정상적으로 접근이 됩니다. 이를 해결하기 위해 프록시 서버로서의 nginx를 사용하는 것입니다.

여기에 다소 중요한 문제가 있는데 두 서버 모두 SSL이 이미 적용되어 있다는 것입니다. nginx의 리버스 프록시는 SSL 연결 간에 대해서 바로 리버스 프록시를 통해 연결할 수 없으므로 다른 방식으로 문제를 해결해야 합니다.

제가 선택한 방식은 각 서버에서 SSL을 동작시키지 않게 하고, EC2 내의 nginx에서 SSL을 적용하는 방법을 선택하였습니다.

3 drawio

EC2에 Nginx 프록시 서버를 이용해 외부의 서로 다른 도메인으로 요청이 오는 것을 서버 내부의 develop, main 서버로 연결합니다. 이 때 기존 develop, main에 SSL 설정이 되어 있었지만 도메인을 localhost로 설정하여 SSL 설정을 하지 않고 EC2 Nginx에서 하도록 변경하였습니다.

munetic 프로젝트는 기본적으로 설정된 도메인이 localhost가 아니라면 SSL을 적용합니다. 이는 munetic_proxy에서 적용합니다.

EC2 Nginx의 해당 설정들은 EC2 아래 경로에 추가하였습니다.

  • /etc/nginx/conf.d/main.conf
server {
    listen 80;
    server_name munetic.42cadet.kr;

    location / {
      proxy_pass https://munetic.42cadet.kr/;
    }
}

server {
  listen 443 ssl;
  server_name munetic.42cadet.kr;

  ssl_certificate /etc/letsencrypt/live/munetic.42cadet.kr/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/munetic.42cadet.kr/privkey.pem;

  include /etc/letsencrypt/options-ssl-nginx.conf;
  ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

  location / {
    proxy_pass http://127.0.0.1:8888/;
  }
}
  • /etc/nginx/conf.d/develop.conf
server {
    listen 80;
    server_name munetic.dev.42cadet.kr;

    location / {
      proxy_pass https://munetic.dev.42cadet.kr;
    }
}

server {
  listen 443 ssl;
  server_name munetic.dev.42cadet.kr;

  ssl_certificate /etc/letsencrypt/live/munetic.dev.42cadet.kr/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/munetic.dev.42cadet.kr/privkey.pem;

  include /etc/letsencrypt/options-ssl-nginx.conf;
  ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

  location / {
    proxy_pass http://127.0.0.1:8080/;
  }
}
~