Ubuntu 16.04でNginxを使用してDigitalOceanスペースをプロキシする方法

前書き

DigitalOcean Spacesは、S3 APIと互換性のあるhttps://www.digitalocean.com/community/tutorials/object-storage-vs-block-storage-services [オブジェクトストレージ]サービスです。 このチュートリアルでは、Nginxを使用して、スペース上のオブジェクトのリクエストをプロキシする方法を示します。 NginxはユーザーからHTTP(S)リクエストを受信し、それらをSpacesサービスに渡します。Spacesサービスは結果をNginx経由で送り返します。

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

  • カスタムドメインを追加する

  • 独自のキャッシュを追加する

  • 独自のSSL証明書を使用する

  • 異なるアクセス制御メカニズムを使用する

  • ユーザーに近いデータセンターのアセットをキャッシュする

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

前提条件

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

  • NginxがインストールされたUbuntu 16.04サーバー。チュートリアルhttps://www.digitalocean.com/community/tutorials/how-to-install-nginx-on-ubuntu-16-04[Ubuntu 16.04にNginxをインストールする方法] ]

  • https://www.digitalocean.com/community/tutorials/how-to-set-up-a-host-name-with-digitalocean [ホスト名を設定する方法]に従って、サーバーを指すドメイン名DigitalOcean]。 このチュートリアルでは* assets.example.com *を使用します

  • DigitalOceanスペース。 DigitalOcean Spacesの紹介を読むと、新しいスペースを作成する方法を学ぶことができます。 個々のスペースのURLを知る必要があります。 これは、DigitalOceanコントロールパネルでスペースに移動して見つけることができます。 URLは、UIのスペース名のすぐ下にあります。 これは、以下のスクリーンショットで強調表示されています。 このURLは、UIヘッダーのスペースの名前のすぐ下にあります] +また、テストを行うには、スペースにファイルをアップロードする必要があります。 前述のSpacesの記事は、Spaces Web GUIを使用してファイルをアップロードする方法を示しています。 このチュートリアルでは、 ` example.png +`を使用します。

プロキシを設定する

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

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

sudo nano /etc/nginx/sites-available/

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

/etc/nginx/sites-available/assets.example.com

server {
   listen 80;
   listen [::]:80;
   server_name ;

   location / {
       proxy_pass ;
       proxy_hide_header      Strict-Transport-Security;
   }
}

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

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

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

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

sudo ln -s /etc/nginx/sites-available/ /etc/nginx/sites-enabled/

設定構文を確認するには、ルートとして `+ nginx -t +`を実行します。

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

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

sudo systemctl reload nginx

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

プロキシをテストする

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

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

curl -I
OutputHTTP/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 +`)、およびその他の日付およびキャッシュ関連の情報を返しました。

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

curl -I
OutputHTTP/1.1 200 OK

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

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

次の手順では、キャッシュを設定して、プロキシとSpaces間の帯域幅の使用を減らし、応答時間を短縮します。

キャッシングのセットアップ

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

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;

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

  • `+ / tmp / example-cache / +`はキャッシュへのパスです。

  • `+ levels = 1:2 +`は、キャッシュされたコンテンツを保存するために2レベルのディレクトリ階層を設定します。 1つのディレクトリに多くのファイルを配置すると、速度と信頼性の問題が発生する可能性があるため、Nginxはこのオプションに基づいて複数のディレクトリ間でファイルを分割します。

  • `+ keys_zone = example-cache:16m +`はキャッシュに名前を付け、キーを保存するために16メガバイトのメモリを設定します。 これは、100,000を超えるキーのデータを格納するのに十分なメモリです。

  • `+ max_size = 10g +`は、キャッシュのサイズを10ギガバイトに制限します。 これは、ストレージと使用のニーズに合わせて調整できます。

  • 「+ inactive = 60m +」は、Nginxがその時間内にアクセスされなかった場合(ファイルがまだ有効で期限が切れていない場合でも)60分後にキャッシュされたファイルを削除することを意味します。 アクセス頻度の低いオブジェクトがたくさんある場合は、これを増やしてみてください。

  • `+ use_temp_path = off +`は、Nginxに一時ファイルをキャッシュディレクトリに書き込むように指示します。これにより、ファイルシステム間でファイルをコピーする必要がなくなり、パフォーマンスが低下する可能性があります。

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

sudo nano /etc/nginx/sites-available/

`+ 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つずつ見ていきましょう。

  • `+ proxy_cache `は、使用するキャッシュをNginxに伝えます。 この場合、 ` example-cache `ファイルで設定した ` example-cache +`を指定します。

  • `+ proxy_cache_valid `は、Nginxに ` 200 `応答を60分間有効と見なすよう指示します。 これは、プロキシがSpacesからファイルを正常に取得した後、Nginxが今後60分間、Spacesに更新を要求せずにキャッシュされたコピーを使用することを意味します。 オブジェクトに ` Cache-Control`ヘッダーセットがある場合、ヘッダーの値がこの設定をオーバーライドすることに注意してください。

  • `+ proxy_cache_use_stale +`を使用すると、Spacesサーバーがタイムアウトしたり、エラーを返したり、キャッシュされた応答が更新中の場合に、Nginxが古い(期限切れの)応答を返すことができます。

  • `+ proxy_cache_revalidate `を使用すると、プロキシは_conditional GET_要求を使用してキャッシュファイルを再検証できます。 これは、キャッシュされたファイルの有効期限が切れ、Nginxがスペースの変更をチェックする必要がある場合、Nginxは実際に変更された場合にのみオブジェクトを取得するために ` If-Modified-Since `または ` If-None-Match +`ヘッダーを使用することを意味します。 更新されていない場合、Spacesは「+304 Not Modified +」レスポンスを返し、Nginxは既存のキャッシュされたレスポンスを再び有効としてマークします。

  • `+ proxy_cache_lock +`は、プロキシが既にバックエンドサーバーからオブジェクトを取得しているときに、オブジェクトへの後続のリクエストを保留します。 最初のリクエストが完了すると、他のリクエストはキャッシュから提供されます。

  • `+ proxy_ignore_headers Set-Cookie +`はCookieを無視します。これはキャッシュを妨げる可能性があります。

  • + add_header X-Cache-Status …​ +`は、リクエストがキャッシュから提供されたかどうか( `+ HIT +)かどうか( + MISS +)についての情報を含むヘッダーを追加します。 リクエストがキャッシュにあったが期限切れだった場合、代わりに( + REVALIDATED +)が表示されます。

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

sudo nginx -t
sudo systemctl reload nginx

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

キャッシュのテスト

キャッシュが機能していることを確認するには、 `+ curl `を再度使用して、 ` X-Cache-Status +`ヘッダーを探します。

curl -I
OutputHTTP/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

Accept-Ranges: bytes

最初のリクエストは `+ MISS +`でなければなりません。 もう一度試してください:

curl -I
OutputHTTP/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

Accept-Ranges: bytes

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

TLS / SSLのセットアップ

この手順はオプションですが、Webサイトとアセットを安全なHTTPS接続で利用できるようにすることを強くお勧めします。 Let’s Encrypt認証局から無料の証明書をダウンロードしてインストールする方法については、チュートリアルhttps://www.digitalocean.com/community/tutorials/how-to-set-up-let-s-encrypt-with-をご覧ください。 nginx-server-blocks-on-ubuntu-16-04 [Ubuntu 16.04でNginxサーバーブロックで暗号化を設定する方法]。

結論

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

ここに示されている設定は良い出発点ですが、独自のトラフィックパターンとニーズに基づいてキャッシュパラメーターの一部を最適化することもできます。 Nginx documentation、特にhttps://nginx.org/en/docs/http/ngx_http_proxy_module.html[ngxhttpproxy_module]は、利用可能な設定オプションに関する詳細情報を提供できます。 。

Related