Ubuntu 16.04LTSでサーバー構築: Let’s EncryptでSSL化、リバースプロキシキャッシュからfastcgiキャッシュに切り替え

前回はWordPressをインストール、現在のUbuntu上に環境を構築すればWordPressが十分に速く動作する状態であることを確認しました。
今回はLet’s Encryptを使いブログをSSL化します……が、それによりサーバー側のキャッシュまわりに生じた問題の解決のほうに時間を使ってしまいました。

SSL化、しかし……

Let's Encryptのスクリプトを取得します。
$ git clone https://github.com/letsencrypt/letsencrypt
$ cd letsencrypt
$ ./letsencrypt-auto --help

Let's EncryptはWebサーバーとして動作することでドメインとサーバーを所持していることを証明しているので、一旦Webサーバーを止めてから証明書を取得します。
$ sudo systemctl stop nginx
$ ./letsencrypt-auto certonly -a standalone

Generate Mozilla Security Recommended Web Server Configuration Files

(null)

ここのジェネレーターでnginx用の設定を生成し、SSLのセキュリティをさらに強化します。

$ sudo systemctl start nginx

20160512_006

頭にhttpsをつければHTTPSで繋がり、WordPressのURL設定にhttpsをつければ終了……のはずですが、この環境ではリバースプロキシが悪さをしているのか「502 Bad Gateway」が出て管理画面に入れなくなってしまいました。仕方ないのでリバースプロキシの設定を一旦外しました。

fastcgi cacheに切り替える

調べてみると、WordPressのような全てがcgiで構成されているWebサイトでは「fastcgi cache」が有効に使えるようです。設定してみます。

Nginxのfastcgi_cacheでWordPressを高速化

WordPressの高速化施策ではNginxのリバースプロキシキャッシュが有名です。最近パフォーマンスを改善したくてPHP7だったりOPcacheだったりMySQLのクエリキャッシュなどやってたんですが、キャッシュを利用すると処理をバイパスするので段違いに応答が速くなります。数百ミリ秒だった応答が数十ミリ秒で返るので体感でもだいぶ変わってきます。 …

ほぼこの記事の丸パクリです。私のサーバーとWordPress環境は偉大な先人の知恵によりできています。

$ sudo nano -w /etc/nginx/nginx.conf

http {
    ...
    fastcgi_cache_path /var/cache/nginx levels=1:2 keys_zone=czone:4m inactive=120m max_size=64m;
}

$ sudo nano -w /etc/nginx/sites-enabled/wordpress

...
    # fastcgi cache
    fastcgi_cache_key $scheme://$host$request_uri;
    set $do_not_cache 0;
    if ($request_method !~ ^(GET)$) {
        set $do_not_cache 1;
    }
    if ($request_uri ~* "/wp-admin/|/xmlrpc.php|wp-.*.php|/feed/|index.php|sitemap(_index)?.xml) {
        set $do_not_cache 1;
    }
    if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_no_cache|wordpress_logged_in") {
        set $do_not_cache 1;
    }
    ...
    location ~ \.php$ {
        ...
        # fastcgi cache
        fastcgi_cache_bypass $do_not_cache;
        fastcgi_no_cache $do_not_cache;
        fastcgi_cache czone;
        fastcgi_cache_valid 200 302 7d;

        fastcgi_pass_header "X-Accel-Expires";
    }

今までリバースプロキシを使っていたので、残っているキャッシュを消します。(このコマンドはたいへん危険なので注意して実行すること)

$ sudo rm -rf /var/cache/nginx
$ sudo 

20160512_007

ベンチマークをとってみました。SSL化の影響もありますがhttp+リバースプロキシよりは遅くなってしまうようです。
その代わりHTTP/2で通信するようになったのもありますが、体感ではサクサク表示できていて違いはあまりわかりません。

また、この記事で表示されているURLで察しがついている方もいると思いますがこのブログはこの記事の執筆とともにConoHa(1GBプラン)上に再構築されています。それほどアクセスのないブログであることもありCloudFlareの使用もやめました。この記事で一旦サーバー構築記は一段落とさせていただきます。サーバー関連で何か書きたいことが出来たら随時書いていきます。

余談

今回のWebサーバー構築ではUbuntu 16.04+Nginx+PHP7+MariaDB 10.1という、(PHP7を除き)過去の実績といまどきらしさ(?)のバランスを重視したチョイスになっていますが、HTTP/2に特化したWebサーバーにh2oというものがありそれを使用したサーバーを構築している方もいます。最新の環境を試してみたい方は一度試してみると良いかもしれません……