前書き
NGINXは、高速で信頼性の高いオープンソースWebサーバーです。 低メモリフットプリント、高いスケーラビリティ、構成の容易さ、およびさまざまなプロトコルの大部分のサポートにより、人気を博しました。
サポートされるプロトコルの1つは、2015年5月に公開された比較的新しいHTTP / 2です。 HTTP / 2の主な利点は、コンテンツが豊富なWebサイトの転送速度が高いことです。
このチュートリアルは、HTTP / 2をサポートする高速で安全なNginxサーバーのセットアップに役立ちます。
前提条件
始める前に、いくつかのことが必要です。
-
Ubuntu 16.04ドロップレット
-
sudo権限を持つroot以外のユーザー(詳細については、Initial Server Setup with Ubuntu 16.04を確認してください)。
-
ドメイン名がドロップレットを指すように設定されていることを確認してください。 ヘルプが必要な場合は、this tutorialを確認してください。
-
SSL証明書。 Generate a self-signed certificate、obtain a free one from Let’s Encrypt、またはbuy one from another provider。
それがすべてです。 上記のすべてが揃っていれば、準備は完了です。
HTTP 1.1とHTTP / 2の違い
HTTP/2 is a new version of the Hypertext Transport Protocol, which is used on the Web to deliver pages from server to browser. HTTP/2 is the first major update of HTTP in almost two decades: HTTP1.1 was introduced to the public back in 1999 when webpages were usually just a single HTML file with inline CSS stylesheet. インターネットはそれ以来劇的に変化しており、現在、HTTP 1.1の制限に直面しています。プロトコルは、キュー内のページの一部をダウンロードするため、ほとんどの最新Webサイトの潜在的な転送速度を制限します(前の部分は、ダウンロードする前に完全にダウンロードする必要があります次の部分が始まります)、平均的な最新のWebページでは約100のリクエストをダウンロードする必要があります(各リクエストは画像、jsファイル、cssファイルなどです)。
HTTP/2 solves this problem because it brings a few fundamental changes:
-
すべてのリクエストはキューではなく並行してダウンロードされます
-
HTTPヘッダーは圧縮されています
-
ページはテキストファイルとしてではなくバイナリとして転送されるため、より効率的です
-
サーバーはユーザーのリクエストがなくてもデータを「プッシュ」できるため、待ち時間の長いユーザーの速度が向上します
HTTP / 2は暗号化を必要としませんが、Google ChromeとMozilla Firefoxの2つの最も人気のあるブラウザーの開発者は、セキュリティ上の理由からHTTPS接続に対してのみHTTP / 2をサポートすると述べました。 したがって、HTTP / 2サポートを使用してサーバーをセットアップする場合は、HTTPSを使用してサーバーを保護する必要もあります。
[[step-1 -—- installing-the-latest-version-of-nginx]] ==ステップ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をサポートしていることを確認し、パフォーマンスを最適化するためにいくつかの変更を行います。
[[step-2 -—- changing-the-listening-port-and-enabling-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に指示します。
[[step-3 -—- changing-the-server-name]] ==ステップ3—サーバー名の変更
server_name
エントリを使用して、構成ファイルに関連付けるドメインを指定します。 構成ファイルでserver_name
エントリを見つけます。
デフォルトでは、server_name
は_
(アンダースコア)に設定されています。これは、構成ファイルがすべての着信要求を担当することを意味します。 次のように、_
を実際のドメインに変更します。
/etc/nginx/sites-available/default
server_name example.com;
構成ファイルを保存し、テキストエディターを編集します。
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-— add-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/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;
ファイルを保存し、テキストエディターを終了します。
[[step-5 -—- avoiding-old-cipher-suites]] ==ステップ5—古い暗号スイートの回避
HTTP/2 has a huge blacklist of old and insecure ciphers, so we must avoid them. 暗号スイートは、暗号化アルゴリズムの集まりであり、転送データの暗号化方法を記述しています。
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
[[step-6 -—- increasing-key-exchange-security]] ==ステップ6—鍵交換セキュリティの強化
安全な接続を確立するための最初のステップは、サーバーとクライアント間の秘密鍵の交換です。 問題は、これまで、それらの間の接続が暗号化されていないことです。つまり、データの転送はどの第三者にも見えます。 そのため、Diffie–Hellman–Merkleアルゴリズムが必要です。 それがどのように機能するかについての技術的な詳細は、一言で説明することができない複雑な問題ですが、詳細に本当に興味がある場合は、this YouTube videoを見ることができます。
デフォルトでは、Nginxは1028ビットDHE(Ephemeral Diffie-Hellman)キーを使用します。これは比較的簡単に解読できます。 最大限のセキュリティを提供するには、より安全な独自のDHEキーを構築する必要があります。
それを行うには、次のコマンドを発行します。
sudo openssl dhparam -out /etc/nginx/ssl/dhparam.pem 2048
[.note] #SSL証明書と同じフォルダーにDHパラメーターを生成する必要があることに注意してください。 このチュートリアルでは、証明書は/etc/nginx/ssl/
にあります。 これは、Nginxが常にcertificatesフォルダーでユーザー提供のDHEキーを探し、存在する場合はそれを使用するためです。
#
ファイルパスの後の変数(この場合は2048
)は、キーの長さを指定します。 2048ビット長のキーは十分に安全でrecommended by the 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;
[[step-7 -—- redirecting-all-http-request-to-https]] ==ステップ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
[[step-8 -—- reloading-nginx]] ==ステップ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
[[step-9 -—- verifying-the-changes]] ==ステップ9—変更の検証
サーバーが稼働していることを確認しましょう。 Webブラウザーを開き、ドメインに移動します(example.com
を実際のドメイン名に置き換えます)。
example.com
すべてが正しく構成されていれば、自動的にHTTPSにリダイレクトされます。 それでは、HTTP / 2が機能していることを確認しましょう。Chromeデベロッパーツールを開き(View→Developer→Developer Tools)、ページをリロードします(View→Reload This Page)。 s)。 次に、Networkタブに移動し、Nameで始まるテーブルヘッダー行をクリックして右クリックし、Protocolオプションを選択します。
これで、HTTP / 2コンテンツを提供するWebサイトの新しい列にh2
(HTTP / 2を表す)が表示されます。
この時点で、サーバーはHTTP / 2プロトコルを介してコンテンツを提供する準備ができていますが、実稼働で使用するサーバーを準備するために行うべきことがいくつかあります。
[[step-10 -—- optimizing-nginx-for-best-performance]] ==ステップ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; includeSubDomains" always;
ファイルを保存し、テキストエディターを終了します。
もう一度、構文エラーの構成を確認します。
sudo nginx -t
最後に、変更を適用するためにNginxサーバーを再起動します。
sudo systemctl restart nginx
結論
NginxサーバーはHTTP / 2ページを提供しています。 SSL接続の強度をテストする場合は、Qualys SSL Labにアクセスして、サーバーに対してテストを実行してください。 すべてが適切に構成されている場合、セキュリティのためにA +マークを取得する必要があります。