NGINXおよびNGINX Plus向けサードパーティ製動的モジュールのコンパイル

NGINX | 2016年10月25日

編集者 – 動的モジュールのサポートが初めてリリースされたこと(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で使用できるようにこれらのモジュールをコンパイルできます。

  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構成ファイルの最上位(main)コンテキストに追加します(httpまたはstreamコンテキスト内には追加しないでください):
load_module modules/ngx_http_hello_world_module.so;
  1. In the httpコンテキストに、Hello Worldモジュールが提供するhello_worldディレクティブを含むlocationブロックを追加します。このロケーションへのリクエストには、hello worldというレスポンスが返されます。
server {
    listen 80;

    location / {
         hello_world;
    }
}
  1. 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が正しく動作していることを確認できます。

  • 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には複数の動的モジュールが付属しており、モジュールリポジトリから直接ダウンロードすることもできます。一覧については、「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シェルファイルの更新についてサポートが必要な場合は、以下のリソースをご確認ください。

コミュニティからの支援を得るには、NGINX Developersメーリングリストをご利用ください。また、F5のProfessional Servicesチームも喜んでサポートいたします。

NGINX Plusの動的モジュールを実際にお試しいただくには、今すぐ30日間の無料トライアルを開始するか、ユースケースについてご相談ください。


共有
タグ: F5 NGINX, Tech, 2016

著者について

Owen Garrett
Owen Garrettプロダクトマネジメント担当シニアディレクター

Owen Garrettのその他のブログ記事

関連するブログ記事

チュートリアル:NGINXを使用してアプリケーション向けにOpenTelemetryを構成する
NGINX | 2024/01/18

チュートリアル:NGINXを使用してアプリケーション向けにOpenTelemetryを構成する

OpenTelemetryを使用してNGINXサーバーの状態と健全性をより明確に把握することで、問題のトラブルシューティングを行い、Webアプリケーションのパフォーマンスを向上できます。

AkitaのNGINX Plus認定モジュールでAPIエンドポイントの問題を特定・修正
NGINX | 2023/05/31

AkitaのNGINX Plus認定モジュールでAPIエンドポイントの問題を特定・修正

Akita SoftwareのAPIオブザーバビリティ向け新しいNGINX Plus Certified Moduleを活用して、APIエンドポイントの問題をより迅速に特定し、修正できます。

JavaプロジェクトをスキャフォールディングしてKubernetesネイティブアプリを構築する方法
NGINX | 2023/02/09

JavaプロジェクトをスキャフォールディングしてKubernetesネイティブアプリを構築する方法

Red HatのシニアプリンシパルデベロッパーアドボケイトであるDaniel Oh氏が、Javaプロジェクトをゼロから構築するためのひな形を作成し、Kubernetesネイティブアプリケーションとしてビルドする方法を解説します。

F5 NGINXaaS for Azureのご紹介:Microsoft Azureでネイティブに利用できるSaaS型ロードバランシング
NGINX | 2022/05/24

F5 NGINXaaS for Azureのご紹介:Microsoft Azureでネイティブに利用できるSaaS型ロードバランシング

NGINXaaS for Azureは、NGINX PlusをAzureネイティブのSaaSとして利用できるサービスです。NGINXの設定を容易にリフト&シフトできるため、クラウド導入とモダンアプリの展開を加速できます。

SELinuxでNGINXおよびNGINX Plusを使用する
NGINX | 2018/08/17

SELinuxでNGINXおよびNGINX Plusを使用する

Red Hat Enterprise Linux(RHEL)および関連ディストリビューションでSecurity-Enhanced Linux(SELinux)を有効にすると、デフォルト設定によりNGINXとNGINX Plusの一部の操作が制限されます。この記事では、すべての機能を利用できるようにSELinuxの設定を変更する方法について説明します。

NGINX PlusによるAWS Auto Scalingグループの負荷分散
NGINX | 2017/03/06

NGINX PlusによるAWS Auto Scalingグループの負荷分散

新しいnginx-asg-sync統合ソフトウェアにより、NGINX PlusはAWS Auto Scalingグループの負荷を直接分散できるため、クラウドでの負荷分散がさらに柔軟になります