-
[Nginx] listen Directive 알아보기Nginx 2023. 9. 6. 12:51728x90반응형
- 목차
들어가며.
이번 글에서는 Nginx 의 설정 파일에서 사용되는 listen 디렉티브에 대해서 알아봅니다.
Nginx 는 중요한 여러가지 특징들이 있지만, 근본적으로 네트워크 트래픽을 수용할 수 있는 네트워크 서버 애플리케이션입니다.
흔히 TCP 기반의 네트워크 트래픽를 처리할 수 있는 여러 Socket 기반의 서버들이 있죠.
사실상 모든 Backend Application 들이 Socket 관련 처리 부분이 추상화되어 있지만,
Socket, Bind, Listen 등의 System Call 을 통해서 네트워크 서버 애플리케이션이 구현됩니다.
Nginx 의 listen Directive 는 "listen 80;" 와 같은 형식으로 사용되며,
이는 내부적으로
- Socket System Call 을 통해서 Listening Socket 을 생성하고,
- Bind System Call 을 통해서 Listening Socket 과 80 포트를 바인딩하며,
- 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 서버에게 요청이 전달됩니다.
반응형'Nginx' 카테고리의 다른 글
[Nginx] Web Content Serving 알아보기 ( default.conf ) (0) 2024.03.18 [Nginx] Worker Connections 알아보기 (0) 2024.02.04 Nginx 구조 알아보기 (0) 2023.10.07 [Nginx] Worker Processes 알아보기 (0) 2023.10.06 Nginx HTTP Upstream 알아보기 (0) 2023.09.16