[DevOps] Nginx Configuration 정리

[DevOps] Nginx Configuration 정리

안녕하세요? 정리하는 개발자 워니즈입니다. 이번시간에는 Nginx의 configuration에 대해서 정리를 해보고자 합니다. 필자의 프로젝트에서는 웹서버로 Nginx를 사용하고 있습니다. Nginx의 configuration의 변경이 매우잦은 편입니다. 주로 redirection에 대한 처리를 Nginx를 통해서 하다보니 엄청나게 크게 변경이 되는것은 아니지만 이번 포스팅을 통해서 Nginx에서 사용하는 설정에 대해서 정리를 해보고자 합니다 .

nginx_1

1. nginx의 동작 방식

nginx 의 가장 큰 특징은 비동기 Event Driven에 의한 Non Blocking 처리를 한다는 것입니다. apache 서버에 비해 메모리소모량이 젂어지면서 동시 처리수를 급격하게 늘릴 수 있습니다. 요청이 아무리 많아도 Process 또는 Thread 생성 비용이 존재하지 않습니다.

Single Thread 기반으로 Master / Worker 프로세스로 구동되면서 context switching을 하지 않기 떄문에 CPU 사용률을 감소 시킬 수 있습니다 .

먼저 apache의 동작 방식을 정리해보겠습니다.

nginx_3

  • Apache는 병렬 처리 동작방식은 기본적으로 Apache Process 기반 방식으로 클라이언트 요청들을 처리 합니다. 요청에 따라 프로세스를 생성하는 Multi Process Module-prefork 방식과 worker 방식이 있습니다.
  • 요청에 따라 Process가 늘어나고 한개의 요청 처리중 다른 처리를 위한 Context switching으로 인해 부하가 걸림.

다음은 nginx의 동작방식에 대해서 정리하겠습니다.

nginx_2

  • Event Driven 방식으로 클라이언트 요청 병렬처리를 진행합니다. 기본적으로 싱글 프로세스 기반으로 이벤트를 받는 reactor와 이벤트를 각 worker로 전달하는 handler로 구성되어 있습니다.
  • process를 prefork하는 과정이 없이 요청온 request에 대한 행동에 대해서만 각 worker로 넘기고 계속해서 요청을 받기 떄문에 처리가 빠릅니다.
  • 비동기 처리로 인한 메모리 사용이 효율적이다.

2. nginx configuration 정리

nginx 공식 document

  • 최상단 모듈 (Core)
user root;                              // 워커 프로세스의 권한을 지정한다. 
worker_processes 1;                     // auto도 무방하지만, 코어 수 만큼 할당하는 것이 보통입니다. 
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;                 // nginx의 마스터 프로세스 ID 정보가 저장됩니다. 
events {
    worker_connections 1024;            // 하나의 프로세스가 처리 할 수 있는 커넥션 수입니다. 
}
  • http 블락
http {
    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    log_format main '[NGINX-ACCESS-LOG] [$time_local] $remote_addr to: $upstream_addr: $status: upstream $upstream_status $request upstream_response_time $upstream_response_time msec $request_time referer: [$http_referer] xff: [$proxy_add_x_forwarded_for] args: [$args] body: $request_body user-agent: [$http_user_agent]';

    sendfile on;                       // 응답을 보낼 때 바로 kernel file buffer를 사용하도록 하여, user-space의 buffuer 메모리를 사용하지 않아 보다 빠른 성능을 보장한다고 합니다.

    keepalive_timeout 65;              // 접속시 커넥션을 몇 초동안 유지할지에 대한 설정값.

    map_hash_bucket_size 10240;        // map 파일을 담을 버킷 사이즈 
    variables_hash_max_size 1024;
    variables_hash_bucket_size 128;
    server_tokens off;                 // NGINX의 버전을 숨길것인가에 대한 옵션이다. 보안상 주석을 제거하여 설정하는 것이 좋다.

    upstream disp_http {
        zone disp80 64k;
        server 127.0.0.1:8080;
    }

    map $uri $rd_mapping {
        include /etc/nginx/maps/*.map;
    }

    map $uri$is_args$args $rd_query_mapping {
        include /etc/nginx/maps_query/*.map;
    }
}

  • server 블락

하나의 server 블락은 하나의 가상 호스트를 구성합니다. 또한 한 개 이상의 location 블락을 삽입할 수 있습니다.

 server {
        listen 80;                                  //nginx의 가상호스트 포트
        access_log /var/log/nginx/access.log main;  
        error_log /var/log/nginx/error.log warn;

        root /efs/live/html;

        proxy_set_header Proxy "";                 //proxy 서버에 특정 헤더를 전달(proxy 헤더 제거)
        large_client_header_buffers 8 512k;        //대규모 클라이언트 요청 헤더를 읽을 때 사용 

        proxy_buffer_size 64k;                     //백엔드 서버 응답의 첫 부분을 읽기 위한 버퍼 크기를 설정하며, 여기에는 주로 간단한 헤더 데이터가 포함됩니다.
        proxy_buffers 4 64k;                       //백엔드 서버로부터의 응답 데이터를 읽는 데 사용할 버퍼의 수와 크기를 설정합니다.

        if ( $request_method !~ ^(GET|POST|OPTIONS)$ ) {
            return 405;
        }

        location / {

            if ($rd_mapping) {
                rewrite ^(.*)$ https://$http_host$rd_mapping permanent;
            }
            if ($rd_query_mapping) {
                rewrite ^(.*)$ https://$http_host$rd_query_mapping? permanent;
            }

            proxy_pass http://disp_http;

            proxy_set_header Host $http_host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_intercept_errors on;

            error_page 403 404 405 500 501 503 @error_page;
        }


        location /etc/designs/smg/global/fonts/ {
            proxy_pass http://disp_http;
            add_header 'Access-Control-Allow-Origin' *;

            proxy_buffering on;
            proxy_set_header Host $http_host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }

    include /etc/nginx/locations/p4_redirection.location;
    include /etc/nginx/locations/error_page.location;
    include /etc/nginx/locations/static_files.location;
    }

  • location 블락
location / {

           //map파일을 통하는 처리를 위하여 다음과 같이 분기 
            if ($rd_mapping) {
                rewrite ^(.*)$ https://$http_host$rd_mapping permanent;
            }
            if ($rd_query_mapping) {
                rewrite ^(.*)$ https://$http_host$rd_query_mapping? permanent;
            }

            proxy_pass http://disp_http;

            proxy_set_header Host $http_host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_intercept_errors on;

            error_page 403 404 405 500 501 503 @error_page;
        }

3. 마치며..

이번시간에는 nginx의 설정에 대해서 간단히 정리를 해보았습니다. 이번 포스팅은 모든 지시어들을 다 정리하지는 않고,필자가 프로젝트에서 사용하는 지시어들 위주로 정리를 해보았습니다. 주로 reverse proxy 서버의 역할을 수행하면서 backend의 서버로 연결을 짓는 역할을 하고 있습니다.

또한 maps config를 통해서 redirection에 대한 처리와 error에 대한 처리도 같이 하고 있습니다. 이번 포스팅은 미완성으로 남겨두도록 하겠습니다. 앞으로 nginx에 대해 습득되는 지식에 대해서는 포스팅 업데이트를 하도록 하겠습니다. 다음시간에는 대비되는 웹서버인 apache에 대해서도 정리를 해보도록 하겠습니다.

4. 참고

Nginx와 Apache의 구동방식 비교

엔진엑스 기본 환경 설정

2 Replies to “[DevOps] Nginx Configuration 정리”

    1. 엇!! 청규님께서 이렇게 댓글을 달아주시다니!! 영광입니다 ㅎㅎ
      부족한게 많은데 그래도 아는것들은 최대한 정리를 해두려고 합니다. ㅎㅎ
      좋게 봐주셔서 감사합니다~~

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다