[Nginx] 05. 프로그래머빌리티와 자동화 - 2
카테고리: NGINX
태그: nginx
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"
댓글 남기기