編集者– 動的モジュール サポートの最初のリリース (NGINX Open Source 1.9.11、2016 年 2 月) を発表したブログ投稿は、ここにリダイレクトされます。 その投稿で説明されているビルド プロセスは非推奨です。
この投稿は、NGINX Open Source および NGINX Plus でサードパーティの動的モジュールを使用する方法に関する 2 部構成のシリーズの一部です。
NGINX Open Source 1.11.5 およびNGINX Plus Release R11では、動的モジュールのバイナリ互換性が導入されました。 この記事では、開発環境で NGINX Open Source および NGINX Plus で使用するためにサードパーティ モジュールをコンパイルする方法について説明します。 運用環境でサードパーティの動的モジュールを構築、デプロイ、およびアップグレードする手順については、 「動的モジュールのインストール可能なパッケージの作成」を参照してください。
簡潔にするために、この投稿の残りの部分では、NGINX Plus と NGINX Open Source の違いが関係する場合を除き、NGINX Plus のみについて説明します。 特に記載のない限り、NGINX Plus に関するすべての記述は NGINX Open Source にも適用されます。
NGINX Plus にロードできるモジュールは C で記述されており、NGINX Wiki の「NGINX の拡張」で説明されている API に準拠しています。 言語インタープリターからセキュリティ ソリューションに至るまで、サードパーティ モジュールの大規模なエコシステムがあり、その一部は NGINX Plus に含まれ、サポートされています。
その他のサードパーティ モジュールや独自に作成したモジュールは、個別にコンパイルし、実行時に NGINX Plus に動的にロードする必要があります。 以下の 2 つの例に示すように、これらのモジュールを NGINX Open Source に対してビルドすることで、NGINX Plus で使用するためにコンパイルできます。
configure
コマンドに--with-compat
引数を指定して、NGINXオープンソースリリースに対して動的モジュールをビルドします。この例では、単純なHello World モジュールを使用して、モジュールのソースを更新し、NGINX Plus にロードする方法を示します。 「Hello World」モジュールは、単純なメッセージでリクエストに応答する単純なディレクティブ ( hello_world
) を実装します。
NGINX Plus インストールに対応する NGINX オープンソース バージョンを確認します。 この例では、NGINX 1.11.5 です。
$ nginx -v nginx バージョン: 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
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=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
動的モジュールのコンパイルに関する詳細情報(モジュールの設定ファイルを古い形式から更新する手順を含む)については、 NGINX Wiki を参照してください。
まず--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 $モジュールを作成する
モジュール ライブラリ ( .soファイル) を/etc/nginx/modulesにコピーします。
$ sudo cp objs/ngx_http_hello_world_module.so /etc/nginx/modules/
モジュールを NGINX Plus にロードするには、 nginx.conf設定ファイルの最上位 (メイン) コンテキスト ( http
またはstream
コンテキスト内ではない) にload_module
ディレクティブを追加します。
モジュールモジュール/ngx_http_hello_world_module.so をロードします。
http
コンテキストで、Hello World モジュールによって提供されるhello_world
ディレクティブを使用してlocation
ブロックを追加します。 場所へのリクエストは、 hello
world という
応答を返します。
サーバー {
listen 80;
location / {
hello_world;
}
}
NGINX Plus の設定をリロードし、簡単なリクエストでテストします。
$ nginx -s リロード$ curl http://localhost/ hello world
NAXSI は、ヒューリスティックとスコアリング システムを使用して XSS や SQL インジェクション攻撃などの疑わしいリクエストを識別する、使いやすく高性能な Web アプリケーション ファイアウォール (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 $モジュールを作成$ 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
にメッセージを記録します。実稼働環境での展開では、署名された NAXSI リリースをhttps://github.com/nbs-system/naxsi/tagsからダウンロードし、同様の方法でコンパイルすることもできます。
注記: このセクションの情報は、NGINX Plus にのみ適用されます。 ビルド済みの NGINX オープンソース パッケージに同梱されている動的モジュールのセットは、NGINX Plus に同梱されているものとは異なる場合があります。 NGINX Open Source で使用される動的モジュールは、NGINX ソース コードやビルド済みバイナリと同じようにサポートされます。
NGINX Plus には多数の動的モジュールが付属しており、モジュール リポジトリから直接ダウンロードすることもできます。 リストについては、動的モジュールのページを参照してください。 これらのモジュールには 2 つのタイプがあります。
さらに、NGINX は、 NGINX Plus 認定モジュールプログラムに参加している商用ベンダーのモジュールを認定します。 これらのモジュールはベンダーによって配布およびサポートされます。 リストを表示するには、動的モジュールページで著者の認定パートナー別にフィルタリングします。
NGINX は、ユーザーが独自にコンパイルしたモジュール (他のコミュニティ モジュール、NGINX Plus 認定モジュール プログラムに含まれないサードパーティ ベンダーが提供するモジュール、カスタム モジュール) をテストまたはサポートしません。 問題についてテクニカル サポートを依頼する場合、NGINX サポート チームは、テクニカル サポート プロセスの一環として、サポートされていないモジュールを削除して障害を再現するよう依頼することがあります。これにより、障害の原因がサポートされていないモジュールであるかどうかを確認できます。
NGINX Plus の動的モジュール ビルド プロセスを使用すると、NGINX オープンソース モジュールの広範なエコシステムを活用し、機能豊富で完全にサポートされている NGINX Plus コア上でモジュールを実行できます。
現在、サードパーティの拡張機能を備えた NGINX Open Source を使用している場合、これらの拡張機能はコンパイルされ、NGINX Plus にロードできる可能性が高くなります。
商用モジュールまたはコミュニティ モジュールを開発する場合、新しいビルド プロセスにより、ユーザーは NGINX Plus を使用してモジュールをデプロイできるようになります。 商用モジュールの認定については、 「NGINX Plus 認定モジュール」を参照してください。
モジュールの開発やその構成シェル ファイルの更新に関してサポートが必要な場合は、次のリソースを参照してください。
NGINX 開発者メーリング リストはコミュニティ サポートの頼りになる場所であり、弊社のプロフェッショナル サービス チームも喜んでサポートいたします。
NGINX Plus で動的モジュールを実際に試すには、今すぐ30 日間の無料トライアルを開始するか、弊社にお問い合わせの上、使用事例についてご相談ください。
「このブログ投稿には、入手できなくなった製品やサポートされなくなった製品が参照されている場合があります。 利用可能な F5 NGINX 製品およびソリューションに関する最新情報については、 NGINX 製品ファミリーをご覧ください。 NGINX は現在 F5 の一部です。 以前の NGINX.com リンクはすべて、F5.com の同様の NGINX コンテンツにリダイレクトされます。"