NGINX 및 NGINX Plus용 타사 동적 모듈 컴파일

NGINX | 2016년 10월 25일

편집자 – 동적 모듈 지원의 최초 출시(NGINX Open Source 1.9.11, 2016년 2월)를 알린 블로그 게시물은 이 페이지로 리디렉션됩니다. 해당 게시물에 설명된 빌드 프로세스는 더 이상 사용되지 않습니다.

이 게시물은 NGINX Open Source 및 NGINX Plus에서 타사 동적 모듈을 사용하는 방법을 다루는 2부작 시리즈 중 하나입니다.

  • 이 게시물에서는 런타임에 NGINX Open Source 또는 NGINX Plus에서 로드할 수 있는 타사 동적 모듈을 컴파일하는 방법을 단계별로 안내합니다.
  • 두 번째 게시물에서는 프로덕션 환경을 위한 타사 동적 모듈 빌드를 자동화하는 데 필요한 지침과 도구를 제공합니다. 또한 버전 종속성 검사가 포함된 타사 동적 모듈용 설치 패키지를 만드는 방법을 설명합니다.

NGINX Open Source 1.11.5 및 NGINX Plus 릴리스 R11에서는 동적 모듈에 대한 바이너리 호환성이 도입되었습니다. 이 문서에서는 개발 환경에서 NGINX Open Source 및 NGINX Plus와 함께 사용할 타사 모듈을 컴파일하는 방법을 설명합니다. 프로덕션 환경에서 타사 동적 모듈을 빌드, 배포 및 업그레이드하는 방법은 동적 모듈용 설치 가능 패키지 만들기를 참조하세요.

간결한 설명을 위해 이 글의 나머지 부분에서는 NGINX Open Source와의 차이점이 중요한 경우를 제외하고 NGINX Plus만 언급합니다. 별도로 명시하지 않는 한 NGINX Plus에 관한 모든 설명은 NGINX Open Source에도 적용됩니다.

동적 모듈 개요

NGINX Plus에 로드할 수 있는 모듈은 C로 작성되며 NGINX Wiki의 NGINX 확장에 설명된 API를 준수합니다. 언어 인터프리터부터 보안 솔루션에 이르기까지 광범위한 타사 모듈 생태계가 있으며, 이 중 일부는 NGINX Plus에 포함되어 지원됩니다.

그 밖의 타사 모듈과 직접 만든 모듈은 별도로 컴파일한 후 런타임에 NGINX Plus로 동적 로드해야 합니다. 아래 두 예시와 같이 NGINX Open Source를 기반으로 빌드하면 이러한 모듈을 NGINX Plus에서 사용할 수 있도록 컴파일할 수 있습니다:

  1. 일치하는 NGINX Open Source 릴리스 받기
  2. 모듈 소스 코드를 구합니다 필요한 경우 모듈의 config 파일을 변경합니다
  3. 동적 모듈 빌드 시 NGINX Open Source 릴리스를 대상으로 하고, --with-compat 인수를 configure 명령에 사용
  4. 생성된 동적 모듈을 로드합니다 (.so 파일). NGINX Plus에 로드한 후 기본 제공 모듈처럼 사용합니다

예제: 간단한 “Hello World” 모듈

이 예제에서는 간단한 Hello World 모듈을 사용하여 모듈의 소스 코드를 업데이트하고 NGINX Plus에 로드하는 방법을 보여 줍니다. “Hello World” 모듈은 요청에 간단한 메시지로 응답하는 단순한 지시어(hello_world)를 구현합니다.

1단계: NGINX Open Source 릴리스 다운로드

  1. 설치된 NGINX Plus에 해당하는 NGINX Open Source 버전을 확인합니다. 이 예에서는 NGINX 1.11.5입니다.
$ nginx -vnginx version: nginx/1.11.5 (nginx-plus-r11)
  1. 해당 NGINX Open Source 패키지를 다음 위치에서 다운로드합니다. nginx.org/download:
$ wget https://nginx.org/download/nginx-1.11.5.tar.gz$ tar -xzvf nginx-1.11.5.tar.gz

2단계: 모듈 소스 코드 가져오기

  1. ‘Hello World’ NGINX 모듈의 소스 코드를 GitHub에서 가져옵니다:
$ git clone https://github.com/perusio/nginx-hello-world-module.git
  1. 모듈의 config 셸 파일은 모듈의 빌드 방식을 정의하며, 동적 모듈의 형식은 NGINX Open Source 바이너리에 정적으로 빌드되는 모듈의 형식과 다릅니다. nginx-hello-world-module/config 파일을 다음과 같이 수정합니다:
ngx_addon_name=ngx_http_hello_world_module

if test -n "$ngx_module_link"; then
    ngx_module_type=HTTP
    ngx_module_name=ngx_http_hello_world_module
    ngx_module_srcs="$ngx_addon_dir/ngx_http_hello_world_module.c"

    . auto/module
else
    HTTP_MODULES="$HTTP_MODULES ngx_http_hello_world_module"
    NGX_ADDON_SRCS="$NGX_ADDON_SRCS $ngx_addon_dir/ngx_http_hello_world_module.c"
fi

동적 모듈 컴파일에 대한 자세한 내용과 모듈의 config 파일을 이전 형식에서 업데이트하는 방법은 NGINX Wiki를 참조하세요.

3단계: 동적 모듈 컴파일

  1. 먼저 configure 스크립트를 --with-compat 인수와 함께 실행하여 모듈을 컴파일합니다. 그러면 NGINX Open Source와 NGINX Plus에서 모두 지원되는 표준 빌드 환경이 생성됩니다. 그런 다음 make modules를 실행하여 모듈을 빌드합니다:
$ cd nginx-1.11.5/$ ./configure --with-compat --add-dynamic-module=../nginx-hello-world-module
$ make modules
  1. 모듈 라이브러리(.so 파일)를 /etc/nginx/modules에 복사합니다:
$ sudo cp objs/ngx_http_hello_world_module.so /etc/nginx/modules/

4단계: 모듈 로드 및 사용

  1. NGINX Plus에 모듈을 로드하려면 load_module 지시어를 nginx.conf 구성 파일의 최상위(기본) 컨텍스트에 추가합니다(http 또는 stream 컨텍스트 내부가 아님):
load_module modules/ngx_http_hello_world_module.so;
  1. In the http 컨텍스트에서 Hello World 모듈이 제공하는 location 블록과 hello_world 지시어를 추가합니다. 해당 위치로 요청을 보내면 hello world 응답이 반환됩니다.
server {
    listen 80;

    location / {
         hello_world;
    }
}
  1. NGINX Plus 구성을 다시 로드하고 간단한 요청으로 테스트합니다:
$ nginx -s reload$ curl http://localhost/
hello world

예시: NAXSI 웹 애플리케이션 방화벽

NAXSI는 사용하기 쉽고 성능이 뛰어난 웹 애플리케이션 방화벽(WAF)으로, 휴리스틱과 점수 시스템을 사용하여 XSS 및 SQL 인젝션 공격과 같은 의심스러운 요청을 식별합니다.

NAXSI 소스는 새로운 config 셸 파일 형식을 준수하도록 업데이트되었으므로 NGINX Plus용 동적 모듈을 간편하게 빌드할 수 있습니다. 이 과정은 NAXSI 설치 지침을 기반으로 합니다:

$ git clone https://github.com/nbs-system/naxsi.git$ cd nginx-1.11.5/
$ ./configure --with-compat --add-dynamic-module=../naxsi/naxsi_src
$ make modules
$ sudo cp objs/ngx_http_naxsi_module.so /etc/nginx/modules

다음을 추가하여 모듈을 NGINX Plus 코어에 로드합니다. load_module 지시어를 nginx.conf 파일의 기본 컨텍스트에 추가합니다:

load_module modules/ngx_http_naxsi_module.so;

NAXSI 구성에 대한 자세한 내용은 프로젝트 문서에서 확인할 수 있습니다. 다음 NGINX 구성은 이 모듈의 실제 작동 방식을 보여 줍니다:

# Edit this 'include' directive to point to your naxsi_core.rules file
include /home/owen/src/naxsi/naxsi_config/naxsi_core.rules;

server {
    listen 80;

    location / {
        root /usr/share/nginx/html;

        # Enable NAXSI
        SecRulesEnabled;

        # Define where blocked requests go
        DeniedUrl "/50x.html";

        # CheckRules, determining when NAXSI needs to take action
        CheckRule "$SQL >= 8" BLOCK;
        CheckRule "$RFI >= 8" BLOCK;
        CheckRule "$TRAVERSAL >= 4" BLOCK;
        CheckRule "$EVADE >= 4" BLOCK;
        CheckRule "$XSS >= 8" BLOCK;

        # Don’t forget the error_log, where blocked requests are logged
        error_log /tmp/naxsi.log;
    }

    error_page   500 502 503 504  /50x.html;
}

간단한 HTTP 요청 두 개를 보내 NAXSI가 올바르게 작동하는지 확인할 수 있습니다:

  • curl http://localhost/은(는) /usr/share/nginx/html에 저장된 표준 NGINX Plus 인덱스 페이지를 반환합니다.
  • curl "http://localhost/?a=<>"은(는) NAXSI의 XSS 탐지를 트리거하여 요청을 차단하고, 50x.html 표준 오류 페이지를 /usr/share/nginx/html에서 반환합니다. 또한 error_log에 메시지를 기록합니다.

프로덕션 환경에 배포하는 경우에는 서명된 NAXSI 릴리스를 다운로드할 수도 있습니다. 다운로드 위치: https://github.com/nbs-system/naxsi/tags. 이후 비슷한 방식으로 컴파일하면 됩니다.

NGINX Plus에서 동적 모듈을 지원하는 방법

참고: 이 섹션의 정보는 NGINX Plus에만 적용됩니다. 사전 빌드된 NGINX Open Source 패키지에 포함된 동적 모듈 세트는 NGINX Plus에 포함된 모듈 세트와 다를 수 있습니다. NGINX Open Source에서 사용되는 동적 모듈은 NGINX 소스 코드 및 사전 빌드된 바이너리와 동일한 방식으로 지원됩니다.

NGINX Plus에는 모듈 저장소에서 직접 다운로드할 수도 있는 여러 동적 모듈이 함께 제공됩니다. 목록은 동적 모듈 페이지를 참조하세요. 이러한 모듈은 두 가지 유형으로 나뉩니다:

  • NGINX Plus 모듈은 NGINX 엔지니어링 팀에서 작성 및/또는 유지 관리합니다. 기술적인 이유(예: 추가 종속성이 있음) 또는 프리뷰 상태이기 때문에 NGINX Plus에 포함하지 않습니다. 프리뷰 모듈은 현재 활발히 개발 중이므로 배포할 때 각별히 주의해야 합니다. 그 외의 NGINX Plus 모듈은 NGINX에서 완전히 지원합니다. 목록을 보려면 NGINX 작성자를 기준으로 동적 모듈 페이지에서 필터링하십시오.
  • NGINX Plus 인증 커뮤니티 모듈은 NGINX가 테스트하고 배포하는 인기 있는 타사 모듈로, 설치 및 기본 구성에 대한 지원이 제공됩니다. 이러한 모듈이 NGINX Plus의 정상적인 작동을 방해하지 않음을 보장하며, NGINX Plus가 릴리스될 때마다 또는 보안 릴리스가 있을 때 필요에 따라 업데이트합니다. 목록을 보려면 커뮤니티를 작성자로 선택하여 동적 모듈 페이지에서 필터링하십시오.

또한 NGINX는 당사의 NGINX Plus 인증 모듈 프로그램에 참여하는 상용 공급업체의 모듈을 인증합니다. 이러한 모듈은 해당 공급업체가 배포하고 지원합니다. 목록을 보려면 인증 파트너를 작성자로 선택하여 동적 모듈 페이지에서 필터링하십시오.

NGINX는 사용자가 직접 컴파일한 모듈(기타 커뮤니티 모듈, NGINX Plus Certified Modules 프로그램에 포함되지 않은 타사 공급업체 제공 모듈 및 사용자 지정 모듈)을 테스트하거나 지원하지 않습니다. 문제 해결을 위해 기술 지원을 요청하는 경우, NGINX 지원팀은 해당 문제가 지원되지 않는 모듈로 인해 발생했는지 확인할 수 있도록 기술 지원 절차의 일환으로 지원되지 않는 모듈을 제거한 후 문제를 재현해 달라고 요청할 수 있습니다.

요약

NGINX Plus의 동적 모듈 빌드 프로세스를 사용하면 풍부한 기능과 완벽한 지원을 제공하는 NGINX Plus 코어에서 광범위한 NGINX Open Source 모듈 생태계를 활용할 수 있습니다.

현재 타사 확장 기능과 함께 NGINX Open Source를 사용하고 있다면, 이러한 확장 기능은 대부분 NGINX Plus용으로 컴파일하여 로드할 수 있습니다.

상용 또는 커뮤니티 모듈을 개발하는 경우, 새로운 빌드 프로세스를 통해 사용자가 해당 모듈을 NGINX Plus와 함께 배포할 수 있습니다. 상용 모듈 인증에 대해 알아보려면 NGINX Plus 인증 모듈을 참조하세요.

모듈을 개발하거나 모듈의 config 셸 파일을 업데이트하는 데 도움이 필요하면 다음 리소스를 참조하세요:

The NGINX 개발자 메일링 리스트는 커뮤니티의 도움을 받을 수 있는 가장 좋은 곳이며, 전문 서비스 팀에서도 기꺼이 도와드립니다.

NGINX Plus에서 동적 모듈을 직접 사용해 보려면 지금 30일 무료 평가판을 시작하거나 사용 사례에 대해 논의하려면 문의해 주세요.


공유
태그: F5 NGINX, Tech, 2016

작성자 소개

관련 블로그 게시물

시청하기: KubeCon North America 2023에서의 NGINX Gateway Fabric
NGINX | 2023. 11. 30.

시청하기: KubeCon North America 2023에서의 NGINX Gateway Fabric

이 영상에서는 KubeCon의 NGINX 부스를 찾아가, 저희가 공개한 Kubernetes Gateway API 구현을 살펴봅니다.

F5 NGINX로 대규모 WAF 플릿을 확인하고 관리하는 2가지 방법
NGINX | 2023. 03. 23.

F5 NGINX로 대규모 WAF 플릿을 확인하고 관리하는 2가지 방법

앱 보안을 강화하는 두 가지 방법을 소개합니다. NGINX Management Suite를 통해 WAF 운영에 대한 가시성을 높이고, NGINX App Protect WAF를 활용해 코드형 보안을 구현하는 것입니다.

Ingress 컨트롤러 선택 가이드, 4부: NGINX Ingress Controller 옵션
NGINX | 2021. 09. 27.

Ingress 컨트롤러 선택 가이드, 4부: NGINX Ingress Controller 옵션

개발 주체, 개발 철학, 프로덕션 환경 준비도, 보안 및 지원을 기준으로 어떤 NGINX Ingress 컨트롤러가 가장 적합한지 알아보세요.

진화하는 공격 환경에 NGINX App Protect Denial of Service가 적응하는 방법
NGINX | 2021. 07. 06.

진화하는 공격 환경에 NGINX App Protect Denial of Service가 적응하는 방법

NGINX App Protect Denial of Service(DoS)가 계층 7 DoS 공격을 방어하기 위해 완화 방법을 실시간으로 조정하는 방식을 설명합니다. 정상적인 사용자 행동과 서버 상태에 대한 모델을 생성하여 공격을 나타내는 이상 징후를 감지하고 맞춤형 완화 시그니처를 적용할 수 있습니다.

NGINX Instance Manager를 활용한 대규모 구성 업데이트 및 인증서 관리
NGINX | 2021. 06. 30.

NGINX Instance Manager를 활용한 대규모 구성 업데이트 및 인증서 관리

NGINX Instance Manager 버전 1.0에는 두 가지 새로운 기능이 도입되었습니다. NGINX 인스턴스에 태그와 사용자 역할을 지정하면 전체 그룹에 구성을 한 번에 적용할 수 있습니다. 인증서 검사는 만료 예정인 인증서를 감지하여 서비스 중단을 방지할 수 있도록 인증서를 교체할 수 있게 해줍니다.

Netflix가 자사 CDN의 핵심으로 NGINX를 선택한 이유
NGINX | 2015. 03. 25.

Netflix가 자사 CDN의 핵심으로 NGINX를 선택한 이유

Netflix가 글로벌 콘텐츠 전송 네트워크인 Open Connect의 스트리밍 미디어 기술로 NGINX를 선택한 이유를 NGINX 개발자 Gleb Smirnoff에게서 알아보세요.