ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Nginx HTTP Upstream 알아보기
    Nginx 2023. 9. 16. 20:56
    728x90
    반응형

    - 목차

     
     

    관련된 글

    https://westlife0615.tistory.com/341

     

    Nginx 구조 알아보기

    - 목차 관련된 글 https://westlife0615.tistory.com/45 TCP Socket 알아보기 - 목차 소개. TPC 소켓에 대해서 가볍게 알아보는 시간을 가지려고 합니다. 소켓은 TPC 소켓과 같은 네트워크 통신 뿐만 아니라 IPC (In

    westlife0615.tistory.com

     

     

    Upstream 이란 ?

    데이터의 흐름을 스트림이라고 부르기도 합니다.
    실제 스트림의 사전적 의미는 흐르는 강물을 뜻하는데요.
    데이터의 흐름이 마치 흐르는 강물과 같다고 하여 데이터 스트림이라고 불립니다.
    Nginx 은 Reverce Proxy 로써 클라이언트와 어플리케이션 서버 사이에 위치하게 되는데요.
    그래서 Nginx 는 거대한 강줄기의 중간에 위치한 강의 한 부분으로 볼 수도 있습니다.
     

    일반적으로 Nginx 는 아래와 같은 구조로 적용되곤합니다.

     

    <Nginx 적용 예시>

     

    전류는 전압이 높은 곳에서 낮을 곳으로 흐릅니다.

    물 또한 수압이 높은 곳에서 낮은 곳으로 흐릅니다.

    이러한 관점에서 데이터가 많은 곳에서 데이터가 필요한 곳으로 흐른다고 할 때,

    데이터베이스나 파일 스토리지를 데이터 밀집도가 높은 영역이라고 할 수 있습니다.

    그리고 클라이언트는 데이터가 부족하여 필요로하는 영익이죠.

    따라서 데이터베이스 -> 클라이언트를 Downstream.

    클라이언트에서 데이터베이스로의 데이터를 찾기 위한 방향을 Upstream 이라고 볼 수 있습니다.

     

    Nginx 는 Reverse Proxy 로써 서버에서 클라이언트의 요청을 전달하므로
    Nginx 는 어플리케이션 서버보다 낮은 위치에 자리하고, 어플리케이션 서버는 Nginx 보다 높은 위치에 자리하게 됩니다.
     

    또한 Nginx 는 여러 Api Server 들에게 부하 분산 (Load Balancing) 을 할 수 있습니다.

    이어지는 내용에서 부하 분산 (Load Balancing) 에 대해서도 자세히 알아보겠습니다.


     

    HTTP Upstream 이란 ?

     

    Nginx 의 Reverse Proxy 는 3가지 네트워크 프로토콜에서 동작합니다.
    3가지 프로토콜은 각각 HTTP, TCP, UDP 인데요.
    이번 글에서는 HTTP 프로토콜에서의 Reverse Proxy 에 대해서 알아보고자 합니다.
    이는 다른 표현으로 HTTP Upstream 이라고도 합니다.
     
    HTTP 프로토콜은 OSI 4 계층인 TCP & UDP 와 다르게 OSI 7 계층인 Application Layer 의 프로토콜입니다.
    따라서 4계층 정보인 IP 주소와 3계층 정보인 포트 정보 뿐만 아니라 그 이상의 정보를 다루고 기능을 수행합니다.
     
    예를 들어,

    7계층 (Application Layer) 정보인 HTTP url Path 를 기반으로 라우팅을 적용할 수 있습니다.

    /v1/login 인 경우에는 버전 1 API 를 다루는 서버로 라우팅할 수 있고,

    /v2/login 인 경우에는 버전 2 API 를 다루는 서버로 라우팅할 수 있습니다.

     

    6계층 (Presentation Layer) 단계의 압축과 관련된 작업을 진행할 수도 있습니다.

    ( 압축되지 않는 상태의 HTTP 요청을 새롭게 압축하는 등의 작업을 의미함.)

    그 외 HTTPS 보안을 입히는 작업도 수행할 수 있습니다.

     

    Sticky Session 또는 Hashing 기반의 Redirect 를 통해서 Session Layer 의 역할 또한 수행할 수 있죠.

     

    예시.

     

    Reverse Proxy 구현하기.

    아래 코드는 nginx.conf 의 설정 파일입니다.

    해당 내용의 파일은 /tmp/nginx/nginx.conf 위치에 생성합니다.

    파일의 저장 위치는 어디든 상관없지만 저는 맥을 쓰고 /tmp 폴더가 자동으로 파일을 삭제해주기 때문에

    간단한 테스트를 할떄는 tmp 디렉토리를 즐겨 사용합니다.

     

    <nginx.conf>

    user  nginx;
    worker_processes  auto;
    
    error_log  /var/log/nginx/error.log notice;
    pid  /var/run/nginx.pid;
    
    
    events {
      worker_connections  1024;
    }
    
    http {
    
      upstream backend {
        server host.docker.internal:3000;
        server host.docker.internal:3001;
        server host.docker.internal:3002;
      } 
    
      server {
        location / {
          proxy_pass http://backend;
        } 
      }
    }

     

    아래 코드는 cat command 를 활용하여 nginx.conf 파일을 생성합니다.

    아래 코드를 복사하셔서 터미널에서 실행하시면 /tmp/nginx/nginx.conf 파일이 생성됩니다.

     

    <nginx.conf 파일 생성 코드>

    cat <<EOF > /tmp/nginx/nginx.conf
    user  nginx;
    worker_processes  auto;
    
    error_log  /var/log/nginx/error.log notice;
    pid  /var/run/nginx.pid;
    
    
    events {
      worker_connections  1024;
    }
    
    http {
    
      upstream backend {
        server host.docker.internal:3000;
        server host.docker.internal:3001;
        server host.docker.internal:3002;
      } 
    
      server {
        location / {
          proxy_pass http://backend;
        } 
      }
    }
    EOF

     

    아래 명령어를 통해서 nginx container 를 실행시킬 수 있습니다.

     

    <docker run nginx>

    docker run --platform linux/amd64 -d --rm --name nginx -v /tmp/nginx/nginx.conf:/etc/nginx/nginx.conf -p 81:80 nginx

     

     

    <Nginx 와 Nodejs 서버를 연결하기>

    docker run --platform linux/amd64 -d --rm --name node-server1 -p 3000:8888 westlife0615/node-server:1
    docker run --platform linux/amd64 -d --rm --name node-server2 -p 3001:8888 westlife0615/node-server:1
    docker run --platform linux/amd64 -d --rm --name node-server3 -p 3002:8888 westlife0615/node-server:1
    
    curl http://localhost:3000
    curl http://localhost:3001
    curl http://localhost:3002
    
    >> Hello nodejs

     

     
    curl 로 nginx 에 요청을 보냅니다.

    curl http://localhost:81

     

    Nginx 가 Nodejs 서버로 요청을 라우팅합니다.
    그리고 hello world 텍스트를 응답합니다.
    해당 응답은 nodejs 서버의 응답으로 nginx 와 어플리케이션 서버의 커뮤니케이션을 확인할 수 있습니다.

    Hello nodejs%

     

     
     
     
     

     

     

     

     

     

     

    반응형

    'Nginx' 카테고리의 다른 글

    [Nginx] Web Content Serving 알아보기 ( default.conf )  (0) 2024.03.18
    Nginx 구조 알아보기  (0) 2023.10.07
Designed by Tistory.