開発者ドキュメント

Ubuntu16.04でNginxを使用してDigitalOceanスペースをプロキシする方法

注:このチュートリアルが公開されて以来、DigitalOcean Spacesは、カスタマイズ可能なエンドポイントサブドメインを備えた無料のCDNオプションを追加しました。 このCDN機能は、キャッシュ、カスタムドメイン、SSL、アセットをユーザーに近づけるなど、以下で説明するほとんどの機能を提供します。

CDN を有効にし、 CDNエンドポイントをカスタマイズする方法については、公式Spaces製品ドキュメントをお読みください。

序章

DigitalOcean Spacesは、S3APIと互換性のあるオブジェクトストレージサービスです。 このチュートリアルでは、Nginxを使用してSpace上のオブジェクトのリクエストをプロキシする方法を示します。 NginxはユーザーからHTTP(S)リクエストを受信し、それらをSpacesサービスに渡します。Spacesサービスは結果をNginxを介して送り返します。

Spacesの前にNginxプロキシを配置する理由は、次のとおりです。

このチュートリアルでは、独自のドメインでリクエストに応答するようにNginxを設定し(オプションのLet’s Encrypt SSL証明書を使用)、それらのリクエストをpublicアセットのあるスペースに転送します。 次に、キャッシュを追加して、頻繁にアクセスされるオブジェクトに対する後続の応答を高速化します。

前提条件

このチュートリアルを完了するには、次のものが必要です。

プロキシの設定

UbuntuにNginxをデフォルトでインストールすると、すべてのリクエストに対して Welcome toNginxプレースホルダーページが返されます。 ドメインへのリクエストで何か他のことをするようにNginxに指示するために、いくつかの新しい構成を追加する必要があります。

これを行うには、で新しい構成ファイルを開きます /etc/nginx/sites-available:

  1. sudo nano /etc/nginx/sites-available/assets.example.com

これにより、空のファイルが開きます。 nano テキストエディタ。 次の構成で貼り付けます。強調表示された部分を、独自のドメイン名とスペースのURLに置き換えてください。

/etc/nginx/sites-available/assets.example.com
server {
    listen 80;
    listen [::]:80;
    server_name assets.example.com;

    location / {
        proxy_pass https://example.nyc3.digitaloceanspaces.com/;
        proxy_hide_header      Strict-Transport-Security;
    }
}

ファイルを保存し、完了したらエディタを終了します。 これは標準のNginxです server ブロック。 まず、ポートをリッスンするように指示します 80 IPv4とIPv6の両方で、 server_name Nginxが応答する必要があります。

次に、 location ブロック。 このブロック内のすべての構成ディレクティブ( {} 中かっこ)は特定のURLにのみ適用されます。 この場合、指定します /、ルートURLであるため、すべての場所がこのブロックと一致します。

The proxy_pass ディレクティブは、指定されたサーバーにリクエストを渡すようにNginxに指示します。 The proxy_hide_header ラインストリップ Strict-Transport-Security 応答をクライアントに返す前のヘッダー。 Spacesはこのヘッダーを使用して、すべての接続をHTTPSに強制します。 サイトがHTTP接続とHTTPS接続の両方でアクセス可能である場合、このヘッダーをユーザーに渡すと、意図しない結果が生じる可能性があります。

構成が設定されたので、それを有効にする必要があります。 これは、構成ファイルへのリンクを作成することによって行われます。 /etc/nginx/sites-enabled/ ディレクトリ:

  1. sudo ln -s /etc/nginx/sites-available/assets.example.com /etc/nginx/sites-enabled/

構成構文を確認するには、次を実行します nginx -t ルートとして:

  1. sudo nginx -t
Output
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful

最後に、Nginxをリロードして、新しい構成を取得します。

  1. sudo systemctl reload nginx

構成ファイルを設定したら、プロキシをテストしましょう。

プロキシのテスト

を使用してプロキシ接続をテストできます curl コマンドラインで。 curl -I 応答のHTTPヘッダーのみを返します。 これは、物事がうまく機能していることを判断するのに十分です。

まず、 digitaloceanspaces.com URLを使用して、スペースから直接オブジェクトをフェッチします。 使用します example.png ファイル:

  1. curl -I https://example.nyc3.digitaloceanspaces.com/example.png
Output
HTTP/1.1 200 OK Content-Length: 81173 Accept-Ranges: bytes Last-Modified: Tue, 28 Nov 2017 21:19:37 GMT ETag: "7b2d05a5bd1bfeebcac62990daeafd14" x-amz-request-id: tx000000000000000002398-005a1edfcd-afba2-nyc3a Content-Type: image/png Date: Wed, 29 Nov 2017 16:26:53 GMT Strict-Transport-Security: max-age=15552000; includeSubDomains; preload

で見ることができます 200 OK 出力の最初の行で、これは成功した要求でした。 サーバーはファイルのサイズを返しました(Content-Length)、ファイルタイプ(Content-Type)およびその他の日付およびキャッシュ関連の情報。

次に、プロキシを介して同じファイルをフェッチします。

  1. curl -I http://assets.example.com/example.png
Output
HTTP/1.1 200 OK Server: nginx/1.10.3 (Ubuntu) Date: Wed, 29 Nov 2017 16:27:24 GMT Content-Type: image/png Content-Length: 81173 Connection: keep-alive Accept-Ranges: bytes Last-Modified: Tue, 28 Nov 2017 21:19:37 GMT ETag: "7b2d05a5bd1bfeebcac62990daeafd14" x-amz-request-id: tx00000000000000000a045-005a1edfec-a89a3-nyc3a

応答はほとんど同じです。 主な変更点は Server Nginxを識別するヘッダー。 出力が類似している場合、プロキシは正しく機能しています。

次のステップでは、プロキシとSpacesの間の帯域幅の使用を減らし、応答時間を短縮するためにキャッシュを設定します。

キャッシングの設定

応答をキャッシュするには、Nginxにキー、メタデータ、および実際の応答コンテンツを保存する場所が必要です。 システムにキャッシュディレクトリを設定します /tmp ディレクトリ。 そのために、構成スニペットを新しいファイルに追加します。 /etc/nginx/conf.d/. 今すぐそのファイルを開きます:

  1. sudo nano /etc/nginx/conf.d/example-cache.conf

次の行に貼り付けて、ファイルを保存して閉じます。

/etc/nginx/conf.d/example-cache.conf
proxy_cache_path /tmp/example-cache/ levels=1:2 keys_zone=example-cache:16m max_size=10g inactive=60m use_temp_path=off;

この行は、キャッシュのいくつかの特性を定義します。 オプションを実行してみましょう:

キャッシュを定義したので、サーバーブロックでキャッシュを有効にし、いくつかの追加オプションを設定する必要があります。 サイトの構成ファイルを再度開きます。

  1. sudo nano /etc/nginx/sites-available/assets.example.com

あなたの最後に以下を追加します location / ブロック(後 proxy_hide_header ディレクティブ、ただしクロージング前 } ブラケット):

/etc/nginx/sites-available/assets.example.com
. . .
        proxy_cache            example-cache;
        proxy_cache_valid      200 60m;
        proxy_cache_use_stale  error timeout updating http_500 http_502 http_503 http_504;
        proxy_cache_revalidate on;
        proxy_cache_lock       on;

        proxy_ignore_headers   Set-Cookie;
        add_header             X-Cache-Status $upstream_cache_status;
. . .

ファイルを保存して閉じます。 これらの構成オプションを1つずつ見ていきましょう。

これで、構成にエラーがないことを確認する準備が整いました。それが成功した場合は、Nginxをリロードします。

  1. sudo nginx -t
  2. sudo systemctl reload nginx

キャッシュを設定したら、再度テストして、キャッシュが期待どおりに機能していることを確認できます。

キャッシュのテスト

キャッシュが機能していることを確認するには、 curl もう一度、そして探してください X-Cache-Status ヘッダ:

  1. curl -I http://assets.example.com/example.png
Output
HTTP/1.1 200 OK Server: nginx/1.10.3 (Ubuntu) Date: Wed, 29 Nov 2017 18:40:28 GMT Content-Type: image/png Content-Length: 81173 Connection: keep-alive Last-Modified: Tue, 28 Nov 2017 21:19:37 GMT ETag: "7b2d05a5bd1bfeebcac62990daeafd14" x-amz-request-id: tx000000000000000013841-005a1eff1b-a89e4-nyc3a X-Cache-Status: MISS Accept-Ranges: bytes

最初のリクエストは MISS. もう一度試してください:

  1. curl -I http://assets.example.com/example.png
Output
HTTP/1.1 200 OK Server: nginx/1.10.3 (Ubuntu) Date: Wed, 29 Nov 2017 18:40:53 GMT Content-Type: image/png Content-Length: 81173 Connection: keep-alive Last-Modified: Tue, 28 Nov 2017 21:19:37 GMT ETag: "7b2d05a5bd1bfeebcac62990daeafd14" x-amz-request-id: tx000000000000000013841-005a1eff1b-a89e4-nyc3a X-Cache-Status: HIT Accept-Ranges: bytes

A HIT! 現在、Spacesからオブジェクトをプロキシしてキャッシュしています。 次のステップでは、プロキシへの通信を保護するためにSSL証明書を設定します。

TLS/SSLの設定

この手順はオプションですが、Webサイトとアセットを安全なHTTPS接続で利用できるようにすることを強くお勧めします。 チュートリアルUbuntu16.04でNginxサーバーブロックを使用してLet’sEncryptを設定する方法を読むと、Let’sEncrypt認証局から無料の証明書をダウンロードしてインストールする方法を学ぶことができます。

結論

このチュートリアルでは、オブジェクトのリクエストをSpacesサービスにプロキシするためのNginx構成を作成しました。 次に、パフォーマンスを向上させるためにキャッシュを追加し、プライバシーとセキュリティを向上させるためにTLS/SSL証明書を追加しました。

ここに示されている設定は良い出発点ですが、独自のトラフィックパターンとニーズに基づいていくつかのキャッシュパラメータを最適化することをお勧めします。 Nginxドキュメント、特に ngx_http_proxy_module は、利用可能な構成オプションに関するより詳細な情報を提供できます。

モバイルバージョンを終了