Ubuntu 18.04でHTTP / 2サポートを使用してNginxをセットアップする方法

_このチュートリアルの以前のバージョンはhttps://www.digitalocean.com/community/users/lomand[Sergey Zhukaev]によって作成されました。

前書き

Nginxは、高速で信頼性の高いオープンソースWebサーバーです。 メモリフットプリントが小さく、拡張性が高く、構成が簡単で、さまざまなプロトコルがサポートされているため、人気を博しました。

HTTP / 2はHypertext Transport Protocolの新しいバージョンで、Webでサーバーからブラウザにページを配信するために使用されます。 HTTP / 2は、ほぼ20年ぶりのHTTPの最初のメジャーアップデートです。HTTP1.1は、Webページが通常インラインCSSスタイルシートを備えた単一のHTMLファイルであった1999年に公開されました。 インターネットはそれ以来劇的に変化しており、現在HTTP 1.1の制限に直面しています-プロトコルはキュー内のページの一部をダウンロードするため、最新のWebサイトの潜在的な転送速度を制限します(前の部分はダウンロードする前に完全にダウンロードする必要があります次の部分が始まります)、平均的な最新のWebページでは約100のリクエストをダウンロードする必要があります(各リクエストは画像、jsファイル、cssファイルなどです)。

HTTP / 2は、いくつかの基本的な変更をもたらすため、この問題を解決します。

  • すべてのリクエストはキューではなく並行してダウンロードされます

  • HTTPヘッダーは圧縮されています

  • ページはテキストファイルとしてではなくバイナリとして転送されるため、より効率的です

  • サーバーはユーザーのリクエストがなくてもデータを「プッシュ」できるため、待ち時間の長いユーザーの速度が向上します

HTTP / 2は暗号化を必要としませんが、Google ChromeとMozilla Firefoxの2つの最も人気のあるブラウザーの開発者は、セキュリティ上の理由からHTTPS接続に対してのみHTTP / 2をサポートすると述べました。 したがって、HTTP / 2サポートを使用してサーバーをセットアップする場合は、HTTPSを使用してサーバーを保護する必要もあります。

このチュートリアルは、HTTP / 2をサポートする高速で安全なNginxサーバーのセットアップに役立ちます。

前提条件

始める前に、いくつかのことが必要です。

手順1-HTTP / 2サポートの有効化

Nginxインストールチュートリアルのサーバーブロックのセットアップ手順では、domain` + / etc / nginx / sites-available / + にドメインのサーバーブロックがあり、 + server_name + `ディレクティブが既に適切に設定されている必要があります。 最初に行う変更は、HTTP / 2を使用するようにドメインのサーバーブロックを変更することです。

ドメインの構成ファイルを開きます。

sudo nano /etc/nginx/sites-available/

ファイルで、ポート `+ 443 `に関連付けられている ` listen +`変数を見つけます。

your_domain ’> / etc / nginx / sites-available /

...
   listen [::]:443 ssl ipv6only=on;
   listen 443 ssl;
...

1つ目はIPv6接続用です。 2つ目は、すべてのIPv4接続用です。 両方でHTTP / 2を有効にします。

各 `+ listen `ディレクティブを変更して、 ` http2 +`を含めます。

your_domain ’> / etc / nginx / sites-available /

...
   listen [::]:443 ssl  ipv6only=on;
   listen 443 ssl ;
...

これは、サポートされているブラウザーでHTTP / 2を使用するようにNginxに指示します。

構成ファイルを保存し、テキストエディターを編集します。

Nginx設定ファイルに変更を加えるときはいつでも、次のような構文エラーの設定を確認する必要があります。

sudo nginx -t

構文にエラーがない場合、次の出力が表示されます。

sudo nginx -tの出力

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

次に、より制限の厳しい暗号リストを使用するようにサーバーを構成します。

ステップ2-古い暗号化された暗号スイートの削除

HTTP / 2にはhttps://http2.github.io/http2-spec/#BadCipherSuites[blacklist]の古くて安全でない暗号がありますので、それらを避ける必要があります。 暗号スイートは、転送されたデータを暗号化する方法を記述する暗号化アルゴリズムです。

暗号の定義に使用する方法は、NginxのTLS / SSL証明書の設定方法によって異なります。

Certbotを使用して証明書を取得した場合は、HTTP / 2に十分な強度のない暗号を含むファイル `+ / etc / letsencrypt / options-ssl-nginx.conf +`も作成しました。 このファイルを変更すると、残念ながら将来Certbotが更新を適用できなくなるため、Nginxにこのファイルを使用しないように指示し、独自の暗号リストを指定します。

ドメインのサーバーブロック構成ファイルを開きます。

sudo nano /etc/nginx/sites-available/

`+ options-ssl-nginx.conf +`ファイルを含む行を見つけてコメントアウトします:

your_domain ’> / etc / nginx / sites-available /

    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot<^>

その行の下に、この行を追加して許可される暗号を定義します。

your_domain ’> / etc / nginx / sites-available /

ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;

ファイルを保存し、エディターを終了します。

自己署名証明書を使用するか、サードパーティからの証明書を使用し、前提条件に従って構成した場合、テキストエディターでファイル `+ / etc / nginx / snippets / ssl-params.conf +`を開きます。

sudo nano /etc/nginx/snippets/ssl-params.conf

次の行を見つけます。

/etc/nginx/snippets/ssl-params.conf

...
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384;
...

次のように変更します。

/etc/nginx/snippets/ssl-params.conf

...
ssl_ciphers

ファイルを保存して、エディターを終了します。

もう一度、構文エラーの構成を確認します。

sudo nginx -t

エラーが表示された場合は、それらに対処して再度テストします。

構文エラーが表示されなくなったら、Nginxを再起動します。

sudo systemctl reload nginx

サーバーを再起動したら、動作することを確認しましょう。

手順3-HTTP / 2が有効になっていることを確認する

サーバーが実行され、HTTP / 2で動作していることを確認しましょう。

`+ curl +`コマンドを使用してサイトにリクエストを行い、ヘッダーを表示します:

curl -I -L https://

次の出力が表示されます。

OutputHTTP/1.1 301 Moved Permanently
Server: nginx/1.14.0 (Ubuntu)
Date: Fri, 06 Jul 2018 19:07:12 GMT
Content-Type: text/html
Content-Length: 194
Connection: keep-alive
Location: https:///


server: nginx/1.14.0 (Ubuntu)
date: Fri, 06 Jul 2018 19:07:12 GMT
content-type: text/html
content-length: 16
last-modified: Fri, 06 Jul 2018 16:55:37 GMT
etag: "5b3f9f09-10"
accept-ranges: bytes

HTTP / 2がGoogle Chromeで使用されていることも確認できます。 Chromeを開き、「+ http:// +」に移動します。 Chrome開発者ツールを開き(表示開発者開発者ツール)、ページを再読み込みします(表示このページを再読み込み)。 * Network タブに移動し、 Name で始まるテーブルヘッダー行を右クリックして、ポップアップメニューから Protocol *オプションを選択します。

新しい* Protocol *列に「+ h2 +」(HTTP / 2の略)が表示され、HTTP / 2が機能していることが示されます。

image:https://assets.digitalocean.com/articles/nginx_http2/http2_check.png [Chrome Developer Tools HTTP / 2チェック]

この時点で、HTTP / 2プロトコルを介してコンテンツを提供する準備が整いました。 HSTSを有効にして、セキュリティとパフォーマンスを改善しましょう。

ステップ4-HTTP Strict Transport Security(HSTS)の有効化

HTTP要求がHTTPSにリダイレクトされる場合でも、HTTP Strict Transport Security(HSTS)を有効にして、これらのリダイレクトを行う必要をなくすことができます。 ブラウザがHSTSヘッダーを検出した場合、所定の期間、通常のHTTPを介してサーバーへの接続を再試行しません。 何があっても、暗号化されたHTTPS接続のみを使用してデータを交換します。 このヘッダーは、https://en.wikipedia.org/wiki/Downgrade_attack [downgrade attack]プロトコルからも保護します。

エディターでNginx構成ファイルを開きます。

sudo nano /etc/nginx/nginx.conf

この行をファイルに追加して、HSTSを有効にします。

/etc/nginx/nginx.conf

http {
...
   ##
   # Virtual Host Configs
   ##

   include /etc/nginx/conf.d/*.conf;
   include /etc/nginx/sites-enabled/*;

}
...

`+ max-age `は秒単位で設定されます。 値「+15768000」は6か月に相当します。

デフォルトでは、このヘッダーはサブドメイン要求に追加されません。 サブドメインがあり、HSTSをそれらすべてに適用したい場合は、次のように、行の末尾に `+ includeSubDomains +`変数を追加する必要があります。

/etc/nginx/nginx.conf

add_header Strict-Transport-Security "max-age=15768000" always;

ファイルを保存し、エディターを終了します。

もう一度、構文エラーの構成を確認します。

sudo nginx -t

最後に、変更を適用するためにNginxサーバーを再起動します。

sudo systemctl reload nginx

結論

NginxサーバーはHTTP / 2ページを提供しています。 SSL接続の強度をテストする場合は、https://www.ssllabs.com/ssltest/ [Qualys SSL Lab]にアクセスして、サーバーに対してテストを実行してください。 すべてが適切に構成されている場合、セキュリティのためにA +マークを取得する必要があります。

Related