간단한 Nginx 웹 서버를 만드는 방법은 무엇입니까?

12212 단어

대상 고객



Nginx, Docker, Containers, Node.js에 대해 배우려는 사람들을 대상으로 이 기사를 작성했습니다.

학습 목표



이 문서를 완료하면 다음을 수행하는 방법을 알게 됩니다.
  • 간단한 node.js 응용 프로그램 만들기
  • nginx 구성 생성 및 설정
  • node.js 및 nginx용 도커 이미지 생성
  • 설정docker-compose.yml 구성
  • docker compose를 사용하여 전체 응용 프로그램 시작

  • Nginx는 무엇입니까?



    Nginx는 web server, reverse proxy, 메일 프록시 및 load balancer으로도 사용할 수 있는 HTTP cache입니다.

    이 기사에서는 nginx를 로드 밸런서로 사용합니다.

    부하 분산



    리버스 프록시 서버는 "교통 경찰"역할을 할 수 있습니다. 백엔드 서버 앞에 앉아 클라이언트 요청을 서버 그룹 전체에 걸쳐 속도와 용량 활용을 극대화하는 동시에 서버에 과부하가 걸리지 않도록 하는 방식으로 클라이언트 요청을 분산시켜 성능을 저하시킬 수 있습니다. . 서버가 다운되면 load balancer은 나머지 온라인 서버로 트래픽을 리디렉션합니다.

    아래에서 로드 밸런싱을 위한 nginx 구성의 예를 볼 수 있습니다.

    #ngnix.conf file
    http {
        upstream myapp1 {
            server srv1.example.com;
            server srv2.example.com;
            server srv3.example.com;
        }
    
        server {
            listen 80;
    
            location / {
                proxy_pass http://myapp1;
            }
        }
    }
    


    이 예에서는 요청을 처리하기 위해 포트 80을 수신합니다. 각 요청에 대해 nginx는 클라이언트를 srv1에서 srv3으로 라우팅합니다. 로드 밸런싱 방법이 특별히 구성되지 않은 경우 기본적으로 라운드 로빈으로 설정됩니다.

    다른 로드 밸런싱 방법을 확인할 수 있습니다here.

    도커



    Docker는 애플리케이션 배포를 위한 플랫폼입니다. 애플리케이션을 이미지로 분리하여 작동합니다. 이미지는 운영 체제 및 지원 소프트웨어가 포함된 컨테이너에서 실행됩니다. ( source )

    도커 컨테이너란 무엇입니까?



    ADocker container image는 코드, 런타임, 시스템 도구, 시스템 라이브러리 및 설정 등 응용 프로그램을 실행하는 데 필요한 모든 것을 포함하는 경량의 독립형 실행 가능 소프트웨어 패키지입니다.

    Docker를 사용하여 애플리케이션을 컨테이너화하면 다양한 환경에 대해 걱정할 필요가 없습니다. 따라서 애플리케이션이 로컬 머신에서 실행될 때 docker를 사용하여 컨테이너화하면 서버에서도 실행됩니다. 사용되는 라이브러리를 지정하기 때문에 로컬 환경과 서버 환경은 동일한 버전의 라이브러리와 운영 체제를 사용합니다.

    노드 애플리케이션용 Dockerfile의 예




    FROM node:12
    WORKDIR /home/node
    COPY . /home/node/
    RUN npm install
    CMD npm run app
    


    node.js에서 간단한 http 서버 만들기



    이 기사에서는 간단한 데모를 만들 것입니다. HTTP 라이브러리를 사용하여 HTTP 웹 서버를 생성합니다.

    다음은 node.js의 HTTP 웹 서버 구현입니다.

    const http = require("http");
    
    const defaultPort = 999;
    const portNumber = process.argv[2] || defaultPort;
    
    const httpServer = http.createServer((req, res) => {
      res.statusCode = 200;
      res.end("this is port: " + portNumber);
    });
    
    httpServer.listen(portNumber, "0.0.0.0", () => {
      console.log("listening on port ", portNumber);
    
      console.log(httpServer.address());
    });
    
    


    이 구현 후에는 포트가 다른 두 개의 웹 서버를 시작합니다. 아래에서 예제 명령줄을 볼 수 있습니다.

    node index.js 2222 #this will create a web server on port 2222
    node index.js 3333 #this will create a web server on port 3333
    


    두 개의 웹 서버를 시작한 후 웹 브라우저 또는 curl을 사용하여 테스트할 수 있습니다. curl을 사용하여 웹 서버에 요청할 수 있습니다. 아래 예에서 get 요청을 볼 수 있습니다.

    curl -v localhost:2222 #make a get request on localhost:2222
    


    응답:

    *   Trying ::1...
    * TCP_NODELAY set
    * Connection failed
    * connect to ::1 port 2222 failed: Connection refused
    *   Trying 127.0.0.1...
    * TCP_NODELAY set
    * Connected to localhost (127.0.0.1) port 2222 (#0)
    > GET / HTTP/1.1
    > Host: localhost:2222
    > User-Agent: curl/7.64.1
    > Accept: */*
    >
    < HTTP/1.1 200 OK
    < Date: Sat, 09 Jul 2022 15:15:47 GMT
    < Connection: keep-alive
    < Keep-Alive: timeout=5
    < Content-Length: 18
    <
    * Connection #0 to host localhost left intact
    this is port: 2222* Closing connection 0
    


    Nginx 구성



    이 데모에서는 nginx를 로드 밸런서로 사용하여 두 웹 서버 간에 라우팅합니다.

    구현은 다음과 같습니다.

    # nginx.conf file
    http
    {
      upstream all
      {
        server 192.168.1.36:3333;
        server 192.168.1.36:2222;
      }
    
      server
      {
        listen 8080;
        location /
        {
          proxy_pass http://all;
        }
      }
    }
    
    events
    {
    }
    


    도커파일:

    FROM nginx
    
    COPY nginx.conf /etc/nginx/nginx.conf
    


    Docker Compose에서 사용하려면 이 이미지를 빌드해야 합니다.build 명령을 사용하여 도커 이미지를 빌드할 수 있습니다. 다음은 예입니다.

    docker build -t nginxapp .
    


    nginx 이미지를 만든 후 dockore-compose 파일을 구성할 수 있습니다.

    다음은 docker-compose.yml에 대한 구현입니다.

    version: "3"
    
    services:
      nginxapp1:
        image: nginxapp
        ports:
          - "8080:8080"
    
    

    docker compose up를 사용하여 애플리케이션을 시작하고 docker compose down를 사용하여 컨테이너를 종료 및 제거할 수 있습니다.
    docker compose up를 사용하여 nginx 애플리케이션을 시작한 후. 터미널에서 예제 출력을 볼 수 있습니다.

    node-nginx-docker-tut-lb-1  | /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
    node-nginx-docker-tut-lb-1  | /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
    node-nginx-docker-tut-lb-1  | /docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
    node-nginx-docker-tut-lb-1  | 10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
    node-nginx-docker-tut-lb-1  | 10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
    node-nginx-docker-tut-lb-1  | /docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
    node-nginx-docker-tut-lb-1  | /docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
    node-nginx-docker-tut-lb-1  | /docker-entrypoint.sh: Configuration complete; ready for start up
    


    즉, nginx 서버를 시작했으므로 이제 curl을 사용하여 테스트할 수 있습니다.

    ❯ curl localhost:8080 
    this is port: 3333%
    ❯ curl localhost:8080
    this is port: 2222
    

    localhost:8080 각 요청이 라운드 로빈 알고리즘을 사용하여 다른 HTTP 웹 서버로 이동하는 경우 이 예제 출력에서 ​​볼 수 있습니다.

    좋은 웹페이지 즐겨찾기