Ubuntu18.04でHTTP/2サポートを使用してNginxを設定する方法
このチュートリアルの以前のバージョンは、 SergeyZhukaevによって作成されました。
序章
Nginx は、高速で信頼性の高いオープンソースWebサーバーです。 メモリーフットプリントが低く、スケーラビリティが高く、構成が簡単で、さまざまなプロトコルをサポートしているため、人気を博しました。
HTTP / 2は、ハイパーテキストトランスポートプロトコルの新しいバージョンであり、サーバーからブラウザにページを配信するためにWeb上で使用されます。 HTTP / 2は、ほぼ20年ぶりのHTTPのメジャーアップデートです。HTTP1.1は、Webページが通常インラインCSSスタイルシートを備えた単一のHTMLファイルであった1999年に一般に公開されました。 それ以来、インターネットは劇的に変化し、HTTP 1.1の制限に直面しています。プロトコルは、キュー内のページの一部をダウンロードするため、ほとんどの最新のWebサイトの潜在的な転送速度を制限します(前の部分は、次の部分が始まります)、平均的な最新のWebページをダウンロードするには約100のリクエストが必要です(各リクエストは画像、jsファイル、cssファイルなどです)。
HTTP / 2は、いくつかの基本的な変更をもたらすため、この問題を解決します。
- すべてのリクエストは、キューではなく並行してダウンロードされます
- HTTPヘッダーは圧縮されています
- ページはテキストファイルとしてではなく、バイナリとして転送されます。これはより効率的です
- サーバーは、ユーザーの要求がなくてもデータを「プッシュ」できるため、待ち時間が長いユーザーの速度が向上します。
HTTP / 2は暗号化を必要としませんが、最も人気のある2つのブラウザであるGoogleChromeとMozillaFirefoxの開発者は、セキュリティ上の理由から、HTTPS接続に対してのみHTTP/2をサポートすると述べています。 したがって、HTTP / 2をサポートするサーバーをセットアップする場合は、HTTPSでサーバーを保護する必要もあります。
このチュートリアルは、HTTP/2をサポートする高速で安全なNginxサーバーをセットアップするのに役立ちます。
前提条件
始める前に、いくつかのことが必要になります。
- Ubuntu18.04初期サーバーセットアップガイドに従ってセットアップされた1つのUbuntu18.04サーバー(sudo非rootユーザーとファイアウォールを含む)。
- Nginxがサーバーにインストールされています。これは、 Ubuntu18.04にNginxをインストールする方法に従って実行できます。
- サーバーを指すように構成されたドメイン名。 Namecheap で購入するか、Freenomで無料で入手できます。 DigitalOceanでドメインを管理する方法のドキュメントに従って、ドメインをDigitalOceanドロップレットにポイントする方法を学ぶことができます。
- サーバー用に構成されたTLS/SSL証明書。 3つのオプションがあります。
- Let’s Encrypt から、 Ubuntu18.04でLet’sEncryptを使用してNginxを保護する方法に従って無料の証明書を取得できます。
- Ubuntu 18.04 でNginxの自己署名SSL証明書を作成する方法に従って、自己署名証明書を生成および構成することもできます。
- 別のプロバイダーから購入し、 Ubuntu 18.04 でNginxの自己署名SSL証明書を作成する方法の手順2〜6に従って、それを使用するようにNginxを構成できます。
- ポートからのトラフィックをリダイレクトするように構成されたNginx
80
ポートへ443
、これは前の前提条件でカバーされている必要があります。 - Nginxは、2048ビット以上のEphemeral Diffie-Hellman(DHE)キーを使用するように構成されています。これは、以前の前提条件でもカバーされている必要があります。
ステップ1— HTTP/2サポートを有効にする
Nginxインストールチュートリアルのサーバーブロックのセットアップ手順に従った場合は、ドメインのサーバーブロックが次の場所にあるはずです。 /etc/nginx/sites-available/your_domain
とともに server_name
ディレクティブはすでに適切に設定されています。 最初に行う変更は、HTTP/2を使用するようにドメインのサーバーブロックを変更することです。
ドメインの構成ファイルを開きます。
- sudo nano /etc/nginx/sites-available/your_domain
ファイルで、 listen
ポートに関連付けられた変数 443
:
...
listen [::]:443 ssl ipv6only=on;
listen 443 ssl;
...
1つ目はIPv6接続用です。 2つ目は、すべてのIPv4接続用です。 両方に対してHTTP/2を有効にします。
それぞれを変更する listen
含めるディレクティブ http2
:
...
listen [::]:443 ssl http2 ipv6only=on;
listen 443 ssl http2;
...
これは、サポートされているブラウザでHTTP/2を使用するようにNginxに指示します。
構成ファイルを保存して、テキストエディターを終了します。
Nginx構成ファイルに変更を加えるときは常に、次のような構文エラーがないか構成を確認する必要があります。
- 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には古くて安全でない暗号のブラックリストがあるので、それらを避ける必要があります。 暗号スイートは、転送されたデータを暗号化する方法を記述する暗号化アルゴリズムです。
暗号を定義するために使用する方法は、NginxのTLS/SSL証明書をどのように構成したかによって異なります。
Certbotを使用して証明書を取得した場合は、ファイルも作成されます /etc/letsencrypt/options-ssl-nginx.conf
これには、HTTP/2には十分な強度がない暗号が含まれています。 このファイルを変更すると、残念ながらCertbotが将来更新を適用できなくなるため、Nginxにこのファイルを使用しないように指示し、独自の暗号リストを指定します。
ドメインのサーバーブロック構成ファイルを開きます。
sudo nano /etc/nginx/sites-available/your_domain
を含む行を見つけます options-ssl-nginx.conf
ファイルしてコメントアウトします。
# include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot<^>
その行の下に、次の行を追加して、許可される暗号を定義します。
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
次の行を見つけます。
...
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;
...
次のように変更します。
...
ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
ファイルを保存して、エディターを終了します。
もう一度、構文エラーがないか構成を確認します。
- sudo nginx -t
エラーが表示された場合は、それらに対処して再テストしてください。
構文エラーが表示されなくなったら、Nginxを再起動します。
- sudo systemctl reload nginx
サーバーを再起動したら、サーバーが機能することを確認しましょう。
ステップ3— HTTP/2が有効になっていることを確認する
サーバーが実行され、HTTP/2で動作していることを確認しましょう。
使用 curl
サイトにリクエストを送信してヘッダーを表示するコマンド:
- curl -I -L https://your_domain
次の出力が表示されます。
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://your_domain/
HTTP/2 200
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がGoogleChromeで使用されていることを確認することもできます。 Chromeを開き、に移動します http://your_domain
. Chromeデベロッパーツールを開き(ビュー->デベロッパー->デベロッパーツール)、ページをリロードします(ビュー-> このページをリロード)。 ネットワークタブに移動し、名前で始まるテーブルヘッダー行を右クリックして、ポップアップメニューからプロトコルオプションを選択します。
わかるでしょ h2
(HTTP / 2の略)新しい Protocol 列で、HTTP/2が機能していることを示します。
この時点で、HTTP/2プロトコルを介してコンテンツを提供する準備が整いました。 HSTSを有効にして、セキュリティとパフォーマンスを向上させましょう。
ステップ4— HTTP Strict Transport Security(HSTS)を有効にする
HTTPリクエストはHTTPSにリダイレクトされますが、 HTTP Strict Transport Security (HSTS)を有効にして、これらのリダイレクトを実行する必要をなくすことができます。 ブラウザがHSTSヘッダーを検出した場合、ブラウザは指定された期間、通常のHTTP経由でサーバーへの接続を再試行しません。 いずれにせよ、暗号化されたHTTPS接続のみを使用してデータを交換します。 このヘッダーは、プロトコルダウングレード攻撃からも保護します。
エディターでNginx構成ファイルを開きます。
sudo nano /etc/nginx/nginx.conf
次の行をファイルに追加して、HSTSを有効にします。
http {
...
##
# Virtual Host Configs
##
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
add_header Strict-Transport-Security "max-age=15768000" always;
}
...
The max-age
秒単位で設定されます。 値 15768000
6か月に相当します。
デフォルトでは、このヘッダーはサブドメインリクエストに追加されません。 サブドメインがあり、HSTSをそれらすべてに適用する場合は、サブドメインを追加する必要があります。 includeSubDomains
次のように、行末の変数:
add_header Strict-Transport-Security "max-age=15768000; includeSubDomains" always;
ファイルを保存し、エディターを終了します。
もう一度、構文エラーがないか構成を確認します。
- sudo nginx -t
最後に、Nginxサーバーを再起動して変更を適用します。
- sudo systemctl reload nginx
結論
NginxサーバーはHTTP/2ページを提供しています。 SSL接続の強度をテストする場合は、 Qualys SSL Lab にアクセスして、サーバーに対してテストを実行してください。 すべてが適切に構成されている場合は、セキュリティのためにA+マークを取得する必要があります。