編集者 – 動的モジュールのサポートが初めてリリースされたこと(2016年2月、NGINX Open Source 1.9.11)を告知するブログ記事から、このページにリダイレクトされます。その記事で説明されているビルドプロセスは非推奨です。
この記事は、NGINX Open SourceおよびNGINX Plusでサードパーティ製の動的モジュールを使用する方法を解説する全2回シリーズの一部です。
- この記事では、NGINX Open SourceまたはNGINX Plusが実行時に読み込めるサードパーティ製ダイナミックモジュールをコンパイルする手順を、順を追って説明します。
- 2つ目の記事では、本番環境向けのサードパーティ製動的モジュールのビルドを自動化するためのガイダンスとツールを提供します。また、バージョン依存関係のチェック機能を備えた、サードパーティ製動的モジュールのインストール可能なパッケージを作成する方法について説明します。
NGINX Open Source 1.11.5およびNGINX Plus Release R11では、動的モジュールのバイナリ互換性が導入されました。この記事では、開発環境でNGINX Open SourceおよびNGINX Plusとともに使用するサードパーティ製モジュールをコンパイルする方法について説明します。本番環境でサードパーティ製の動的モジュールをビルド、デプロイ、アップグレードする手順については、「動的モジュール用のインストール可能なパッケージの作成」を参照してください。
簡潔にするため、以降ではNGINX Open Sourceとの違いが関係する場合を除き、NGINX Plusのみを取り上げます。特に記載がない限り、NGINX Plusに関する説明はすべてNGINX Open Sourceにも当てはまります。
動的モジュールの概要
NGINX PlusにロードできるモジュールはCで記述され、NGINX Wikiの「Extending NGINX」に記載されているAPIに準拠しています。サードパーティ製モジュールには、言語インタープリターからセキュリティソリューションまでを網羅する大規模なエコシステムがあり、その一部はNGINX Plusに同梱され、サポートされています。
その他のサードパーティ製モジュールや独自に作成したモジュールは、個別にコンパイルし、実行時にNGINX Plusへ動的にロードする必要があります。以下の2つの例に示すように、NGINX Open Sourceを使用してビルドすることで、NGINX Plusで使用できるようにこれらのモジュールをコンパイルできます。
- 対応するリリースのNGINX Open Sourceを入手
- モジュールのソースを入手し、必要に応じてモジュールの「config」ファイルを変更します
- 動的モジュールをビルドします。その際、NGINX Open Sourceリリースに対して、
--with-compat引数をconfigureコマンドに指定します - 生成された動的モジュールを読み込みます(.soファイル)をNGINX Plusに読み込み、組み込みモジュールと同様に使用します
例:シンプルな「Hello World」モジュール
この例では、シンプルな「Hello Worldモジュール」を使用して、モジュールのソースを更新し、NGINX Plusに読み込む方法を示します。「Hello World」モジュールには、リクエストに対して簡単なメッセージを返すシンプルなディレクティブ(hello_world)が実装されています。
ステップ1:NGINX Open Sourceリリースを入手
- インストールされているNGINX Plusに対応するNGINX Open Sourceのバージョンを確認します。この例では、NGINX 1.11.5です。
$ nginx -vnginx version: nginx/1.11.5 (nginx-plus-r11)- 対応する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:モジュールのソースコードを入手する
- 「Hello World」NGINXモジュールのソースをGitHubから取得します:
$ git clone https://github.com/perusio/nginx-hello-world-module.git- モジュールの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:動的モジュールをコンパイルする
- まず、
configureスクリプトを--with-compat引数を指定して実行します。これにより、NGINX Open SourceとNGINX Plusの両方でサポートされる標準ビルド環境が作成されます。次に、makemodulesを実行してモジュールをビルドします:
$ cd nginx-1.11.5/$ ./configure --with-compat --add-dynamic-module=../nginx-hello-world-module
$ make modules- モジュールライブラリ(.soファイル)を/etc/nginx/modulesにコピーします:
$ sudo cp objs/ngx_http_hello_world_module.so /etc/nginx/modules/ステップ4:モジュールの読み込みと使用
- NGINX Plusにモジュールをロードするには、
load_moduleディレクティブをnginx.conf構成ファイルの最上位(main)コンテキストに追加します(httpまたはstreamコンテキスト内には追加しないでください):
load_module modules/ngx_http_hello_world_module.so;- In the
httpコンテキストに、Hello Worldモジュールが提供するhello_worldディレクティブを含むlocationブロックを追加します。このロケーションへのリクエストには、helloworldというレスポンスが返されます。
server {
listen 80;
location / {
hello_world;
}
}- NGINX Plusの設定を再読み込みし、簡単なリクエストでテストします:
$ nginx -s reload$ curl http://localhost/
hello world例:NAXSI Web Application Firewall
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
$ make modules
$ sudo cp objs/ngx_http_naxsi_module.so /etc/nginx/modulesモジュールをNGINX Plusコアに読み込むには、load_moduleディレクティブをnginx.confファイルのmainコンテキストに追加します:
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;
}2つの簡単なHTTPリクエストを使用して、NAXSIが正しく動作していることを確認できます。
curlhttp://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には複数の動的モジュールが付属しており、モジュールリポジトリから直接ダウンロードすることもできます。一覧については、「Dynamic Modules」ページを参照してください。これらのモジュールには、次の2種類があります。
- NGINX Plusモジュールは、NGINXエンジニアリングチームが開発または保守、あるいはその両方を行っています。技術上の理由(追加の依存関係がある場合など)、またはプレビュー段階にあるため、NGINX Plusには含まれていません。プレビューモジュールは現在も開発中のため、導入には細心の注意が必要です。それ以外のNGINX Plusモジュールは、NGINXによる完全なサポートの対象です。リストを表示するには、NGINXを作成者としてDynamic Modulesページでフィルタリングしてください。
- NGINX Plus認定コミュニティモジュールは、NGINXがテストおよび配布する一般的なサードパーティ製モジュールであり、インストールと基本設定に関するサポートを提供しています。これらのモジュールがNGINX Plusの正常な動作を妨げないことを保証し、NGINX Plusの各リリース時またはセキュリティリリース時に、必要に応じて更新します。一覧を表示するには、Communityを作成者として指定し、Dynamic Modulesページでフィルタリングしてください。
さらに、NGINXは、NGINX Plus Certified Modulesプログラムに参加している商用ベンダーのモジュールを認定しています。これらのモジュールは、各ベンダーが配布およびサポートしています。リストを表示するには、Certified Partnerを作成者として指定し、Dynamic Modulesページでフィルタリングしてください。
NGINXでは、お客さまが独自にコンパイルしたモジュール(その他のコミュニティモジュール、NGINX Plus Certified Modulesプログラムに参加していないサードパーティベンダーが提供するモジュール、カスタムモジュール)のテストおよびサポートは行っていません。問題についてテクニカルサポートを依頼された場合、NGINXサポートチームは、サポート対象外のモジュールが問題の原因かどうかを確認するため、テクニカルサポートプロセスの一環として、そのモジュールを削除して問題を再現するようお願いすることがあります。
まとめ
NGINX Plusの動的モジュールのビルドプロセスにより、幅広いNGINX Open Sourceモジュールのエコシステムを活用し、豊富な機能と包括的なサポートを備えたNGINX Plusコア上で実行できます。
現在、NGINX Open Sourceでサードパーティ製拡張機能を使用している場合、ほとんどの場合、これらの拡張機能をコンパイルしてNGINX Plusにロードできます。
商用モジュールまたはコミュニティモジュールを開発している場合、新しいビルドプロセスにより、ユーザーはそのモジュールをNGINX Plusでデプロイできます。商用モジュールの認定については、「NGINX Plus認定モジュール」をご覧ください。
モジュールの開発や、そのconfigシェルファイルの更新についてサポートが必要な場合は、以下のリソースをご確認ください。
- EmillerによるNGINXモジュール開発ガイド(Evan Miller著)
- 動的モジュールの開発(NGINX開発者Ruslan Ermilov著)
- NGINXの拡張(NGINX Wiki)
- 静的モジュールから動的モジュールへの変換(NGINX Wiki)
- NGINXチュートリアル:モジュールの開発(Aaron Bedra著)
- 動的モジュール用のインストール可能なパッケージの作成(F5ブログ)
コミュニティからの支援を得るには、NGINX Developersメーリングリストをご利用ください。また、F5のProfessional Servicesチームも喜んでサポートいたします。
NGINX Plusの動的モジュールを実際にお試しいただくには、今すぐ30日間の無料トライアルを開始するか、ユースケースについてご相談ください。
著者について

関連するブログ記事
チュートリアル:NGINXを使用してアプリケーション向けにOpenTelemetryを構成する
OpenTelemetryを使用してNGINXサーバーの状態と健全性をより明確に把握することで、問題のトラブルシューティングを行い、Webアプリケーションのパフォーマンスを向上できます。
AkitaのNGINX Plus認定モジュールでAPIエンドポイントの問題を特定・修正
Akita SoftwareのAPIオブザーバビリティ向け新しいNGINX Plus Certified Moduleを活用して、APIエンドポイントの問題をより迅速に特定し、修正できます。
JavaプロジェクトをスキャフォールディングしてKubernetesネイティブアプリを構築する方法
Red HatのシニアプリンシパルデベロッパーアドボケイトであるDaniel Oh氏が、Javaプロジェクトをゼロから構築するためのひな形を作成し、Kubernetesネイティブアプリケーションとしてビルドする方法を解説します。
F5 NGINXaaS for Azureのご紹介:Microsoft Azureでネイティブに利用できるSaaS型ロードバランシング
NGINXaaS for Azureは、NGINX PlusをAzureネイティブのSaaSとして利用できるサービスです。NGINXの設定を容易にリフト&シフトできるため、クラウド導入とモダンアプリの展開を加速できます。

SELinuxでNGINXおよびNGINX Plusを使用する
Red Hat Enterprise Linux(RHEL)および関連ディストリビューションでSecurity-Enhanced Linux(SELinux)を有効にすると、デフォルト設定によりNGINXとNGINX Plusの一部の操作が制限されます。この記事では、すべての機能を利用できるようにSELinuxの設定を変更する方法について説明します。
NGINX PlusによるAWS Auto Scalingグループの負荷分散
新しいnginx-asg-sync統合ソフトウェアにより、NGINX PlusはAWS Auto Scalingグループの負荷を直接分散できるため、クラウドでの負荷分散がさらに柔軟になります