ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Nginx] listen Directive 알아보기
    Nginx 2023. 9. 6. 12:51
    728x90
    반응형

    - 목차

     

    들어가며.

    이번 글에서는 Nginx 의 설정 파일에서 사용되는 listen 디렉티브에 대해서 알아봅니다.

    Nginx 는 중요한 여러가지 특징들이 있지만, 근본적으로 네트워크 트래픽을 수용할 수 있는 네트워크 서버 애플리케이션입니다.

    흔히 TCP 기반의 네트워크 트래픽를 처리할 수 있는 여러 Socket 기반의 서버들이 있죠.

    사실상 모든 Backend Application 들이 Socket 관련 처리 부분이 추상화되어 있지만,

    Socket, Bind, Listen 등의 System Call 을 통해서 네트워크 서버 애플리케이션이 구현됩니다.

     

    Nginxlisten Directive"listen 80;" 와 같은 형식으로 사용되며,

    이는 내부적으로

    1. Socket System Call 을 통해서 Listening Socket 을 생성하고,
    2. Bind System Call 을 통해서 Listening Socket 과 80 포트를 바인딩하며,
    3. Listen System Call 을 통해서 Socket 을 Listening 상태로 변경하고, Backlog 를 등록합니다.

    즉, listen Directive 는 한 줄의 명령으로 Socket 의 생성과 클라이언트의 연결을 수락할 준비를 시도하게 됩니다.

    일반적인 Socket Programming 에서 10줄 이상의 코드를 하나의 Directive 로 추상화시킨 결과라고 생각하셔도 좋습니다.

     

    listen Directive 사용해보기.

    아래에 몇가지 명령어들을 작성하였습니다.

    하나는 nginx.conf 설정 파일을 설정하는 cat 명령어입니다.

    http 와 server 블록을 통해서 HTTP Server 로써의 설정을 추가합니다.

    이번 글의 주제인 listen Directive 를 통해서 80 Port 와 Listening Socket 을 연결합니다.

    그리고 location Directive 를 통해서 모든 요청에 대해 Requeset Path 와 Query String 를 응답하는 구성을 하였습니다.

     

    cat <<'EOF'> /tmp/nginx.conf
    events {
        worker_connections 1024;
    }
    
    http {
      server {
          listen 80;
    
          location / {
              return 200 $request_uri;
          }
      }
    }
    EOF

     

    그리고 위의 nginx.conf 설정을 기반으로 Nginx Docker Container 를 실행합니다.

     

    docker run --platform linux/amd64 -d -p 8080:80 \
        --name nginx \
        --mount type=bind,source=/tmp/nginx.conf,target=/etc/nginx/nginx.conf \
        nginx:1.27.3

     

    그리고 아래의 이미지는 curl 명령어로 Nginx 와 통신한 응답 결과입니다.

     

     

    이렇게 listen Directive 를 통해서 손쉽게 HTTP 기반의 서버 애플리케이션의 생성이 가능합니다.

     

    stream 블록으로 TCP Socket 생성하기.

    위의 내용은 일반적인 HTTP 요청을 위한 listen Directive 의 사용법이었습니다.

    stream Block 을 통해서 TCP 요청을 위해서 listen Directive 를 사용할 수 있습니다.

    흔히 Nginx 에서 TCP 요청의 처리는 리버스 프록시 또는 Lv4 로드밸런서로써 사용됩니다.

    그래서 아주 간단한 Echo Server 를 가장 뒷단에 두고 Nginx 가 TCP 패킷들을 로드밸런싱하는 구조로 예시를 만들어보겠습니다.

     

     

    먼저 stream 과 server 블록을 사용해서 TCP 패킷을 처리하기 위한 설정을 추가합니다.

    TCP 패킷의 프록시를 위해서 8081 포트를 사용합니다.

    이 또한 http & server 블록에서와 같이 listen 디렉티브를 사용하면 됩니다.

    그리고 proxy_pass 디렉티브를 통해서 echo 서버에게 TCP 패킷들을 프록시합니다.

     

    cat <<'EOF'> /tmp/nginx.conf
    events {
        worker_connections 1024;
    }
    
    http {
      server {
          listen 80;
    
          location / {
              return 200 $request_uri;
          }
      }
    }
    
    stream {
      server {
          listen 8081;
          proxy_pass echo:5678;
      }
    }
    EOF

     

    "nginx" 라는 이름의 Docker Network 를 생성하여 nginx 와 echo server 를 하나의 subnet 으로 묶습니다.

    그렇게 하여 nginx 가 echo 서버의 Domain 이름으로 네트워크 통신을 할 수 있도록 구성하였습니다.

     

    docker network create nginx
    
    docker run --platform linux/amd64 -d -p 8080:80 -p 8081:8081 \
        --network nginx \
        --name nginx \
        --mount type=bind,source=/tmp/nginx.conf,target=/etc/nginx/nginx.conf \
        nginx:1.27.3
    
    docker run --platform linux/amd64 -d \
        --name echo \
        --hostname echo \
        --network nginx \
        hashicorp/http-echo -text='Hello from Echo Server!'

     

    아래의 터미널 캡쳐 이미지는 2개의 Curl 요청을 보여줍니다.

    첫번째 요청인 "curl http://localhost:8080" HTTP Port 은 8080 포트로 요청을 보내게 됩니다.

    그리고 두번째 요청인 8081 포트로의 요청은 TCP Reverse Proxy 로 동작하여 Echo 서버에게 요청이 전달됩니다.

     

     

     

    반응형
Designed by Tistory.