開発者ドキュメント

Ubuntu20.04でHTTP/2サポートを使用してNginxを設定する方法

このチュートリアルの以前のバージョンは、 SergeyZhukaevによって作成されました。

序章

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

HTTP / 2は、ハイパーテキストトランスポートプロトコルの新しいバージョンであり、サーバーからブラウザにページを配信するためにWebで使用されます。 HTTP / 2は、ほぼ20年ぶりのHTTPのメジャーアップデートです。HTTP1.1は、Webページのサイズがはるかに小さかった1999年に一般に公開されました。 それ以来、インターネットは劇的に変化し、現在HTTP1.1の制限に直面しています。 このプロトコルは、キュー内のページの一部をダウンロードするため、ほとんどの最新のWebサイトの潜在的な転送速度を制限します。前の部分は、次の部分のダウンロードを開始する前に完全にダウンロードする必要があります。平均的な最新のWebページは、数十の個別のCSS、javascript、および画像アセット。

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

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

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

前提条件

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

ステップ1— HTTP/2サポートを有効にする

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

nanoまたはお好みのエディターを使用して、ドメインの構成ファイルを開きます。

  1. sudo nano /etc/nginx/sites-enabled/your_domain

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

/ etc / nginx / sites-enabled / your_domain
...
    listen [::]:443 ssl ipv6only=on; 
    listen 443 ssl; 
...

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

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

/ etc / nginx / sites-enabled / your_domain
...
    listen [::]:443 ssl http2 ipv6only=on; 
    listen 443 ssl http2; 
...

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

構成ファイルを保存して、テキストエディターを終了します。 nanoを使用している場合は、Ctrl+Xを押し、プロンプトが表示されたらYを押して、Enterキーを押します。

Nginx構成ファイルに変更を加えるときは常に、Nginxの組み込み構文チェックコマンドを実行する-tフラグを使用して、構成にエラーがないかチェックする必要があります。

  1. sudo nginx -t

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

sudonginx-tの出力
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

次に、サーバーのセキュリティを向上させるために、より制限の厳しい暗号リストを使用するようにNginxサーバーを構成します。

ステップ2—古くて安全でない暗号スイートを削除する

HTTP / 2には、避けるべき古くて安全でない暗号のblocklistがあります。 暗号スイートは、転送されたデータを暗号化する方法を記述する暗号化アルゴリズムです。

暗号を定義するために使用する方法は、NginxのTLS/SSL証明書をどのように構成したかによって異なります。

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

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

sudo nano /etc/nginx/sites-enabled/your_domain

options-ssl-nginx.confファイルを含む行を見つけて、行の先頭に#文字を追加してコメントアウトします。

/ etc / nginx / sites-enabled / your_domain

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

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

/ etc / nginx / sites-enabled / your_domain

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

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

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

  1. 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 EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;

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

もう一度、nginx -tコマンドを使用して、構文エラーの構成を確認します。

  1. sudo nginx -t

エラーが発生した場合は、それらに対処して再テストしてください。

構成が構文チェックに合格したら、systemctlコマンドを使用してNginxを再起動します。

  1. sudo systemctl reload nginx.service

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

ステップ3— HTTP/2が有効になっていることを確認する

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

curlコマンドを使用して、サイトにリクエストを送信し、ヘッダーを表示します。

  1. curl -I -L --http2 https://your_domain

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

HTTP/2 200
server: nginx/1.18.0 (Ubuntu)
date: Wed, 10 Nov 2021 17:53:10 GMT
content-type: text/html
content-length: 612
last-modified: Tue, 09 Nov 2021 23:18:37 GMT
etag: "618b01cd-264"
accept-ranges: bytes

HTTP/2がGoogleChromeで使用されていることを確認することもできます。 Chromeを開き、https://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接続のみを使用してデータを交換します。 このヘッダーは、プロトコルダウングレード攻撃からも保護します。

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

sudo nano /etc/nginx/your_domain

HSTSを有効にするには、SSL暗号を含むファイルの同じブロックに次の行を追加します。

/ etc / nginx / your_domain
server {
...
    ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
    add_header Strict-Transport-Security "max-age=15768000" always;
}
...

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

デフォルトでは、このヘッダーはサブドメインリクエストに追加されません。 サブドメインがあり、HSTSをそれらすべてに適用する場合は、次のように、行の最後にincludeSubDomains変数を追加する必要があります。

/ etc / nginx / your_domain
add_header Strict-Transport-Security "max-age=15768000; includeSubDomains" always;

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

もう一度、構文エラーがないか構成を確認します。

  1. sudo nginx -t

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

  1. sudo systemctl reload nginx.service

結論

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

Nginxがサーバーブロックルールを解析および実装する方法の詳細については、Nginxサーバーとロケーションブロック選択アルゴリズムについてをお読みください。

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