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

前書き

NGINXは、高速で信頼性の高いオープンソースWebサーバーです。 メモリフットプリントが小さく、スケーラビリティが高く、構成が容易であり、さまざまなプロトコルの大部分がサポートされているため、人気を博しました。

サポートされるプロトコルの1つは、2015年5月に公開された比較的新しいHTTP / 2です。 HTTP / 2の主な利点は、コンテンツが豊富なWebサイトの転送速度が高いことです。

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

前提条件

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

  • Ubuntu 16.04ドロップレット

  • sudo特権を持つ非ルートユーザー(詳細については、https://www.digitalocean.com/community/tutorials/initial-server-setup-with-ubuntu-16-04 [Ubuntu 16.04での初期サーバーセットアップ]を参照してください。)

  • 完全に登録されたドメイン。 https://namecheap.com [Namecheap]で購入するか、http://www.freenom.com/en/index.html [Freenom]で無料で入手できます。

  • ドメイン名がドロップレットを指すように設定されていることを確認してください。 ヘルプが必要な場合は、https://www.digitalocean.com/community/tutorials/how-to-set-up-a-host-name-with-digitalocean [このチュートリアル]をご覧ください。

  • SSL証明書。 https://www.digitalocean.com/community/tutorials/how-to-create-a-self-signed-ssl-certificate-for-nginx-in-ubuntu-16-04 [自己署名証明書を生成]、 Let’s Encryptから無料のものを入手またはhttps: //www.digitalocean.com/community/tutorials/how-to-install-an-ssl-certificate-from-a-commercial-certificate-authority [別のプロバイダーから購入]。

それがすべてです。 上記のすべてが揃ったら、準備は完了です。

HTTP 1.1とHTTP / 2の違い

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を使用してサーバーを保護する必要もあります。

手順1-Nginxの最新バージョンのインストール

HTTP / 2プロトコルのサポートは、Nginx 1.9.5で導入されました。 幸いなことに、Ubuntu 16.04のデフォルトのリポジトリにはこれより新しいバージョンが含まれているため、サードパーティのリポジトリを追加する必要はありません。

まず、aptパッケージシステムで利用可能なパッケージのリストを更新します。

sudo apt-get update

次に、Nginxをインストールします。

sudo apt-get install nginx

インストールプロセスが完了したら、次のように入力してNginxのバージョンを確認できます。

sudo nginx -v

出力は次のようになります。

sudo nginx -vの出力

nginx version: nginx/1.10.0 (Ubuntu)

次のいくつかの手順では、Nginx構成ファイルを変更します。 各ステップでNginx構成オプションが変更されます。 途中で構成ファイルの構文をテストします。 最後に、NginxがHTTP / 2をサポートしていることを確認し、パフォーマンスを最適化するためにいくつかの変更を行います。

手順2-リスニングポートの変更とHTTP / 2の有効化

最初に行う変更は、リスニングポートを「80」から「443」に変更することです。

設定ファイルを開きましょう:

sudo nano /etc/nginx/sites-available/default

デフォルトでは、Nginxは標準のHTTPポートであるポート80をリッスンするように設定されています。

/ etc / nginx / sites-available / default

listen  default_server;
listen [::]: default_server;

ご覧のとおり、2つの異なる `+ listen +`変数があります。 1つ目は、すべてのIPv4接続用です。 2つ目はIPv6接続用です。 両方の暗号化を有効にします。

リスニングポートをHTTPSプロトコルで使用される「443」に変更します。

/ etc / nginx / sites-available / default

listen  default_server;
listen [::]: default_server;

「+ ssl 」に加えて、「 http2 +」も行に追加したことに注意してください。 この変数は、サポートされているブラウザーでHTTP / 2を使用するようにNginxに指示します。

ステップ3-サーバー名の変更

`+ server_name `エントリを使用して、構成ファイルに関連付けるドメインを指定します。 設定ファイルで ` server_name +`エントリを見つけます。

デフォルトでは、 + server_name +`は `+ _ +(アンダースコア)に設定されます。これは、設定ファイルがすべての着信リクエストを処理することを意味します。 次のように、 `+ _ +`を実際のドメインに変更します。

/ etc / nginx / sites-available / default

server_name ;

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

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

[[step-4-- adding-the-ssl-certificates]] === ステップ4-SSL証明書の追加

次に、SSL証明書を使用するようにNginxを構成する必要があります。 SSL証明書が何であるかわからない場合、または現在証明書がない場合は、この記事の前提条件セクションのチュートリアルのいずれかに従ってください。

Nginx構成ディレクトリ内にSSL証明書を保存するディレクトリを作成します。

sudo mkdir /etc/nginx/ssl

証明書と秘密キーをこの場所にコピーします。 また、ファイルの名前を変更して、関連付けられているドメインを表示します。 これは、将来このサーバーに複数のドメインが関連付けられている場合に役立ちます。 `+ example.com +`を実際のホスト名に置き換えます:

sudo cp /path/to/your/certificate.crt /etc/nginx/ssl/.crt
sudo cp /path/to/your/private.key /etc/nginx/ssl/.key

それでは、設定ファイルをもう一度開いてSSLを設定しましょう。

sudo nano /etc/nginx/sites-available/default

`+ server +`ブロック内の新しい行で、証明書の場所を定義します。

/ etc / nginx / sites-available / default

ssl_certificate /etc/nginx/ssl/.crt;
ssl_certificate_key /etc/nginx/ssl/.key;

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

ステップ5-古い暗号スイートの回避

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

CloudFlareのようなインターネットの巨人によってセキュリティが承認された、本当に人気のある暗号セットを使用します。 MD5暗号化の使用は許可されていません(1996年以降、安全でないと知られていましたが、この事実にもかかわらず、現在でもその使用は広まっています)。

次の構成ファイルを開きます。

sudo nano /etc/nginx/nginx.conf

この行を「+ ssl_prefer_server_ciphers on; +」の後に追加します。

/etc/nginx/nginx.conf

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

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

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

sudo nginx -t

ステップ6-鍵交換セキュリティの強化

安全な接続を確立するための最初のステップは、サーバーとクライアント間の秘密鍵の交換です。 問題は、これまでは、それらの間の接続が暗号化されていないことです。つまり、データの転送は第三者に見えます。 そのため、Diffie–Hellman–Merkleアルゴリズムが必要です。 どのように機能するかについての技術的な詳細は簡単に説明することはできませんが、詳細に興味がある場合は、https://www.youtube.com/watch?v = M-0qt6tdHzk [このYouTubeビデオ]。

デフォルトでは、Nginxは1028ビットDHE(Ephemeral Diffie-Hellman)キーを使用します。これは比較的簡単に解読できます。 最大限のセキュリティを提供するには、より安全な独自のDHEキーを構築する必要があります。

それを行うには、次のコマンドを発行します。

sudo openssl dhparam -out dhparam.pem 2048

ファイルパスの後の変数(この場合は「2048」)はキーの長さを指定します。 2048ビット長のキーは十分に安全であり、https://wiki.mozilla.org/Security/Server_Side_TLS#Pre-defined_DHE_groups [Mozilla Foundationが推奨]ですが、さらに暗号化する場合は変更できます。それを「4096」に。

生成プロセスには約5分かかります。

完了したら、デフォルトのNginx構成ファイルを再度開きます。

sudo nano /etc/nginx/sites-available/default

`+ server +`ブロック内の新しい行で、カスタムDHEキーの場所を定義します。

/ etc / nginx / sites-available / default

ssl_dhparam  /etc/nginx/ssl/dhparam.pem;

ステップ7-すべてのHTTP要求をHTTPSにリダイレクトする

HTTPSのみでコンテンツを提供することに関心があるため、サーバーがHTTPリクエストを受信した場合に何をすべきかをNginxに伝える必要があります。

ファイルの最後に、すべてのHTTP要求をHTTPSにリダイレクトするための新しいサーバーブロックを作成します(サーバー名を実際のドメイン名に置き換えてください)。

/ etc / nginx / sites-available / default

server {
      listen         80;
      listen    [::]:80;
      server_name    ;
      return         301 https://$server_name$request_uri;
}

ファイルを保存し、構成ファイルを終了します。

構文エラーの構成を確認します。

sudo nginx -t

ステップ8-Nginxのリロード

Nginxのすべての構成変更については以上です。 変更ごとに構文エラーをチェックしたので、Nginxを再起動して変更をテストする準備ができているはずです。

要約すると、コメント化された行を無視すると、構成ファイルは次のようになります。

/ etc / nginx / sites-available / default

server {
       listen 443 ssl http2 default_server;
       listen [::]:443 ssl http2 default_server;

       root /var/www/html;

       index index.html index.htm index.nginx-debian.html;

       server_name ;

       location / {
               try_files $uri $uri/ =404;
       }

       ssl_certificate /etc/nginx/ssl/.crt;
       ssl_certificate_key /etc/nginx/ssl/.key;
       ssl_dhparam /etc/nginx/ssl/dhparam.pem;
}


server {
      listen         80;
      listen    [::]:80;
      server_name    ;
      return         301 https://$server_name$request_uri;
}

変更を適用するには、Nginxサーバーを再起動します。

sudo systemctl restart nginx

ステップ9-変更の検証

サーバーが稼働していることを確認しましょう。 Webブラウザを開き、ドメインに移動します( `+ example.com +`を実際のドメイン名に置き換えます):

すべてが正しく構成されていれば、自動的にHTTPSにリダイレクトされます。 次に、HTTP / 2が機能していることを確認します。Chrome開発者ツールを開き(表示開発者開発者ツール)、ページをリロードします(表示このページをリロード)。 次に、* Network タブに移動し、 Name で始まるテーブルヘッダー行をクリックして右クリックし、 Protocol *オプションを選択します。

これで、HTTP / 2コンテンツを提供するWebサイトの新しい列に「+ h2 +」(HTTP / 2の略)が表示されます。

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

この時点で、サーバーはHTTP / 2プロトコルを介してコンテンツを提供する準備ができていますが、実稼働で使用するサーバーを準備するために行うべきことがいくつかあります。

ステップ10-最高のパフォーマンスを得るためにNginxを最適化する

この手順では、最高のパフォーマンスとセキュリティを実現するために、メインのNginx構成ファイルを調整します。

まず、コンソールで次のように入力して、 `+ nginx.conf +`を開きます。

sudo nano /etc/nginx/nginx.conf

接続資格証明キャッシュの有効化

HTTPと比較して、HTTPSはサーバーとユーザー間の初期接続を確立するのに比較的長い時間がかかります。 このページ読み込み速度の違いを最小限に抑えるために、接続資格情報のキャッシュを有効にします。 つまり、要求されたページごとに新しいセッションを作成する代わりに、サーバーは代わりに資格情報のキャッシュバージョンを使用します。

セッションキャッシュを有効にするには、 `+ nginx.conf `ファイルの ` http +`ブロックの最後に次の行を追加します。

/etc/nginx/nginx.conf

ssl_session_cache shared:SSL:5m;
ssl_session_timeout 1h;

`+ ssl_session_cache +`はセッション情報を含むキャッシュのサイズを指定します。 1 MBに約4000セッションの情報を保存できます。 5 MBのデフォルト値はほとんどのユーザーにとって十分以上ですが、非常に重いトラフィックが予想される場合は、それに応じてこの値を増やすことができます。

`+ ssl_session_timeout +`は、特定のセッションがキャッシュに保存される時間を制限します。 この値は大きすぎてはなりません(1時間以上)が、値を低く設定しすぎても意味がありません。

HTTP Strict Transport Security(HSTS)の有効化

Nginx構成ファイルですべての通常のHTTPリクエストをHTTPSにリダイレクトしましたが、HTTP Strict Transport Securityを有効にして、そもそもリダイレクトを行わなくても済むようにする必要があります。

ブラウザがHSTSヘッダーを検出した場合、指定された期間、通常のHTTPを介してサーバーへの接続を再試行しません。 何があっても、暗号化されたHTTPS接続のみを使用してデータを交換します。 このヘッダーは、プロトコルのダウングレード攻撃からも保護する必要があります。

`+ nginx.conf +`に次の行を追加します。

/etc/nginx/nginx.conf

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

`+ 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 restart nginx

結論

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

Related