序章

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

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

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

前提条件

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

以上です。 上記のすべてが揃っている場合は、準備ができています。

HTTP1.1とHTTP/2の違い

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

ステップ1—最新バージョンのNginxをインストールする

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

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

  1. sudo apt-get update

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

  1. sudo apt-get install nginx

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

  1. sudo nginx -v

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

sudonginx-vの出力
nginx version: nginx/1.10.0 (Ubuntu)

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

ステップ2—リスニングポートを変更してHTTP/2を有効にする

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

構成ファイルを開きましょう:

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

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

/ etc / nginx / sites-available / default
listen 80 default_server;
listen [::]:80 default_server;

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

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

/ etc / nginx / sites-available / default
listen 443 ssl http2 default_server;
listen [::]:443 ssl http2 default_server;

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

ステップ3—サーバー名を変更する

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

デフォルトでは、server_name_(アンダースコア)に設定されています。これは、構成ファイルがすべての着信要求を担当することを意味します。 次のように、_を実際のドメインに変更します。

/ etc / nginx / sites-available / default
server_name example.com;

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

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

  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

ステップ4—SSL証明書を追加する

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

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

  1. sudo mkdir /etc/nginx/ssl

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

  1. sudo cp /path/to/your/certificate.crt /etc/nginx/ssl/example.com.crt
  2. sudo cp /path/to/your/private.key /etc/nginx/ssl/example.com.key

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

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

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

/ etc / nginx / sites-available / default
ssl_certificate /etc/nginx/ssl/example.com.crt;
ssl_certificate_key /etc/nginx/ssl/example.com.key;

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

ステップ5—古い暗号スイートを回避する

HTTP / 2には古くて安全でない暗号の巨大なブラックリストがあるので、それらを避ける必要があります。 暗号スイートは、転送データを暗号化する方法を説明する一連の暗号化アルゴリズムです。

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

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

  1. 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;

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

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

  1. sudo nginx -t

ステップ6—キー交換セキュリティの強化

安全な接続を確立するための最初のステップは、サーバーとクライアントの間で秘密鍵を交換することです。 問題は、この時点まで、それらの間の接続が暗号化されていないことです。つまり、データの転送は第三者に表示されます。 そのため、Diffie–Hellman–Merkleアルゴリズムが必要です。 それがどのように機能するかについての技術的な詳細は、一言で説明できない複雑な問題ですが、詳細に本当に興味がある場合は、このYouTubeビデオを見ることができます。

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

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

  1. sudo openssl dhparam -out /etc/nginx/ssl/dhparam.pem 2048

SSL証明書と同じフォルダーにDHパラメーターを生成する必要があることに注意してください。 このチュートリアルでは、証明書は/etc/nginx/ssl/にあります。 これは、Nginxが常にcertificatesフォルダーでユーザー提供のDHEキーを検索し、存在する場合はそれを使用するためです。

ファイルパスの後の変数(この場合は2048)は、キーの長さを指定します。 2048ビットの長さのキーは十分に安全であり、Mozilla Foundation によって推奨されていますが、さらに暗号化が必要な場合は、4096に変更できます。

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

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

  1. 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    example.com;
       return         301 https://$server_name$request_uri;
}

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

構文エラーがないか構成を確認してください。

  1. 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 example.com;

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

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


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

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

  1. sudo systemctl restart nginx

ステップ9—変更を確認する

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

example.com

すべてが適切に構成されている場合は、HTTPSに自動的にリダイレクトされます。 次に、HTTP / 2が機能していることを確認しましょう。Chromeデベロッパーツールを開き(表示->デベロッパー->デベロッパーツール)、ページをリロードします([ X160X]表示