nginx
HTTPS
http2
letsencrypt

nginxでhttps通信をできるだけ高速化する

概要

テニスプレイヤーがLaravelでWebサービス作ってみたの個別記事です。

Let's Encryptでhttps通信を実現した後、httpsのオーバーヘッドをできるだけ少なくして、画面表示までの時間を短くしたときに使ったnginx.confの設定を記載します。個々がどんな技術かは詳しく記載しません。

Webサーバ上でphp(Laravel)が動作する、リバースプロキシやロードバランサを経由させない構成を想定しています。

nginx + Let's Encryptの設定についてはさくらのナレッジがとってもわかりやすいです。

  • gzip圧縮
  • http/2
  • OCSP

gzip圧縮

いきなりhttps関係ないですが、クライアントとサーバでファイルをやりとりする時に、対応するブラウザであればファイルをgzipで圧縮して転送する仕組みがnginxでは簡単に実装できます。

/etc/nginx/nginx.conf
http {
    ...
    gzip  on; #動的圧縮を有効化
}
server {
    ...
    location ~* \.php$ { #locationは適宜変更

        ...
        #圧縮する対象のファイルをmime typeで指定。text/htmlは常に圧縮される
        gzip_types text/css text/javascript
                   application/x-javascript application/javascript
                   application/json;
        gzip_min_length 1k; #圧縮対象ファイルの最小サイズ指定
        gzip_disable "msie6"; #IE6では圧縮されたファイルの展開に失敗することがあるので、その場合は圧縮しない

        ...
    }
}

http/2

クライアントとのhttps通信を効率的に、より少ない通信量で行う手法です。http/2を使うためにはSSL対応が必須です。

/etc/nginx/nginx.conf
server {
    listen 443 ssl http2;
    ...

}

これだけです。

OCSP

https通信を行う際、クライアントはWebサーバから送られてきた証明書の妥当性を毎回、認証局へ確認しに行きます。この動作はセキュリティ的には必要なのですがオーバーヘッドが非常に大きいです。妥当性が確認された証明書を渡していること(証明書が失効していないこと)をWebサーバにキャッシュしておき、まとめてクライアントへ渡すことでオーバーヘッドを最小限に抑える仕組みがOCSPです。

/etc/nginx/nginx.conf
server {
    ...
    resolver 8.8.8.8; #OCSPサーバへ通信するためネームサーバを指定する

    ssl_stapling on; #OCSPを有効化
    ssl_stapling_verify on; #OCSPの問い合わせ結果が正しいものであることを検証する

    #自身の証明書を指定する。CA証明書と中間CA証明書が1ファイルになったものを指定する必要がある。
    #Let's Encryptを利用している場合はchain.pemを指定すればOK
    ssl_trusted_certificate /etc/letsencrypt/live/[your.domain]/chain.pem; 

}