블로그 | NGINX

NGINX 및 NGINX Plus를 위한 타사 동적 모듈 컴파일

NGINX-F5-수평-검정-유형-RGB의 일부
오웬 개렛 썸네일
오웬 개렛
2016년 10월 25일 게시

편집자 - 동적 모듈 지원의 원래 릴리스를 알리는 블로그 게시물(NGINX 오픈 소스 1.9.11, 2016년 2월)이 여기로 리디렉션됩니다. 해당 게시물에 설명된 빌드 프로세스는 더 이상 지원되지 않습니다.

이 게시물은 NGINX Open Source 및 NGINX Plus와 함께 타사 동적 모듈을 사용하는 방법에 대한 2부작 시리즈의 일부입니다.

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

 

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

간결하게 설명하기 위해 이 게시물의 나머지 부분에서는 NGINX Plus에만 참조하며, NGINX Plus와 NGINX Open Source의 차이가 관련된 경우는 예외입니다. 별도로 명시된 경우를 제외하고 NGINX Plus에 대한 모든 진술은 NGINX 오픈 소스에도 적용됩니다.

동적 모듈 개요

NGINX Plus에 로드할 수 있는 모듈은 C로 작성되었으며, NGINX Wiki의 NGINX 확장 에 설명된 API를 따릅니다. 언어 통역기부터 보안 솔루션까지 다양한 타사 모듈의 대규모 생태계가 있으며, 이 중 일부는 NGINX Plus에 포함되어 지원됩니다 .

다른 타사 모듈과 사용자가 직접 만든 모듈은 런타임에 독립적으로 컴파일하고 동적으로 NGINX Plus에 로드해야 합니다. 아래 두 가지 예에서 설명한 대로 NGINX Open Source에 대해 이러한 모듈을 빌드하여 NGINX Plus에서 사용하도록 컴파일할 수 있습니다.

  1. 일치하는 NGINX 오픈 소스 릴리스를 얻으세요
  2. 모듈 소스를 얻고 필요한 경우 모듈의 구성 파일을 변경합니다.
  3. configure 명령에 --with-compat 인수를 사용하여 NGINX 오픈 소스 릴리스에 대해 동적 모듈을 빌드합니다 .
  4. 생성된 동적 모듈 ( .so 파일)을 NGINX Plus에 로드하여 내장 모듈인 것처럼 사용합니다.

예: 간단한 "Hello World" 모듈

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

1단계: NGINX 오픈 소스 릴리스 받기

  1. NGINX Plus 설치에 해당하는 NGINX 오픈 소스 버전을 확인하세요. 이 예에서는 NGINX 1.11.5입니다.

    $ nginx -v nginx 버전: nginx/1.11.5 (nginx-plus-r11)
    
  2. nginx.org/download 에서 해당 NGINX 오픈 소스 패키지를 다운로드하세요.

    $ wget https://nginx.org/download/nginx-1.11.5.tar.gz $ tar -xzvf nginx-1.11.5.tar.gz
    

2단계: 모듈 소스 얻기

  1. GitHub 에서 'Hello World' NGINX 모듈의 소스를 얻으세요:

    $ git clone https://github.com/perusio/nginx-hello-world-module.git
    
  2. 모듈의 구성 셸 파일은 모듈이 어떻게 빌드되는지 정의하며, 그 형식은 동적 모듈의 경우와 NGINX 오픈 소스 바이너리에 정적으로 빌드되는 모듈의 경우와 다릅니다 .

    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"
    
    . 자동/모듈
    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
    

이전 포맷에서 모듈의 구성 파일을 업데이트하는 방법을 포함하여 동적 모듈을 컴파일하는 방법에 대한 자세한 내용은 NGINX Wiki를 참조하세요.

3단계: 동적 모듈 컴파일

  1. --with-compat 인수로 configure 스크립트를 먼저 실행하여 모듈을 컴파일합니다. 이렇게 하면 NGINX Open Source와 NGINX Plus에서 모두 지원하는 표준 빌드 환경이 생성됩니다. 그런 다음 make modules를 실행하여 모듈을 빌드합니다.

    $ cd nginx-1.11.5/ $ ./configure --with-compat --add-dynamic-module=../nginx-hello-world-module $ 모듈을 만듭니다.
    
  2. 모듈 라이브러리( .so 파일)를 /etc/nginx/modules 에 복사합니다.

    $ sudo cp objs/ngx_http_hello_world_module.so /etc/nginx/modules/
    

4단계: 모듈 로드 및 사용

  1. NGINX Plus에 모듈을 로드하려면 nginx.conf 구성 파일의 최상위(main) 컨텍스트에 load_module 지시문을 추가합니다( http 또는 stream 컨텍스트 내부가 아님):

    로드_모듈 모듈/ngx_http_hello_world_module.so;
    
  2. http 컨텍스트에서 Hello World 모듈에서 제공하는 hello_world 지시어를 사용하여 위치 블록을 추가합니다. 해당 위치에 대한 요청은 hello world 라는 응답을 반환합니다.

    서버 {
    듣기 80;
    
    위치 / {
    hello_world;
    }
    }
    
  3. NGINX Plus 구성을 다시 로드하고 간단한 요청으로 테스트하세요.

    $ nginx -s reload $ curl http://localhost/ hello world
    

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

NAXSI는 XSS 및 SQL 주입 공격과 같은 의심스러운 요청을 식별하기 위해 휴리스틱과 점수 시스템을 사용하는 사용하기 쉬운 고성능 웹 애플리케이션 방화벽(WAF)입니다.

NAXSI 소스는 새로운 구성 셸 파일 형식을 준수하도록 업데이트되어 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 $ 모듈 만들기 $ sudo cp objs/ngx_http_naxsi_module.so /etc/nginx/modules

nginx.conf 파일의 메인 컨텍스트에 load_module 지시문을 추가하여 모듈을 NGINX Plus 코어에 로드합니다.

로드_모듈 모듈/ngx_http_naxsi_module.so;

NAXSI 구성은 프로젝트 설명서 에 자세히 설명되어 있습니다. 다음 NGINX 구성은 모듈이 실제로 작동하는 모습을 보여줍니다.

# 이 'include' 지시문을 편집하여 naxsi_core.rules 파일을 가리키도록 합니다.
include /home/owen/src/naxsi/naxsi_config/naxsi_core.rules;

server {
listen 80;

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

# NAXSI 활성화
SecRulesEnabled;

# 차단된 요청이 어디로 이동하는지 정의
DeniedUrl "/50x.html";

# CheckRules, NAXSI가 언제 조치를 취해야 하는지 결정
CheckRule "$SQL >= 8" BLOCK;
CheckRule "$RFI >= 8" BLOCK;
CheckRule "$TRAVERSAL >= 4" BLOCK;
CheckRule "$EVADE >= 4" BLOCK;
CheckRule "$XSS >= 8" BLOCK;

# 차단된 요청이 기록되는 error_log를 잊지 마세요
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 감지를 트리거하고 요청을 차단하며 /usr/share/nginx/html 에서 표준 50x.html 오류 페이지를 반환합니다. 또한 error_log 에 메시지를 기록합니다.

실제 운영에 배포하는 경우 https://github.com/nbs-system/naxsi/tags 에서 서명된 NAXSI 릴리스를 다운로드하여 비슷한 방식으로 컴파일할 수도 있습니다.

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

메모: 이 섹션의 정보는 NGINX Plus에만 적용됩니다. 사전 구축된 NGINX 오픈 소스 패키지 와 함께 제공되는 동적 모듈 세트는 NGINX Plus와 함께 제공되는 동적 모듈 세트와 다를 수 있습니다. NGINX 오픈 소스와 함께 사용되는 동적 모듈은 NGINX 소스 코드와 미리 빌드된 바이너리와 동일한 방식으로 지원 됩니다.

NGINX Plus에는 여러 가지 동적 모듈이 포함되어 있으며, 모듈 저장소에서 직접 다운로드할 수도 있습니다. 목록은 동적 모듈 페이지를 참조하세요. 이러한 모듈에는 두 가지 유형이 있습니다.

  • NGINX Plus 모듈은 NGINX 엔지니어링 팀에서 작성 및/또는 유지관리합니다. 기술적 이유(예를 들어, 추가 종속성이 있음)나 미리 보기 상태이기 때문에 NGINX Plus에 이러한 기능을 포함하지 않습니다. 미리보기 모듈은 활발하게 개발 중이므로 매우 신중하게 배포해야 합니다. 그렇지 않으면 NGINX Plus 모듈은 NGINX에서 완벽하게 지원됩니다. 목록을 보려면 Dynamic Modules 페이지에서 작성자 NGINX 로 필터링하세요.
  • NGINX Plus 인증 커뮤니티 모듈은 NGINX에서 테스트하고 배포하는 인기 있는 타사 모듈이며, NGINX에서는 설치 및 기본 구성에 대한 지원을 제공합니다. 우리는 이러한 모듈이 NGINX Plus의 올바른 작동을 방해하지 않음을 보증하며, NGINX Plus가 릴리스되거나 보안 릴리스가 있을 때마다 필요에 따라 이를 업데이트합니다. 목록을 보려면 동적 모듈 페이지에서 작성자 커뮤니티 별로 필터링하세요.

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

NGINX는 사용자가 직접 컴파일한 모듈(다른 커뮤니티 모듈, NGINX Plus 인증 모듈 프로그램에 속하지 않은 타사 공급업체가 제공하는 모듈 및 사용자 지정 모듈)을 테스트하거나 지원하지 않습니다. 문제에 대해 기술 지원을 요청하는 경우 NGINX 지원팀은 기술 지원 프로세스의 일환으로 지원되지 않는 모듈을 제거하고 오류를 재현해 달라고 요청할 수 있습니다. 이를 통해 지원되지 않는 모듈로 인해 오류가 발생했는지 여부를 확인할 수 있습니다.

요약

NGINX Plus의 동적 모듈 빌드 프로세스를 통해 NGINX 오픈 소스 모듈의 광범위한 생태계를 활용하여 풍부하고 완벽하게 지원되는 NGINX Plus 코어에서 이를 실행할 수 있습니다.

현재 타사 확장 기능과 함께 NGINX 오픈 소스를 사용 중이라면 이러한 확장 기능을 컴파일하여 NGINX Plus에 로드할 수 있을 가능성이 높습니다.

상용 또는 커뮤니티 모듈을 개발하는 경우 새로운 빌드 프로세스는 사용자가 NGINX Plus를 사용하여 모듈을 배포할 수 있다는 것을 의미합니다. 상용 모듈 인증에 대해 자세히 알아보려면 NGINX Plus 인증 모듈을 참조하세요.

모듈 개발이나 해당 구성 셸 파일 업데이트에 도움이 필요하면 다음 리소스를 확인하세요.

NGINX 개발자 메일링 목록은 커뮤니티 지원을 받을 수 있는 최적의 장소이며, 전문 서비스 팀 에서도 기꺼이 도움을 드립니다.

NGINX Plus에서 동적 모듈을 직접 사용해보려면 오늘 무료 30일 체험판을 시작하거나, 당사에 문의하여 사용 사례에 대해 논의해 보세요 .


"이 블로그 게시물에는 더 이상 사용할 수 없거나 더 이상 지원되지 않는 제품이 참조될 수 있습니다. 사용 가능한 F5 NGINX 제품과 솔루션에 대한 최신 정보를 보려면 NGINX 제품군을 살펴보세요. NGINX는 이제 F5의 일부가 되었습니다. 이전의 모든 NGINX.com 링크는 F5.com의 유사한 NGINX 콘텐츠로 리디렉션됩니다."