-
NGINX - PROXY - 서브도메인 설정하기Dev 2022. 2. 16. 22:09
EC2의 잦은 이슈들로 IP가 변경(탄력적 IP 설정으로 지금은 고정됨)되거나, 포트를 정리하면서 포트가 변경되는 일들이 많았다. 이때마다 프론트에서 API 주소를 변경하는 일이 불필요하게 생겨 이참에 서브도메인을 적용하기로 함.
* https://hub.docker.com/r/jwilder/nginx-proxy
기존
- 현재 진행 했던 모든 프로젝트들에는 Nginx를 사용하고 있었다
- 클라이언트(ip:1234주소로 접근) -> Nginx(외부 포트(1234) 개방 O) -> Guicorn -> Flask
- 클라이언트(ip:1235주소로 접근) -> Nginx(외부 포트(1235) 개방 O) -> Express
- 이방식인데 앞에 서브도메인을 설정해주고 해석해서 프록시 해주는 Nginx를 하나 더 추가했다.
변경 이후
- 클라이언트(flask.domain.com) -> Nginx proxy(외부 포트 80 개방) -> Nginx(포트 개방x) -> Guicorn -> Flask
- 클라이언트(express.domain.com) -> Nginx proxy(외부 80 개방 위와 동일) -> Nginx(포트 개방x) -> Express
# ./nginx-proxy/docker-compose.yml version: '3' services: nginx-proxy: container_name: nginx-proxy image: jwilder/nginx-proxy ports: - "80:80" volumes: - /var/run/docker.sock:/tmp/docker.sock:ro - ./nginx/log:/var/log/nginx - ./nginx/conf.d:/etc/nginx/conf.d networks: default: external: name: nginx-proxy1. 위와 같이 작성한후 docker-compose up -d --build 를 하면 네트워크 nginx-proxy 를 생성하라고 한다. 그럼 네크워크를 생성해주고 다시 실행시킨다.
2. 간단한 예 - NGINX 디폴트 페이지 연결
# ./nginx-www/docker-compose.yml version: '3' services: nginx-www: image: nginx:latest environment: - VIRTUAL_HOST=www.mydomain.kr - 호스팅 서비스 사이트에서 도메인 설정 먼저 해야함 container_name: nginx-www networks: default: external: name: nginx-proxy3. 위와 같이 작성한 후 nginx-www(2번) nginx-proxy(1번)에서도 docker-compose up -d --build (+--force-recreate)해주주면
4. 1번에서 볼륨설정해준 nginx/conf.d/default.conf 아래부분에 아래와 같이 업데이트 된걸 볼 수 있다.
~~~~~~~~~~~ # www.mydomain.kr upstream www.mydomain.kr { ## Can be connected with "nginx-proxy" network # nginx-www (docker container name) server 172.20.0.16:80; } server { server_name www.mydomain.kr; listen 80 ; access_log /var/log/nginx/access.log vhost; location / { proxy_pass http:/www.mydomain.kr; } }5. Exress / Flask 앱 같은 경우에는 환경변수만 추가해주면 됨
# ./project/docker-compose.yml version: "3" services: flask: (또는 express) ~~ flask 설정 nginx: ~~ nginx 설정(이 nginx는 flask으로 프록시해줌) environment: - "VIRTUAL_HOST=${DOMAIN}" # ./project/.env 에 DOMAIN 변수 networks: default: external: name: nginx-proxy6. 마찬가지로 ./project/ 에서 docker-compose up 과 nginx-proxy도 다시 재실행시켜주면
# DOMAIN upstream DOMAIN { ## Can be connected with "nginx-proxy" network # [Project nginx container name] server 172.20.0.16:80; } server { server_name DOMAIN; 내가 호스팅에서 설정한 도메인 listen 80 ; access_log /var/log/nginx/access.log vhost; location / { proxy_pass http://DOMAIN; 위 upstream으로 프록시 } }위와 같이 업데이트 됨
리버스 프록시와 포워드 프록시
- 리버스 프록시(위와 같은 경우) : 클라이언트 -> 인터넷 -> 프록시 -> 서버
- 보안, 서버를 감출수 있다. 또는 로드밸런싱(upstream에서 여러개의 서버 설정해서 최소 연결/ 해시를 통한 같은 서버 연결)
- 포워드 프록시 : 클라이언트 -> 프록시 -> 인터넷 -> 서버
- 특정 사이트 접근 제한
- 동일한 요청의 경우 캐싱
- 서버측에 클라이언트 정보 숨길 수 있음
'Dev' 카테고리의 다른 글
테스트 코드 필요성과 종류 (0) 2022.03.05 CI/CD 지속적 통합/지속적 전달(제공),배포 + release<->deploy (0) 2022.03.05 Docker compose - .env 활용하기 (0) 2022.02.08 Github actions - Github pages / S3 / NodeJS Jest (0) 2022.02.05 Github actions - AWS ECR/Lambda 자동 배포 (0) 2022.02.03