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プロキシを配置する理由は、次のとおりです。
- カスタムドメインを追加する
- 独自のキャッシュを追加する
- 独自のSSL証明書を使用する
- 異なるアクセス制御メカニズムを使用する
- ユーザーに近いデータセンターにアセットをキャッシュする
このチュートリアルでは、独自のドメインでリクエストに応答するようにNginxを設定し(オプションのLet’s Encrypt SSL証明書を使用)、それらのリクエストをpublicアセットのあるスペースに転送します。 次に、キャッシュを追加して、頻繁にアクセスされるオブジェクトに対する後続の応答を高速化します。
前提条件
このチュートリアルを完了するには、次のものが必要です。
-
チュートリアルUbuntu16.04にNginxをインストールする方法で説明されているように、NginxがインストールされたUbuntu16.04サーバー
-
DigitalOcean を使用してホスト名を設定する方法に従って、サーバーを指すドメイン名。 このチュートリアル全体でassets.example.comを使用します
-
DigitalOceanスペース。 DigitalOcean Spacesの紹介を読むと、新しいスペースを作成する方法を学ぶことができます。
個々のスペースのURLを知っている必要があります。 DigitalOceanコントロールパネルでスペースに移動すると、それを見つけることができます。 URLは、UIのスペース名のすぐ下にあります。 これは、以下のスクリーンショットで強調表示されています。
また、テストするためにSpaceにファイルをアップロードする必要があります。 前述のSpacesの記事は、SpacesWebGUIを使用してファイルをアップロードする方法を示しています。 使用します
example.png
このチュートリアルでは。
プロキシの設定
UbuntuにNginxをデフォルトでインストールすると、すべてのリクエストに対して Welcome toNginxプレースホルダーページが返されます。 ドメインへのリクエストで何か他のことをするようにNginxに指示するために、いくつかの新しい構成を追加する必要があります。
これを行うには、で新しい構成ファイルを開きます /etc/nginx/sites-available
:
- sudo nano /etc/nginx/sites-available/assets.example.com
これにより、空のファイルが開きます。 nano
テキストエディタ。 次の構成で貼り付けます。強調表示された部分を、独自のドメイン名とスペースのURLに置き換えてください。
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/
ディレクトリ:
- sudo ln -s /etc/nginx/sites-available/assets.example.com /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 https://example.nyc3.digitaloceanspaces.com/example.png
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 http://assets.example.com/example.png
OutputHTTP/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/
. 今すぐそのファイルを開きます:
- sudo nano /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/assets.example.com
あなたの最後に以下を追加します location /
ブロック(後 proxy_hide_header
ディレクティブ、ただしクロージング前 }
ブラケット):
. . .
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.conf
ファイル。proxy_cache_valid
Nginxに任意のことを考慮するように指示します200
応答は60分間有効です。 これは、プロキシがSpacesからファイルを正常にフェッチした後、次の60分間、NginxはSpacesに更新を要求することなくキャッシュされたコピーを使用することを意味します。 オブジェクトにCache-Control
ヘッダーセットの場合、ヘッダーの値はこの構成をオーバーライドします。proxy_cache_use_stale
Spacesサーバーがタイムアウトした場合、エラーを返した場合、またはキャッシュされた応答が更新中の場合に、Nginxが古い(期限切れの)応答を返すことを許可します。proxy_cache_revalidate
プロキシが条件付きGET要求を使用してキャッシュされたファイルを再検証できるようにします。 これは、キャッシュされたファイルの有効期限が切れ、Nginxがスペースの変更を確認する必要がある場合、NginxはIf-Modified-Since
またIf-None-Match
オブジェクトが実際に変更された場合にのみオブジェクトをフェッチするヘッダー。 更新されていない場合、Spacesは304 Not Modified
responseと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 http://assets.example.com/example.png
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
X-Cache-Status: MISS
Accept-Ranges: bytes
最初のリクエストは MISS
. もう一度試してください:
- curl -I http://assets.example.com/example.png
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
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 は、利用可能な構成オプションに関するより詳細な情報を提供できます。