[Nginx] 05. 프로그래머빌리티와 자동화 - 2

Date:     Updated:

카테고리:

태그:


05. 상용 프로그래밍 언어로 Nginx 확장하기


NGINX는 매우 유연하게 확장할 수 있는 기능을 제공한다. C 모듈을 통해 사용자 정의 코드를 추가하거나, 이미 제공되는 JavaScript, Lua, Perl 모듈을 활용할 수 있다. 이러한 모듈을 사용하면 응답을 처리하거나 변수를 설정하는 등 다양한 작업을 쉽게 수행할 수 있다.


■ C로 모듈 만들기 전에 고려할 점

C 언어로 NGINX 모듈을 처음부터 만들기 전에, 다른 프로그래밍 언어 모듈이 적합한지 먼저 확인해야 한다. C는 매우 강력하지만, 용자 정의에 필요한 다양한 기능을 제공하는 다른 언어 모듈도 많이 있다.


■ NGINX JavaScript (NJS)

NGINX JavaScript (NJS)를 도입하여 JavaScript의 기능을 NGINX 설정에 쉽게 통합할 수 있도록 하고 있다. Lua와 Perl 모듈도 사용할 수 있다. 이러한 언어 모듈을 사용하면, 코드가 포함된 파일을 가져오거나 설정 내에서 직접 코드 블록을 정의할 수 있다.


■ Lua 사용

이 설정은 “hello, world”라는 메시지를 반환하는 간단한 Lua 스크립트를 실행함

load_module modules/ndk_http_module.so;
load_module modules/ngx_http_lua_module.so;
events {}
http {
    server {
        listen 8080;
        location / {
            default_type text/html;
            content_by_lua_block {
                ngx.say("hello, world")
            }
        }
    }
}


■ Perl 사용

이 예제는 환경 변수에서 값을 가져와 NGINX 변수로 설정하고, 이를 사용해 요청을 프록시함

load_module modules/ngx_http_perl_module.so;
events {}
http {
    perl_set $app_endpoint 'sub { return $ENV{"APP_DNS_ENDPOINT"}; }';
    server {
        listen 8080;
        location / {
            proxy_pass http://$app_endpoint;
        }
    }
}



06. 셰프(Chef)로 Nginx 설치


Chef는 강력한 구성 관리 도구로, NGINX를 코드로 쉽게 설치하고 설정할 수 있다. Supermarket의 공개 NGINX 쿠키북을 활용하면, 패키지 관리자를 통해 NGINX를 설치하고 필요한 구성을 손쉽게 적용할 수 있다. 이를 통해 NGINX 설정을 체계적으로 관리할 수 있다.


■ NGINX 쿠키북 설치

# Chef Supermarket에서 NGINX 쿠키북을 설치

knife supermarket install nginx


■ NGINX 쿠키북 생성

NGINX 사용 사례에 맞는 쿠키북을 생성하고, Supermarket에서 설치한 nginx 쿠키북을 종속성으로 추가합니다.


■ NGINX 설치 레시피 작성

source를 repo로 설정하면 최신 버전이 설치된다.

nginx_install 'nginx' do
    source 'repo'
end


■ 기본 NGINX 설정 재정의

nginx_config 리소스를 사용하여 NGINX의 핵심 설정을 재정의

nginx_config 'nginx' do
    default_site_enabled true
    keepalive_timeout 65
    worker_processes 'auto'
    action :create
    notifies :reload, 'nginx_service[nginx]', :delayed
end


■ NGINX 서버 블록 구성

nginx_site 리소스를 사용하여 NGINX 서버 블록을 설정

nginx_site 'test_site' do
    mode '0644'
    variables(
        'server' => {
            'listen' => [ '*:80' ],
            'server_name' => [ 'test.example.com' ],
            'access_log' => '/var/log/nginx/test_site.access.log',
            'locations' => {
                '/' => {
                    'root' => '/var/www/nginx-default',
                    'index' => 'index.html index.htm',
                },
            },
        }
    )
    action :create
    notifies :reload, 'nginx_service[nginx]', :delayed
end



07. 앤서블(Ansible)로 Nginx 설치


Ansible은 Python으로 작성된 강력한 구성 관리 도구로, YAML 형식으로 작업을 구성하고 Jinja2 템플릿 언어를 사용하여 파일 템플릿을 만들 수 있다.

  • 이 솔루션에서는 NGINX Inc.가 유지 관리하는 공개 역할 컬렉션을 사용하여 NGINX를 설치하고 샘플 구성을 생성했다.

  • 이를 통해 NGINX 데모 HTML 파일을 설정하고, 필요한 서버 블록을 쉽게 구성할 수 있다.


■ Ansible NGINX 컬렉션 설치

  • Ansible Galaxy는 Ansible의 패키지 관리자 역할을 하는 플랫폼으로, 여기서 사용자는 다양한 Ansible 역할(role)컬렉션(collection)을 검색하고 설치할 수 있다.

  • 역할(role)은 특정 작업을 자동화하기 위한 코드와 설정 파일 모음이고, 컬렉션(collection)은 좀 더 포괄적으로 다양한 모듈, 플러그인, 역할, 플레이북 등을 포함하는 패키지이다.

# Ansible Galaxy에서 NGINX 컬렉션을 설치

ansible-galaxy collection install nginxinc.nginx_core


■ 플레이북 작성

# NGINX를 설치하기 위해 컬렉션과 nginx 역할을 사용하는 플레이북을 작성

---
- hosts: all
  collections:
    - nginxinc.nginx_core
  tasks:
    - name: Install NGINX
      include_role:
        name: nginx


■ NGINX 구성 추가

# NGINX를 구성하기 위한 작업을 추가하고 nginx_config 역할을 사용

---
    - name: Configure NGINX
      include_role:
        name: nginx_config
      vars:
        nginx_config_http_template_enable: true
        nginx_config_http_template:
          - template_file: http/default.conf.j2
            deployment_location: /etc/nginx/conf.d/default.conf
            config:
              servers:
                - core:
                    listen:
                      - port: 80
                        server_name: localhost
                        log:
                          access:
                            - path: /var/log/nginx/access.log
                              format: main
                        sub_filter:
                          sub_filters:
                            - string: server_hostname
                              replacement: $hostname
                              once: false
                        locations:
                          - location: /
                            core:
                              root: /usr/share/nginx/html
                              index: index.html
        nginx_config_html_demo_template_enable: true
        nginx_config_html_demo_template:
          - template_file: www/index.html.j2
            html_file_name: index.html
            html_file_location: /usr/share/nginx/html
            web_server_name: Ansible NGINX collection



08. 콘술(Consul) 템플릿 기능으로 설정 자동화하기


Consul은 HashiCorp에서 개발한 서비스 네트워크 자동화 및 관리 도구이다. 주로 클라우드 네이티브 환경, 마이크로서비스 아키텍처, 컨테이너 기반 인프라에서 사용되며, 서비스의 동적 관리와 네트워크 자동화를 위한 핵심 도구로 활용된다.

  • Consul은 강력한 서비스 디스커버리 도구로, NGINX 구성을 동적으로 관리할 수 있게 해준다.

  • consul-template을 통해 환경 변화에 맞춰 NGINX가 자동으로 재구성되며, 인프라 및 애플리케이션 정보를 중앙에서 관리할 수 있다.

  • 이를 통해 NGINX는 서버, 서비스, 애플리케이션 버전의 추가 및 제거에 유연하게 반응할 수 있다.


■ Consul 템플릿 사용

consul-template 데몬과 템플릿 파일을 사용하여 원하는 NGINX 구성 파일을 템플릿화한다.

  • 이 예제는 upstream 구성 블록을 템플릿화하는 Consul 템플릿 파일이다.

  • 템플릿은 Consul에서 app.backend으로 식별된 노드를 반복해서 처리한다.

  • Consul의 각 노드에 대해 해당 노드의 IP 주소를 가진 server 지시어를 생성한다.

upstream backend {
    
        server ;
}


■ consul-template 데몬 실행

  • 이 명령은 consul-template 데몬에 consul.example.internal의 Consul 클러스터에 연결하고, 현재 작업 디렉토리의 upstream.template 파일을 템플릿으로 사용하여 /etc/nginx/conf.d/upstream.conf에 생성된 내용을 출력하도록 지시한다. 그 후 템플릿 파일이 변경될 때마다 NGINX를 리로드한다.

  • -template 플래그는 템플릿 파일, 출력 위치, 템플릿 처리 후 실행할 명령을 포함한다.

# 명령줄을 통해 consul-template 데몬을 실행하여 구성 파일이 변경될 때마다 NGINX를 리로드

$ consul-template -consul-addr consul.example.internal -template \
 ./upstream.template:/etc/nginx/conf.d/upstream.conf:"nginx -s reload"

NGINX 카테고리 내 다른 글 보러가기

댓글 남기기