공부하는 스누피

[Nginx] nginx가 요청을 처리하는 방법 본문

Web/Node.js

[Nginx] nginx가 요청을 처리하는 방법

커피맛스누피 2021. 11. 14. 18:02

Nginx란?

nginx는 경량 웹 서버로 비동기 이벤트 기반 구조이다. 쓰레드 기반의 Apache보다 성능이 좋아 2021년 기준 점유율이 상승세에 있다. HTTP 서버, 리버스 프록시 서버 등으로 활용되는데, 응답 속도나 캐싱 성능 덕분에 주로 리버스 프록시 서버로 사용된다.

 

Nginx가 요청을 처리하는 방법

 

(아래 공식 docs를 의/번역하였음)

http://nginx.org/en/docs/http/request_processing.html

 

How nginx processes a request

How nginx processes a request Name-based virtual servers nginx first decides which server should process the request. Let’s start with a simple configuration where all three virtual servers listen on port *:80: server { listen 80; server_name example.org

nginx.org

이름 기반 가상 서버

nginx는 처음에 어떤 서버가 요청을 처리할지 결정합니다. 아래는 3개의 가상 서버가 포트 80번에 열리도록 하는 간단한 설정입니다.

server {
    listen      80;
    server_name example.org www.example.org;
    ...
}

server {
    listen      80;
    server_name example.net www.example.net;
    ...
}

server {
    listen      80;
    server_name example.com www.example.com;
    ...
}

이 설정에서 nginx는 어떤 서버로 요청을 라우팅할 지 결정하기 위해 "Host"라는 헤더 필드를 가진 요청만 검사합니다.만약 값이 어떤 서버 이름과도 일치하지 않거나 해당 헤더 필드를 갖고 있지 않다면, nginx는 이 요청을 디폴트 서버로 라우트시킵니다. 디폴트 서버는 위 설정에서 정의된 첫 번째 부분에 해당되는데, nginx는 일반적으로 첫 번째 부분을 디폴트로 합니다. 명시적으로 디폴트 서버를 지정해줄 수도 있는데, listen 지시어 뒤쪽에 default_server 파라미터를 붙이면 됩니다.

server {
    listen      80 default_server;
    server_name example.net www.example.net;
    ...
}

--> default_server 파라미터는 0.8.21 버전부터 사용 가능합니다. 이전 버전에서는 default를 사용합니다.

 

이름 기반과 IP 기반이 섞인 가상 서버 설정

server {
    listen      192.168.1.1:80;
    server_name example.org www.example.org;
    ...
}

server {
    listen      192.168.1.1:80;
    server_name example.net www.example.net;
    ...
}

server {
    listen      192.168.1.2:80;
    server_name example.com www.example.com;
    ...
}

이 설정에서 nginx는 각 server 블록 설정과 요청의 IP 주소와 port가 일치하는지 먼저 검사합니다. 그러고 나서 IP 주소가 일치하는 블록에서만 Host 헤더 필드와 server_name을 검사합니다. 만약 server name이 일치하는 곳이 없다면, 요청은 디폴트 서버에서 처리됩니다. 예를 들어 example.com으로 가는 요청이 192.168.1.1:80쪽으로 도착했다면, 세 번째 블록의 IP 정보와 일치하지 않기 때문에 디폴트 서버에서 처리됩니다. 

 

디폴트 서버는 다른 IP나 포트에서 정의 된다면 여러 개를 둘 수 있습니다.

 

간단한 PHP 사이트 설정

이제 어떻게 nginx가 일반적인 사이트에서 요청을 처리할 장소를 선택하는지 알아 봅시다. (server block를 선택한 다음 단계)

server {
    listen      80;
    server_name example.org www.example.org;
    root        /data/www;

    location / {
        index   index.html index.php;
    }

    location ~* \.(gif|jpg|png)$ {
        expires 30d;
    }

    location ~ \.php$ {
        fastcgi_pass  localhost:9000;
        fastcgi_param SCRIPT_FILENAME
                      $document_root$fastcgi_script_name;
        include       fastcgi_params;
    }
}

먼저 nginx는 나열된 순서와 상관 없이 가장 구체적인 prefix location를 찾습니다. 위 설정에서는 "/"만 prefix location으로 되어 있는데, 어떤 요청이 와도 매칭되기 때문입니다. 그러고 나면 nginx는 정규 표현식으로 주어진 location을 나열된 순서대로 검사합니다. 요청에 맞는 정규 표현식이 없다면, nginx는 앞서 찾은 가장 구체적인 prefix location인 "/"을 선택합니다.

 

+ 주의: location은 요청의 URI 부분만 검사합니다. (쿼리스트링 검사 x)

 

요청 처리 순서

1. prefix location을 찾고나서 요청과 일치되는 정규 표현식을 찾는다.

2. IP 주소 + 포트 번호가 일치하는 블록을 찾는다.

3. 찾은 블록에 대해 서버 이름(host_name)이 일치하는지 확인한다.

4. 2, 3에서 일치하는 블록을 찾지 못하면 default server에서 요청을 처리하도록 한다.

'Web > Node.js' 카테고리의 다른 글

[Node.js] mysql connection 오류  (0) 2020.09.29
Comments