이 게시물은 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와 함께 사용할 타사 모듈을 컴파일하는 방법을 설명합니다.
프로덕션 환경에서 타사 동적 모듈을 빌드, 배포 및 업그레이드하는 방법에 대한 지침은
Creating Installable Packages for Dynamic Modules를 참조하세요 .
간결하게 하기 위해, 이 게시물의 나머지 부분은 NGINX Plus에만 해당하며,
NGINX Plus와 NGINX Open Source의 차이가 관련 있는 경우는 예외입니다.
언급된 경우를 제외하고, NGINX Plus에 대한 모든 진술은 NGINX Open Source에도 적용됩니다.
동적 모듈 개요
NGINX Plus에 로드할 수 있는 모듈은 C로 작성되었으며 NGINX Wiki의 'NGINX 확장'에 설명된 API를 따릅니다.
언어 인터프리터에서 보안 솔루션에 이르기까지 다양한 타사 모듈의 대규모 생태계가 있으며
이 중 일부는 NGINX Plus에 포함되어 지원 됩니다 .
다른 타사 모듈과 직접 만든 모듈은 런타임에 독립적으로 컴파일하고 동적으로 NGINX Plus에 로드해야 합니다.
아래 두 예에서 설명한 대로 NGINX Open Source에 대해 빌드하여 이러한 모듈을 NGINX Plus에서 사용하도록 컴파일할 수 있습니다.
- 일치하는 NGINX 오픈 소스 릴리스를 얻으세요
- 모듈 소스를 얻고 필요한 경우 모듈의 구성 파일을 변경합니다.
- 명령 --with-compat에 대한 인수를 사용하여 NGINX 오픈 소스 릴리스에 대해 동적 모듈을 빌드합니다 .configure
- 생성된 동적 모듈 ( .so 파일)을 NGINX Plus에 로드하여 내장 모듈인 것처럼 사용합니다.
예: 간단한 "Hello World" 모듈
이 예제는 간단한 Hello World 모듈을 사용하여 모듈의 소스를 업데이트하고 NGINX Plus에 로드하는 방법을 보여줍니다.
"Hello World" 모듈은 hello_world간단한 메시지로 요청에 응답하는 간단한 지시문( )을 구현합니다.
1단계: NGINX 오픈 소스 릴리스 얻기
NGINX Plus 설치에 해당하는 NGINX Open Source 버전을 확인합니다. 이 예에서는 NGINX 1.11.5입니다.
$ nginx -vnginx version: nginx/1.11.5 (nginx-plus-r11)
nginx.org/download 에서 해당 NGINX 오픈 소스 패키지를 다운로드하세요 .
$ wget https://nginx.org/download/nginx-1.11.5.tar.gz$ tar -xzvf nginx-1.11.5.tar.gz
2단계: 모듈 소스 얻기
GitHub 에서 'Hello World' NGINX 모듈의 소스를 얻으세요 :
$ git clone https://github.com/perusio/nginx-hello-world-module.git
모듈의 구성 셸 파일은 모듈이 어떻게 빌드되는지 정의하며, 그 형식은 동적 모듈의 경우와 NGINX 오픈 소스 바이너리에 정적으로 빌드되는 모듈의 경우와 다릅니다.
nginx-hello-world-module/config 파일을 수정하여 다음을 포함합니다.
ngx_addon_name=ngx_http_hello_world_module
if test -n "$ngx_module_link";
then ngx_module_type=HTTPngx_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
이전 포맷에서 모듈의 구성 파일을 업데이트하는 방법을 포함하여 동적 모듈을 컴파일하는 방법에 대한 자세한 내용은 NGINX Wiki를 참조하세요 .
3단계: 동적 모듈 컴파일
- 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
4. 모듈 라이브러리( .so 파일)를 /etc/nginx/modules 에 복사합니다 .
$ sudo cp objs/ngx_http_hello_world_module.so /etc/nginx/modules/
4단계: 모듈 로드 및 사용
NGINX Plus에 모듈을 로드하려면
nginx.confload_module 구성 파일 의 최상위(main) 컨텍스트에 지시문을 추가합니다
( or 컨텍스트 내부가 아님):httpstream
load_module modules/ngx_http_hello_world_module.so;
컨텍스트 에서 Hello World 모듈에서 제공하는 지시어가 있는 블록을 http추가합니다 .
위치에 대한 요청은 응답을 반환합니다 .locationhello_worldhello world
server {
listen 80;
location / {
hello_world;
}
}NGINX Plus 구성을 다시 로드하고 간단한 요청으로 테스트하세요.
$ nginx -s reload$ curl http://localhost/
hello world
예: NAXSI 웹 애플리케이션 방화벽
NAXSI 는 XSS 및 SQL 주입 공격과 같은 의심스러운 요청을 식별하기 위해 휴리스틱과
점수 시스템을 사용하는 사용하기 쉬운 고성능 웹 애플리케이션 방화벽(WAF)입니다.
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.confload_module 파일 의 메인 컨텍스트에 지시문을 추가하여 NGINX Plus 코어에 모듈을 로드합니다 .
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 탐지를 트리거하고 요청을 차단하여
- /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 Plus의 올바른 작동을 방해하지 않는다는 것을 보증하며,
- 각 NGINX Plus 릴리스 또는 보안 릴리스가 있을 때 필요에 따라 업데이트합니다.
- 목록을 보려면 Dynamic Modules 페이지 에서 작성자 커뮤니티 로 필터링하세요 .
또한 NGINX는 NGINX Plus Certified Modules 프로그램에 참여하는 상업적 공급 업체의 모듈을 인증합니다.
이러한 모듈은 공급업체에서 배포하고 지원합니다.
목록을 보려면 Dynamic Modules 페이지 에서 작성자 Certified Partner 로 필터링하세요 .
NGINX는 사용자가 직접 컴파일한 모듈(다른 커뮤니티 모듈, NGINX Plus Certified Modules 프로그램에 속하지 않는
타사 공급업체가 제공하는 모듈, 사용자 지정 모듈)을 테스트하거나 지원하지 않습니다.
문제에 대한 기술 지원을 요청하는 경우 NGINX 지원팀은 지원되지 않는 모듈을 제거하고
기술 지원 프로세스의 일부로 오류를 재현하도록 요청할 수 있습니다.
이를 통해 오류가 지원되지 않는 모듈로 인해 발생했는지 여부를 확인할 수 있습니다.
요약
NGINX Plus의 동적 모듈 빌드 프로세스를 통해 NGINX 오픈 소스 모듈의 광범위한 생태계를 활용하고,
이를 풍부하고 완벽하게 지원되는 NGINX Plus 코어에서 실행할 수 있습니다.
현재 타사 확장 기능과 함께 NGINX 오픈 소스를 사용하고 있다면
이러한 확장 기능을 NGINX Plus로 컴파일하여 로드할 수 있을 가능성이 높습니다.
상업용 또는 커뮤니티 모듈을 개발하는 경우 새 빌드 프로세스는 사용자가 NGINX Plus로 모듈을 배포할 수 있음을 의미합니다.
상업용 모듈 인증에 대해 알아보려면 NGINX Plus 인증 모듈을 참조하세요 .
모듈 개발이나 해당 구성 셸 파일 업데이트에 도움이 필요하면 다음 리소스를 확인하세요.
- Evan Miller의 NGINX 모듈 개발을 위한 Emiller 가이드
- NGINX 개발자 Ruslan Ermilov의 동적 모듈 개발
- NGINX Wiki에서 NGINX 확장
- NGINX Wiki에서 정적 모듈을 동적 모듈로 변환
- NGINX 튜토리얼: Aaron Bedra의 모듈 개발
- 블로그에서 동적 모듈에 대한 설치 가능한 패키지 생성
위 내용과 같이 NGINX Plus 를 활용하여 Demo 가 필요하시면 하단의 전문가에게 상담받기 버튼을 클릭해주세요
전문가에게 상담받기
이 게시물은 NGINX Open Source 및 NGINX Plus에서 타사 동적 모듈을 사용하는 방법에 대한 2부작 시리즈의 일부입니다.
NGINX Open Source 1.11.5 및 NGINX Plus 릴리스 R11은 동적 모듈에 대한 바이너리 호환성을 도입했습니다.
이 문서에서는 개발 환경에서 NGINX Open Source 및 NGINX Plus와 함께 사용할 타사 모듈을 컴파일하는 방법을 설명합니다.
프로덕션 환경에서 타사 동적 모듈을 빌드, 배포 및 업그레이드하는 방법에 대한 지침은
Creating Installable Packages for Dynamic Modules를 참조하세요 .
간결하게 하기 위해, 이 게시물의 나머지 부분은 NGINX Plus에만 해당하며,
NGINX Plus와 NGINX Open Source의 차이가 관련 있는 경우는 예외입니다.
언급된 경우를 제외하고, NGINX Plus에 대한 모든 진술은 NGINX Open Source에도 적용됩니다.
동적 모듈 개요
NGINX Plus에 로드할 수 있는 모듈은 C로 작성되었으며 NGINX Wiki의 'NGINX 확장'에 설명된 API를 따릅니다.
언어 인터프리터에서 보안 솔루션에 이르기까지 다양한 타사 모듈의 대규모 생태계가 있으며
이 중 일부는 NGINX Plus에 포함되어 지원 됩니다 .
다른 타사 모듈과 직접 만든 모듈은 런타임에 독립적으로 컴파일하고 동적으로 NGINX Plus에 로드해야 합니다.
아래 두 예에서 설명한 대로 NGINX Open Source에 대해 빌드하여 이러한 모듈을 NGINX Plus에서 사용하도록 컴파일할 수 있습니다.
예: 간단한 "Hello World" 모듈
이 예제는 간단한 Hello World 모듈을 사용하여 모듈의 소스를 업데이트하고 NGINX Plus에 로드하는 방법을 보여줍니다.
"Hello World" 모듈은 hello_world간단한 메시지로 요청에 응답하는 간단한 지시문( )을 구현합니다.
1단계: NGINX 오픈 소스 릴리스 얻기
NGINX Plus 설치에 해당하는 NGINX Open Source 버전을 확인합니다. 이 예에서는 NGINX 1.11.5입니다.
$ nginx -vnginx version: nginx/1.11.5 (nginx-plus-r11)nginx.org/download 에서 해당 NGINX 오픈 소스 패키지를 다운로드하세요 .
$ wget https://nginx.org/download/nginx-1.11.5.tar.gz$ tar -xzvf nginx-1.11.5.tar.gz2단계: 모듈 소스 얻기
GitHub 에서 'Hello World' NGINX 모듈의 소스를 얻으세요 :
$ git clone https://github.com/perusio/nginx-hello-world-module.git모듈의 구성 셸 파일은 모듈이 어떻게 빌드되는지 정의하며, 그 형식은 동적 모듈의 경우와 NGINX 오픈 소스 바이너리에 정적으로 빌드되는 모듈의 경우와 다릅니다.
nginx-hello-world-module/config 파일을 수정하여 다음을 포함합니다.
ngx_addon_name=ngx_http_hello_world_module if test -n "$ngx_module_link"; then ngx_module_type=HTTPngx_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이전 포맷에서 모듈의 구성 파일을 업데이트하는 방법을 포함하여 동적 모듈을 컴파일하는 방법에 대한 자세한 내용은 NGINX Wiki를 참조하세요 .
3단계: 동적 모듈 컴파일
$ cd nginx-1.11.5/$ ./configure --with-compat --add-dynamic-module=../nginx-hello-world-module $ make modules4. 모듈 라이브러리( .so 파일)를 /etc/nginx/modules 에 복사합니다 .
$ sudo cp objs/ngx_http_hello_world_module.so /etc/nginx/modules/4단계: 모듈 로드 및 사용
NGINX Plus에 모듈을 로드하려면
nginx.confload_module 구성 파일 의 최상위(main) 컨텍스트에 지시문을 추가합니다
( or 컨텍스트 내부가 아님):httpstream
load_module modules/ngx_http_hello_world_module.so;
컨텍스트 에서 Hello World 모듈에서 제공하는 지시어가 있는 블록을 http추가합니다 .
위치에 대한 요청은 응답을 반환합니다 .locationhello_worldhello world
server { listen 80; location / { hello_world; } }NGINX Plus 구성을 다시 로드하고 간단한 요청으로 테스트하세요.
$ nginx -s reload$ curl http://localhost/ hello world예: NAXSI 웹 애플리케이션 방화벽
NAXSI 는 XSS 및 SQL 주입 공격과 같은 의심스러운 요청을 식별하기 위해 휴리스틱과
점수 시스템을 사용하는 사용하기 쉬운 고성능 웹 애플리케이션 방화벽(WAF)입니다.
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/modulesnginx.confload_module 파일 의 메인 컨텍스트에 지시문을 추가하여 NGINX Plus 코어에 모듈을 로드합니다 .
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의 올바른 작동을 확인할 수 있습니다.
실제 운영에 배포하는 경우 https://github.com/nbs-system/naxsi/tags 에서 서명된 NAXSI 릴리스를 다운로드하여 비슷한 방식으로 컴파일할 수도 있습니다.
NGINX Plus에서 동적 모듈을 지원하는 방법
참고: 이 섹션의 정보는 NGINX Plus에만 적용됩니다.
사전 빌드된 NGINX 오픈 소스 패키지 와 함께 제공되는 동적 모듈 세트는 NGINX Plus와 함께 제공되는 것과 다를 수 있습니다.
NGINX 오픈 소스와 함께 사용되는 동적 모듈은 NGINX 소스 코드 및 사전 빌드된 바이너리와 동일한 방식으로 지원 됩니다.
NGINX Plus는 모듈 저장소에서 직접 다운로드할 수 있는 여러 동적 모듈과 함께 제공됩니다.
목록은 동적 모듈 페이지를 참조하세요. 이러한 모듈은 두 가지 유형이 있습니다.
또한 NGINX는 NGINX Plus Certified Modules 프로그램에 참여하는 상업적 공급 업체의 모듈을 인증합니다.
이러한 모듈은 공급업체에서 배포하고 지원합니다.
목록을 보려면 Dynamic Modules 페이지 에서 작성자 Certified Partner 로 필터링하세요 .
NGINX는 사용자가 직접 컴파일한 모듈(다른 커뮤니티 모듈, NGINX Plus Certified Modules 프로그램에 속하지 않는
타사 공급업체가 제공하는 모듈, 사용자 지정 모듈)을 테스트하거나 지원하지 않습니다.
문제에 대한 기술 지원을 요청하는 경우 NGINX 지원팀은 지원되지 않는 모듈을 제거하고
기술 지원 프로세스의 일부로 오류를 재현하도록 요청할 수 있습니다.
이를 통해 오류가 지원되지 않는 모듈로 인해 발생했는지 여부를 확인할 수 있습니다.
요약
NGINX Plus의 동적 모듈 빌드 프로세스를 통해 NGINX 오픈 소스 모듈의 광범위한 생태계를 활용하고,
이를 풍부하고 완벽하게 지원되는 NGINX Plus 코어에서 실행할 수 있습니다.
현재 타사 확장 기능과 함께 NGINX 오픈 소스를 사용하고 있다면
이러한 확장 기능을 NGINX Plus로 컴파일하여 로드할 수 있을 가능성이 높습니다.
상업용 또는 커뮤니티 모듈을 개발하는 경우 새 빌드 프로세스는 사용자가 NGINX Plus로 모듈을 배포할 수 있음을 의미합니다.
상업용 모듈 인증에 대해 알아보려면 NGINX Plus 인증 모듈을 참조하세요 .
모듈 개발이나 해당 구성 셸 파일 업데이트에 도움이 필요하면 다음 리소스를 확인하세요.
위 내용과 같이 NGINX Plus 를 활용하여 Demo 가 필요하시면 하단의 전문가에게 상담받기 버튼을 클릭해주세요
전문가에게 상담받기