Ubuntu16.04でHTTP/2サポートを使用してNginxを設定する方法
序章
NGINXは、高速で信頼性の高いオープンソースWebサーバーです。 メモリーフットプリントが低く、スケーラビリティが高く、構成が容易で、さまざまなプロトコルの大部分をサポートしているため、人気を博しました。
サポートされているプロトコルの1つは、2015年5月に公開された比較的新しいHTTP/2です。 HTTP / 2の主な利点は、コンテンツが豊富なWebサイトでの転送速度が速いことです。
このチュートリアルは、HTTP/2をサポートする高速で安全なNginxサーバーをセットアップするのに役立ちます。
前提条件
始める前に、いくつかのことが必要になります。
- Ubuntu16.04ドロップレット
- sudo権限を持つroot以外のユーザー(詳細については、 Ubuntu 16.04 を使用した初期サーバーセットアップを確認してください)。
- 完全に登録されたドメイン。 Namecheap で購入するか、Freenomで無料で入手できます。
- ドロップレットを指すようにドメイン名が構成されていることを確認してください。 ヘルプが必要な場合は、このチュートリアルを確認してください。
- SSL証明書。 自己署名証明書を生成する、 Let's Encrypt から無料の証明書を取得する、または別のプロバイダーから証明書を購入する。
以上です。 上記のすべてが揃っている場合は、準備ができています。
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パッケージングシステムで利用可能なパッケージのリストを更新します。
sudo apt-get update
次に、Nginxをインストールします。
sudo apt-get install nginx
インストールプロセスが完了したら、次のように入力してNginxのバージョンを確認できます。
sudo nginx -v
出力は次のようになります。
sudonginx-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 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構成ファイルに変更を加えるときは常に、次のような構文エラーがないか構成を確認する必要があります。
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証明書を保存するディレクトリを作成します。
sudo mkdir /etc/nginx/ssl
証明書と秘密鍵をこの場所にコピーします。 また、ファイルの名前を変更して、関連付けられているドメインを示します。 これは、将来、このサーバーに複数のドメインが関連付けられている場合に役立ちます。 example.com
を実際のホスト名に置き換えます。
sudo cp /path/to/your/certificate.crt /etc/nginx/ssl/example.com.crt sudo cp /path/to/your/private.key /etc/nginx/ssl/example.com.key
それでは、構成ファイルをもう一度開いて、SSLを構成しましょう。
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年以来安全ではないと知られていましたが、この事実にもかかわらず、その使用は今日でも広く行われています)。
次の構成ファイルを開きます。
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アルゴリズムが必要です。 それがどのように機能するかについての技術的な詳細は、一言で説明することはできない複雑な問題ですが、詳細に本当に興味がある場合は、このYouTubeビデオを見ることができます。
デフォルトでは、Nginxは1028ビットのDHE(Ephemeral Diffie-Hellman)キーを使用します。これは、比較的簡単に復号化できます。 最大限のセキュリティを提供するには、独自のより安全なDHEキーを作成する必要があります。
これを行うには、次のコマンドを発行します。
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構成ファイルを再度開きます。
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; }
ファイルを保存し、構成ファイルを終了します。
構文エラーがないか構成を確認してください。
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サーバーを再起動します。
sudo systemctl restart nginx
ステップ9—変更を確認する
サーバーが稼働していることを確認しましょう。 Webブラウザーを開き、ドメインに移動します(example.com
を実際のドメイン名に置き換えます)。
example.com
すべてが適切に構成されている場合は、HTTPSに自動的にリダイレクトされます。 次に、HTTP / 2が機能していることを確認しましょう。Chromeデベロッパーツールを開き(表示->デベロッパー->デベロッパーツール)、ページをリロードします([ X160X]表示->このページを再読み込み)。 次に、ネットワークタブに移動し、名前で始まるテーブルヘッダー行をクリックして右クリックし、プロトコルオプションを選択します。
これで、HTTP /2コンテンツを提供するWebサイトの新しい列にh2
(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 StrictTransportSecurityを有効にする必要があります。
ブラウザが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; includeSubDomains" always;
ファイルを保存し、テキストエディタを終了します。
もう一度、構文エラーがないか構成を確認します。
sudo nginx -t
最後に、Nginxサーバーを再起動して変更を適用します。
sudo systemctl restart nginx
結論
NginxサーバーはHTTP/2ページを提供しています。 SSL接続の強度をテストする場合は、 Qualys SSL Lab にアクセスして、サーバーに対してテストを実行してください。 すべてが適切に構成されている場合は、セキュリティのためにA+マークを取得する必要があります。