nginx를 사용하여 컨테이너로 요청 라우팅

종종 대규모 애플리케이션 생태계에서 공통 nginx는 많은 애플리케이션에 대한 로드 밸런서 및 역 프록시로 사용됩니다. 이 시리즈에서 nginx를 사용하여 여러 컨테이너의 트래픽을 로드 밸런싱하는 방법을 살펴보았습니다.
이 게시물에서는 경로에 따라 요청을 다른 컨테이너로 라우팅하는 역 프록시로 nginx를 사용하는 방법을 살펴보겠습니다.

우리가 할 일


  • 경로/app-first 경로를 사용하여 익스프레스 응용 프로그램을 만들고 컨테이너에서 시작합니다
  • .
  • 경로app-second 경로를 사용하여 익스프레스 응용 프로그램을 만들고 컨테이너에서 시작합니다
  • .
  • nginx 컨테이너를 만들고 2개의 경로를 구성합니다. path-1은 요청을 첫 번째 컨테이너로 전달하고 path-2는 요청을 두 번째 컨테이너로 전달합니다
  • .

    디렉토리 생성



    mkdir first-app
    mkdir second-app
    mkdir nginx-docker
    

    첫 번째 애플리케이션 만들기



    방금 아주 기본적인 nodeJ 응용 프로그램을 만들었습니다. app.js는 다음과 같습니다.

    var express = require("express");
    var app = express();
    
    app.use(express.json());
    app.use(express.urlencoded({ extended: false }));
    
    app.get("/app-first", function (req, res, next) {
      res.send({ title: "Express", application: "Application 1" });
    });
    
    app.listen(3000, () => console.log("Running on http://localhost:3000"));
    


    package.json은 다음과 같습니다.

    {
      "name": "express-with-env",
      "version": "0.0.0",
      "private": true,
      "scripts": {
        "start": "node app.js"
      },
      "dependencies": {
        "express": "~4.16.1"
      }
    }
    


    이와 병행하여 Dockerfile은 다음과 같습니다.

    FROM node:12-slim
    WORKDIR /app
    COPY ./package*.json ./
    RUN npm install
    COPY ./ ./
    EXPOSE 3000
    
    # Run the code
    CMD [ "npm", "start" ]
    


    두 번째 애플리케이션 만들기



    두 번째 애플리케이션은 PORT 4000에서 실행되고 경로/app-second를 노출한다는 점을 제외하면 첫 번째 애플리케이션과 똑같습니다. app.js는 다음과 같습니다.

    var express = require("express");
    var app = express();
    
    app.use(express.json());
    app.use(express.urlencoded({ extended: false }));
    
    app.get("/app-second", function (req, res, next) {
      res.send({ title: "Express", application: "Application 2" });
    });
    app.listen(4000, () => console.log("Running on http://localhost:4000"));
    


    Dockerfile은 다음과 같습니다.

    FROM node:12-slim
    WORKDIR /app
    COPY ./package*.json ./
    RUN npm install
    COPY ./ ./
    EXPOSE 4000
    
    # Run the code
    CMD [ "npm", "start" ]
    


    packageJSON은 첫 번째 애플리케이션과 정확히 같습니다.

    nginx 설정 생성



    nginx-docker 디렉토리로 이동하여 nginx.conf 파일을 생성합니다.

    upstream first-app {
        server 172.17.0.1:3000 weight=1;
    }
    
    upstream second-app {
        server 172.17.0.1:4000 weight=1;
    }
    
    server {
    
      location /app-first {
        proxy_set_header X-Forwarded-Host $host:$server_port;
        proxy_set_header X-Forwarded-Server $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass http://first-app;
      }
    
      location /app-second {
        proxy_set_header X-Forwarded-Host $host:$server_port;
        proxy_set_header X-Forwarded-Server $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass http://second-app;
      }
    
    }
    


    nginx용 dockerfile을 생성하면 다음과 같습니다.

    FROM nginx
    RUN rm /etc/nginx/conf.d/default.conf
    COPY nginx.conf /etc/nginx/conf.d/default.conf
    


    이미지 생성 및 컨테이너 실행


    first-app 디렉토리로 이동하여 이미지를 빌드합니다.

    sudo docker build -t first-app .
    


    두 번째 앱 디렉토리로 이동하여 이미지를 빌드합니다.

    sudo docker build -t second-app .
    


    지금 이미지 실행

    sudo docker run -p 3000:3000 -d first-app
    sudo docker run -p 4000:4000 -d second-app
    


    이제 브라우저에서 http://localhost:3000/app-first을 열면 다음 JSON이 표시됩니다.

    {
    "title": "Express",
    "application": "Application 1"
    }
    


    http://localhost:4000/app-second을 열면 다음을 얻을 수 있습니다.

    {
    "title": "Express",
    "application": "Application 2"
    }
    


    응용 프로그램이 다른 포트에서 실행되고 있습니다. 목표는 동일한 포트에서 둘 다 노출하는 것입니다.

    nginx-docker 디렉토리로 이동하여 nginx 이미지를 빌드하고 실행합니다.

    sudo docker build -t nginx-proxy .
    sudo docker run -p 8000:80 -d nginx-proxy
    


    이제 다음과 같이 포트 8000에서 실행되는 두 응용 프로그램을 모두 볼 수 있습니다.
  • http://localhost:8000/app-second
  • http://localhost:8000/app-first

  • 추신:
    여기에 2개의 애플리케이션(첫 번째 앱과 두 번째 앱)에 대한 코드를 작성하고 세 번째(nginx)에 대한 구성을 작성했습니다. 우리는 그들의 도커 이미지를 만들고 그 이미지를 실행했습니다. 물론 이것들은 처리하기에는 너무 많은 명령입니다. , 우리는 이러한 이미지 구축 및 실행을 단순화하기 위해 docker-compose를 살펴볼 것입니다.
    이 자습서의 코드는 https://github.com/tirthaguha/container-reverse-proxy에서 체크인됩니다.

    좋은 웹페이지 즐겨찾기