NGINX PlusとMinioによるエンタープライズグレードのクラウドストレージ

NGINX | 2017年1月19日

本記事は、Minioのソフトウェア開発者であるNitish Tiwari氏によるゲストブログです。Minioは、クラウドアプリケーションと、アプリケーションの開発およびデリバリーにおけるDevOpsアプローチに特化した分散オブジェクトストレージサーバーです。Nitish氏は、特にストレージや分散システムなど、ソフトウェアベースのインフラストラクチャに関心を持っています。

本記事では、NitishがNGINXとNGINX PlusをMinioサーバーのリバースプロキシおよびロードバランサーとして使用する方法を解説します。内容はNGINXとNGINX Plusのどちらにも同様に適用できますが、簡潔にするため、本文ではNGINX Plusとのみ表記します。

オブジェクトストレージの設計

ほぼすべてのアプリケーションにストレージが必要ですが、その要件や利用方法はアプリケーションによって異なります。たとえば、ドキュメントストアは、規模が小さいうちは頻繁な読み取りリクエストに対応する必要がない場合もありますが、時間の経過とともに拡張できる必要があります。一方、画像ギャラリーのようなアプリケーションでは、リクエストへの迅速な対応と、時間の経過に応じた拡張性の両方が求められます。

こうした微妙な違いがあるため、ストレージの設定は容易ではありません。しかし、悲観する必要はありません。非構造化データのデフォルトの保存方法としてオブジェクトストレージが登場したことで、HTTPがデフォルトの通信方式となり、アプリケーションとストレージ間の通信方法が標準化されました。

それでも、疑問は残ります。アプリケーションの要件に合わせながら、柔軟性も備えたオブジェクトストレージ環境を構築するには、どうすればよいのでしょうか。

オブジェクトストレージではHTTPサーバーとクライアントを使用するため、NGINX Plusのような汎用性の高いWebサーバーをフロントエンドに配置してHTTPトラフィックを処理するのが合理的です。バックエンドでは、Minioのような軽量のオブジェクトストレージサーバーを使用して、拡張性の高いストレージを提供できます。このようなシステムの柔軟性が、エンタープライズグレードのサービスを構築する鍵となります。

NGINX Plusは、クラウドベースのオブジェクトストレージサーバーMinioの分散インスタンスに効果的なロードバランサーです
NGINX PlusはSSL/TLSクライアント接続を終端し、Minioクラウドストレージサーバーの負荷を分散します

NGINX Plusを使用すると、管理者は受信トラフィックの負荷分散だけでなく、キャッシュ、スロットリング、SSL/TLS終端、さらにはさまざまなパラメーターに基づくトラフィックのフィルタリングも行えます。一方、Minioは、Amazon S3と互換性のある軽量なオブジェクトストレージサーバーを提供します。

MinIOはAIストレージ向けに構築されており、写真、動画、ログファイル、バックアップ、VMイメージ、コンテナイメージなどの非構造化データの保存に最適です。Minioサーバーは軽量なため、Node.js、Redis、MySQLと同様にアプリケーションスタックに組み込めます。また、Minioは分散モードにも対応しており、異なるマシン上にあるものも含め、複数のドライブをプールして単一のオブジェクトストレージサーバーとして利用できます。

この記事では、さまざまなユースケースにおけるNGINX Plusの機能をいくつか紹介し、Minioと組み合わせて、本番環境に対応した拡張性、可用性、安定性の高いオブジェクトストレージシステムを構築する方法を解説します。

リバースプロキシおよびロードバランサーとしてのNGINX Plus

NGINX Plusは、リバースプロキシサーバーとして広く知られています。では、Minioにリバースプロキシが必要なのはなぜでしょうか。いくつかのユースケースを見てみましょう。

  • 1台以上のMinioサーバーの前段にNGINX Plusリバースプロキシを配置すると、クライアントやアプリケーションを更新することなく、必要に応じてMinioサーバーインスタンスを別のマシンや場所に移動できます。
  • NGINX Plusは受信トラフィックを負荷分散し、分散配置されたMinioサーバーインスタンスに均等に振り分けることができます。
  • NGINX Plusプロキシは、Minio Client(mc)のmirrorコマンドを使用することで、Minioによる高可用性オブジェクトストレージ構成の一部として利用できます。

NGINX Plusは、クライアントからのリクエストをバックエンドサーバーに渡すことで、クライアントトラフィックをリバースプロキシします。バックエンドサーバーは、proxy_passディレクティブで指定されたURLでリクエストを待ち受けます。次の構成スニペットでは、スタンドアロンのMinioインスタンスがlocalhostで実行されているため、http://localhost:9000でアクセスできます。www.example.comの最上位ディレクトリ(/)にポート80で届くすべてのリクエストは、Minioに渡されます。NGINX Plusは、Hostヘッダーを元のリクエストの値に明示的に設定します。

server {    listen 80;
    server_name www.example.com;

    location / {
        proxy_set_header Host $http_host;
        proxy_pass       http://localhost:9000;
    }
}

複数のMinioサーバーがある場合は、それらをupstream設定ブロックに列挙し、proxy_passディレクティブでアップストリームグループを参照することで、サーバー間のトラフィックを負荷分散します。

upstream minio_servers { server minio-server-1:9000; server minio-server-2:9000; }

server {
    listen 80;
    server_name www.example.com;

    location / {
        proxy_set_header Host $http_host;
        proxy_pass       http://minio_servers;
    }
}

NGINXまたはNGINX PlusをMinioのプロキシとして設定する方法の詳細については、Minioのドキュメントをご覧ください。

SSL/TLS終端

現在では多くのWebトラフィックでHTTPSがデフォルトのプロトコルになりつつあるため、Minioには単なるHTTPサーバーではなく、HTTPSサーバーを導入するのが合理的です。NGINX PlusをHTTPSサーバーとしてセットアップするのは比較的簡単です。まずSSL/TLS証明書が必要です。Let’s Encryptは無料のSSL/TLS証明書を提供しており、NGINX Plusと連携できます。

次に、NGINX Plusの設定ファイルを編集します。ここでは、sslパラメーターをlistenディレクティブに指定し、それをserverブロックに記述します。続いて、サーバー証明書と秘密鍵を含むファイルを指定します。

server {    listen 80;
    server_name www.example.com;
    return 301 https://www.example.com$request_uri;
}

server {
    listen 443 ssl;
    server_name         www.example.com;

    ssl_certificate www.example.com.crt; ssl_certificate_key www.example.com.key;
    ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers         HIGH:!aNULL:!MD5;

    location / {
        proxy_set_header Host $http_host;
        proxy_pass       http://localhost:9000;
    }
}

SSL/TLS終端の詳細については、NGINX Plus管理者ガイドを参照してください。

キャッシュ

オブジェクトストレージサーバーは高速とは言えませんが、クライアントへの応答まで遅くなるとは限りません。NGINX Plusサーバーでキャッシュを有効にすると、頻繁にアクセスされるデータが保存されるため、リクエストをバックエンドサーバーに転送することなく、クライアントに即座に返すことができます。

仕組みは次のとおりです。NGINX PlusのWebキャッシュはクライアントとMinioの間に配置され、リクエストされた各コンテンツファイルのコピーを保存します。クライアントがキャッシュに保存されているコンテンツをリクエストすると、NGINX PlusはMinioにアクセスせず、コンテンツを直接返します。これにより、クライアントへの応答時間が短縮されるとともに、Minioサーバーの負荷も軽減されます。

Minio用のNGINX Plusキャッシュは、proxy_cache_pathディレクティブとproxy_cacheディレクティブを使用して設定します。proxy_cache_pathディレクティブではキャッシュの場所と構成を設定し、proxy_cacheディレクティブではキャッシュを有効にします。詳細については、「A Guide to Caching with NGINX and NGINX Plus」を参照してください。

proxy_cache_path /path/to/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;

server {
    # ...
    location / {
        proxy_cache my_cache;
        proxy_set_header Host $http_host;
        proxy_pass       http://localhost:9000;
    }
}

スロットリング

ビジネス上またはセキュリティ上の理由から、リクエストを制限する必要がある場合があります。NGINX Plusでは、利用可能な帯域幅、リクエスト数、または接続数を制限できます。

帯域幅を制限するには、limit_rateディレクティブを使用します。次の例では、ダウンロード速度を毎秒200 KBに制限します。

server {    # ...
    location /images/ {
        limit_rate 200k;
        # ...
    }
}

リクエストを制限するには、limit_reqディレクティブとlimit_req_zoneディレクティブを使用します。次の例では、20件のバーストリクエストを許容しながら、一意のIPアドレスごとに1秒あたり10件までに制限します。

limit_req_zone $binary_remote_addr zone=my_req_limit:10m rate=10r/s;
server {
    # ...
    location /images/ {
        limit_req zone=my_req_limit burst=20;
        # ...
    }
}

接続数を制限するには、limit_connディレクティブとlimit_conn_zoneディレクティブを使用します。この例では、一意のIPアドレスごとの同時接続数を5に制限します。

limit_conn_zone $binary_remote_addr zone=my_conn_limit:10m;
server {
    # ...
    location /images/ {
        limit_conn my_conn_limit 5;
        # ...
    }
}

詳細については、「NGINX Plus管理ガイド」を参照してください。

まとめ

本記事では、ロードバランシングに使用できるNGINX Plusの複数の機能について、特にMinioオブジェクトストレージサーバーのフロントエンドでロードバランシングを行う方法を紹介しました。NGINX PlusとMinioを組み合わせることで、アプリケーション要件に合わせた柔軟なオブジェクトストレージサーバーを構築できます。

NGINX Plusによる負荷分散の詳細については、以下のブログ記事やその他のリソースをご覧ください。

NGINX Plusを実際にお試しいただくには、今すぐ30日間の無料トライアルを開始するか、ユースケースについてお問い合わせください。


共有

関連するブログ記事

チュートリアル: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グループの負荷を直接分散できるため、クラウドでの負荷分散がさらに柔軟になります