-
Notifications
You must be signed in to change notification settings - Fork 7
개발 도메인과 배포 도메인
현재 프로젝트의 개발 도메인은 https://munetic.dev.42cadet.kr 이며 배포 도메인은 https://munetic.42cadet.kr 입니다.
둘 다 동일한 서버로 접속되는 문제가 있었으며 guthub cd로 배포를 할 때 develop과 main이 충돌하는 문제가 있었습니다.
nginx를 이용하면 같은 서버에 다른 도메인 네임으로 요청이 올 때 내부 네트워크에 다른 엔드포인트로 요청을 우회시킬 수 있습니다. 이 기능은 munetic 내부에서도 사용하고 있으며 여기서 다루는 것은 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 -V
V 옵션은 nginx의 버전과 설정 파일의 경로, 바이너리가 컴파일 될 때의 옵션 등을 출력해 줍니다.
--conf-path
뒤에 있는 것이 설정파일 경로입니다.
설정 파일을 보면 중간에 include /etc/nginx/conf.d/*.conf;
와 같은 항목이 있는데 이는 해당 경로에 있는 conf 파일을 끌어와 설정으로 사용하겠다는 의미입니다.
그러모로 설정파일을 변경하지 않고 해당 경로 설정파일을 추가하는 방법을 사용합니다.
개선 전 구동 환경은 다음과 같았습니다.
이런 형태로 구동되고 있었고, 두개의 서버가 동시에 구동되지 못하는 이유는 docker-compose.yaml 내부 이미지들의 port를 개방해두었기 때문에 로컬 서버의 포트를 두 서버가 동시에 사용하고자 하려고 하기 때문에 docker-compose 실행에 실패하는 문제가 있었습니다.
그래서 내부 이미지들의 port를 개방하지 않고 network-main.yaml 또는 network-develop.yaml을 이용해 필요한 포트만 노출하도록 설정을 바꿨습니다.
하지만 여기서 문제가 하나 더 있는데 외부에서 바라보는 도메인명은 다를지라도 실제 구동 서버는 하나의 서버에서 구동되기 때문에 443/80 포트를 공유할 수 없다는 문제가 있습니다. 그래서 두개의 서버를 동시에 구동하더라도 다음과 같이 접근해야 하는 문제가 있습니다.
dev 도메인에 접근을 할 때에는 도메인이 다르더라도 포트번호를 별도로 붙여야 정상적으로 접근이 됩니다. 이를 해결하기 위해 프록시 서버로서의 nginx를 사용하는 것입니다.
여기에 다소 중요한 문제가 있는데 두 서버 모두 SSL이 이미 적용되어 있다는 것입니다. nginx의 리버스 프록시는 SSL 연결 간에 대해서 바로 리버스 프록시를 통해 연결할 수 없으므로 다른 방식으로 문제를 해결해야 합니다.
제가 선택한 방식은 각 서버에서 SSL을 동작시키지 않게 하고, EC2 내의 nginx에서 SSL을 적용하는 방법을 선택하였습니다.
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/;
}
}
~