コジンテキネット

さくらのレンタルサーバに「さくらのウェブアクセラレータ (CDN)」を設定して高速化する方法

さくらのレンタルサーバに「さくらのウェブアクセラレータ (CDN)」を設定して高速化する方法

さくらのレンタルサーバには「コンテンツブースト」というCDN機能があります。

設定後しばらくは使っていたのですが、個人的に使いにくかったのがキャッシュ削除です。

WordPressで記事を更新したあとにキャッシュを削除するには、さくらのレンタルサーバのコントロールパネルへログインして、手動で削除する必要がありました。

記事を少し修正するたびに毎回ログインするのは、さすがに面倒です。

そこで今回は、コンテンツブーストではなく「さくらのウェブアクセラレータ(CDN)」を使うことにしました。


wwwなしドメインは、さくらの無料DNSでは使えない

さくらのウェブアクセラレータを使うには、CNAMEレコードまたはALIASレコードの設定が必要です。

しかし、このサイトは「kojinteki.net」のように、wwwなしのドメイン名で運用しています。

wwwなしのルートドメインにはCNAMEレコードを設定できず、さくらの無料DNSはALIASレコードにも対応していません。

そのため、さくらの無料DNSのままでは、wwwなしドメインでウェブアクセラレータを使うことができません。

回避策としては「www.kojinteki.net」のようにwwwありのドメイン名へ変更する方法もありますが、すでにwwwなしで運用している場合、URL変更はできれば避けたいところです。


さくらのクラウドDNSで解決

この問題は、有料の「さくらのクラウドDNS」を使うことで解決できます。

さくらのクラウドDNSであれば、wwwなしのドメインにALIASレコードを設定できるため、ルートドメインのまま、さくらのウェブアクセラレータを利用できます。

料金は月額44円なので、個人的には十分許容範囲です。

なお、すでにwwwありのドメインで運用している場合は、さくらの無料DNSでもCNAMEレコードを設定できるため、クラウドDNSを使わなくても対応できます。


Let’s Encryptの証明書の更新エラー

レンタルサーバ側で無料SSLを利用したまま、さくらのウェブアクセラレータ側でもLet’s Encryptの無料SSLを設定することはできました。

実際、ウェブアクセラレータ側のSSL証明書は問題なく発行され、サイトも正常に表示されていました。

しかし、しばらくすると、さくらのレンタルサーバから「SSL証明書更新エラー」のメールが届きました。原因は、ドメイン名がさくらのウェブアクセラレータ側のIPアドレスを向いているためです。

Let’s Encryptの証明書更新時に、レンタルサーバ側でドメイン認証ができなくなり、レンタルサーバ側の無料SSL証明書を更新できなくなったようです。

そのため、レンタルサーバ側のSSL証明書は削除し、SSLを利用しない設定に変更しました。つまり、SSL証明書は「レンタルサーバ側」ではなく「ウェブアクセラレータ側」で管理する形になります。


国外IPアドレスフィルターが効かなくなる

さくらのレンタルサーバには「国外IPアドレスフィルター」という機能があります。

この機能を有効にしておくと、WordPress管理画面などへの国外IPアドレスからのアクセスを制限できるため、不正ログイン対策として役立っていました。

しかし、さくらのウェブアクセラレータを前面に置くと、レンタルサーバ側の国外IPアドレスフィルターがうまく機能しなくなります。

理由は、WordPress管理画面へのアクセスが、すべて「さくらのウェブアクセラレータ経由」のアクセスとしてレンタルサーバに届くためです。

そのため、レンタルサーバ側から見ると、実際のアクセス元IPではなく、さくらのウェブアクセラレータからのアクセスに見えてしまいます。

実際に確認すると、WordPress管理画面への大量の不正アクセスの痕跡が残っていました。これは放置できないため、急いで別の方法で対策する必要がありました。


自作プログラムで不正アクセスを防ぐ

さくらのウェブアクセラレータを利用している場合、IPアドレスを基準にしたセキュリティ対策には注意が必要です。

通常の方法でアクセス元IPを取得すると、実際の接続元ではなく、さくらのウェブアクセラレータのIPアドレスとして認識されるためです。

そのため、IP制限系のセキュリティプラグインをそのまま使うと、正しく判定できなかったり、必要なIPアドレスを誤ってブロックしてしまう可能性があります。

そこで今回は、ウェブアクセラレータ経由のアクセスかどうかを判定し、ヘッダーから実際の接続元IPアドレスを取得する処理を自作しました。

以下のプログラムで接続元IPを正しく取得し、WordPress管理画面への不正アクセスをブロックします。

///=======================================================================
//   *クライアントIP取得
///=======================================================================

function ib_get_client_ip()
{
    $viewer_address = trim((string) ($_SERVER['HTTP_X_WEBACCEL_VIEWER_ADDRESS'] ?? ''));
    $remote_addr = trim((string) ($_SERVER['REMOTE_ADDR'] ?? ''));

    //---Webアクセラレータの接続元IP:PORT から IP だけ取り出す
    if ($viewer_address !== '') {
        $ip = preg_replace('/:\d+$/', '', $viewer_address);

        if ($ip !== null && filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) {
            return $ip;
        }
    }

    //---直接アクセス時
    if ($remote_addr !== '') {
        if (filter_var($remote_addr, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) {
            return $remote_addr;
        }
    }

    return '';
}

wwwあり・wwwなしの両方を登録した

ここは正直、まだ正解がよく分かっていません。

最初は、wwwなしのドメインだけをさくらのウェブアクセラレータに登録していました。

しかし、その状態でwwwありのURLにアクセスした場合、どのように扱われるのかが気になりました。

いろいろ試したものの挙動が分かりにくかったため、最終的にはwwwありのドメインも追加で登録しました。

今回の環境では、wwwあり・wwwなしの両方をウェブアクセラレータに登録しています。

これで、どちらのURLにアクセスされてもウェブアクセラレータ経由で処理できるようになりました。

これがベストな設定なのかは分かりませんが、今回はこの方法で対応しました。


wp-sacloud-webaccelプラグインでキャッシュを削除する

さくらのウェブアクセラレータを使うなら、次に気になるのがキャッシュの削除です。

WordPressで記事を更新したあと、毎回手動でキャッシュを削除するのは面倒なので、APIを使った自動削除機能を自作しようと思っていました。

しかし調べてみると、「wp-sacloud-webaccel」というWordPressプラグインを見つけました。

このプラグインを使えば、記事更新後にさくらのウェブアクセラレータのキャッシュを簡単にクリアできます。

コンテンツブーストで不便に感じていた「記事更新後のキャッシュ削除問題」は、このプラグインでかなり解決できました。


まとめ

今回は、技術的な興味もあり、オリジンサーバにさくらのレンタルサーバを使いながら、あえてコンテンツブーストではなく「さくらのウェブアクセラレータ」を設定してみました。

実際に使ってみると、wwwなしドメインのDNS設定、SSL証明書の更新エラー、国外IPアドレスフィルターが効かなくなる問題など、想定外のハマりどころがいくつもありました。

そのため、さくらのレンタルサーバで手軽にCDNを使いたい場合は、素直にコンテンツブーストを使うほうがよいと思います。

一般の方にはあまりおすすめできませんが、CDNの仕組みを理解するには、かなり勉強になりました!