ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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-proxy

     

    1. 위와 같이 작성한후 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-proxy

    3. 위와 같이 작성한 후 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-proxy

    6. 마찬가지로 ./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에서 여러개의 서버 설정해서 최소 연결/ 해시를 통한 같은 서버 연결)
    • 포워드 프록시 : 클라이언트 -> 프록시 -> 인터넷 -> 서버
      • 특정 사이트 접근 제한
      • 동일한 요청의 경우 캐싱
      • 서버측에 클라이언트 정보 숨길 수 있음
Designed by Tistory.