株式会社ヒニアラタでは、baserCMS5系で動作する静的HTMLジェネレーターを開発&配布をしています。 先日WordPressの脆弱性がニュースになりましたが、AIが発達したいまとなっては、動的サイトの脆弱性発見とその対策はイタチごっこの様相を呈してきました。
AI時代以前でもセキュリティ対策として、CMSを表にださずフロント側とは異なる場所におくアプローチが取られてきており、baserCMS5を使った制作案件でもCDNサーバーを使うなどの方法で実現してきたと思います。
今回はCDNサーバーを契約するほどの予算がなかったり、Astroなどのジェネレーターを使わずにサイトを静的化したい(プラグイン等で拡張したコンテンツがAstroで使うAPIを持っていない)などの場合でも対応できる、baserCMSで制作されたサイトを静的書き出しできるプラグインとなっています。
機能の概要
機能一覧
本プラグインには定期的に書き出しを実行する「全ページ生成」と、固定ページやブログ記事などが更新された際に部分的に生成実行する「差分生成」とがあります。
- 全ページ生成
- 差分生成
- 静的ファイル同期(アップローダーの公開期限を反映)
- 公開フォルダへのHTML展開(別サーバーへもSSH接続+rsyncで展開可能)
- 生成したHTMLのバックアップ保存
なお、各機能の詳細なマニュアルはこちらをご覧ください。
全ページ生成について
本プラグインは下記の手順で静的書き出しと公開とを実現します。
- URLを収集します(「検索インデックス」や「コンテンツのデータ」、「サイトをクロール」して収集。収集方法は選択OK。)
- cronによる定期実行で、収集したURLからHTMLを生成します(一度にすべてを実行せず、設定画面で決めた件数または時間ごとに処理します)。
- 収集したすべてのURLをHTMLに生成したら、次に静的ファイルをコピーします。
- 生成されたHTML群を公開フォルダへコピーします。(rsyncを用いて別サーバへも展開できます)
差分生成について
また、本プラグインはブログや固定ページなどに更新があった際に、一部のファイルだけを書き出して更新する「差分生成」に対応しています。
- 差分生成の設定画面で、「実行される条件(ex.ブログが更新されたら)」と「実行する内容(ex.一覧ページの1ページ目と記事ページを更新する)」を設定。
- 設定した条件が発動すると、キューに積まれて次回のcronで実行されHTML生成&公開が行われます。
差分生成は独自プラグインの「保存」をトリガーにすることもできます(独自プラグインの仕様によっては、独自プラグイン側を調整する必要があります)。
静的ファイルの同期について
静的ファイルの同期方法は下記の通りです。
- 使用中のテーマのwebroot、ファイルアップローダーがアップロードするファイル群を公開フォルダへ転送。
- 個別に指定するフォルダ・ファイルを公開フォルダへ転送(上記以外で必要なファイルはこれで転送する)。
- リネームマッピング(「cms.htaccess」→「.htaccess」など名前を変更して)転送。
- なお、ファイルアップローダーでアップロードしたファイルについて、公開期限(開始〜終了)が設定されたファイル用のフォルダ(limitedフォルダ)は同期されず公開しません。
公開フォルダへの展開
ステージングフォルダに生成されたHTML群を公開フォルダへ展開(コピー)することでサイトを公開します。
- CMSと同じサーバー内に公開フォルダがある場合、上書きコピーで書き換えます。
- CMSとは別サーバー内に公開フォルダがある場合、SSHで接続してrsyncで同期します。
- なお、ステージングにあるファイル群が公開フォルダと比較して著しく少ない場合、安全ブレーキが作動します。更新したファイルは上書きしますが、404エラーなどで本来消されるページは消さずに残します(このブレーキは意図しない問題の発生で、書き出し対象のページが404エラー等で収集できなかったような場合に、公開サイト側が壊れるのを防ぐための安全装置です。このブレーキが作動した場合、メールで管理者へ通知がなされます)。
クイックスタート
本プラグインを使うには、まずローカル環境やテスト環境で意図したサイト生成が行われるかを必ず確認してください。
baserCMSでできたサイトは、PHPを使った動的サイトです。それを静的に書き出しますので、サイト内検索の機能など使えなくなるものがあります。
1.書き出しの設定

上画像は同じサーバー内にCMSフォルダと公開フォルダが存在している構成例です。一般には公開フォルダ側のサイトを公開して、CMS側のサイトはBasic認証やIP制限などを入れて保護するイメージです。
この前提で、プラグインの設定画面を開きます。

設定画面に入ると重要な設定項目が最初に5つでてきます。

静的生成の有効無効
静的生成を実施するかどうかの設定です。一時的に停止したい場合などは、CRONなどを触らなくても、ここで停止できます。まずここをチェックしておいてください。
CMS基本URL
CMS側のURLを指定して下さい(自動で取得して表示します)。
公開サイトURL
公開サイトのURLを指定してください。上にある選択肢によって、生成するHTMLの中にCMS側のURLが絶対パスで書かれてしまっているような部分(href、src...)がある場合に、公開サイトURLで読み替えて生成することができます。
一時生成パス
本プラグインは、公開フォルダにHTMLを直接書き出すのではなく、まず一時フォルダ内にファイル群を作成して、全部揃ったら公開フォルダへコピーする仕組みです。画像はぼかしが入っていますが、ココでは以下のような感じで設定してあります。
/home/(サーバーのユーザー名)/public_html/static-cms.xxxxxx.space/static/staging
公開先パス
公開サイトのフォルダパス(ドメインルート)を指定します。別サーバーへ展開する場合は、設定画面の下にあるrsyncの項目を使います。
全生成
基本設定が終わったら、全生成の項目に進みます。基本的には夜間の全ページ再生成にチェックを入れて下さい。簡単な動作確認後にCRONを設定しますが、1日1回は全てを書き出し直すことで、サイト全体がキレイになります。
URL収集
URLの収集方法を設定します。基本的には「検索インデックス」「コンテンツ」の2つはチェックを入れて下さい。プラグインが静的HTMLとして書き出す対象を発見するのに必要です。
なお、「HTMLのリンクを遡って収集」という機能は、独自プラグインなどで検索インデックスやコンテンツ管理から見つけられないページを本プラグインに発見させるためのものです(外部リンクは無視します)。
静的ファイル同期
画像やCSS、JSなどの静的ファイルを同期するための設定です。
静的ファイル同期の有効無効
基本的に有効にしてください。
手動同期パターン
同期させたいフォルダやファイルのパスを記述できます。ただし、利用しているテーマフォルダのwebroot配下、ファイルアップローダーにってアップされたファイル群は自動で同期されますので、ここに書く必要はありません。
除外パターン
同期させたくないフォルダやファイルのパスを記述できます。
リネームマッピング
転送されているファイルの中から、ファイル名を変更してコピーできます。パスはCMS側のドメインルートから指定します。ここではリネームの設定をするだけですので、転送されるファイルの中にマッピング条件にあうものがなければ、何もおきません。
外部フォルダの同期
任意のフォルダを公開フォルダに同期できます。(baserCMSをインストールしたばかりの標準サンプルテーマでは、baserCMSの本体側のbc-frontフォルダにあるCSSや画像ファイルを見ています。通常は独自のテーマを作成していると思いますが、こうした特殊なケースでファイルを同期したいときに役に立ちます)
2.手動で全ページ生成
設定ができたら、まずは手動で静的ファイルが意図したフォルダへ生成されるか確認してみましょう。ダッシュボード画面の下にある手動操作のボタンのうち「全ページ再生成」をクリックしてください。

すると、処理が走って必要なファイルがキューに積まれます。
次に「今すぐキュー処理」をクリックします。キュー処理は事故防止のために一気に進まず、1回あたりの上限(デフォルトでは30件または2分以内)がありますので、処理件数が0になるまで、何度かクリックしてください(下図のように処理した件数がでます。)。

3.静的ファイル同期と公開
ダッシュボードの「静的ファイル同期」ボタンを押して、静的ファイルをコピーしたあと「公開」ボタンを押すと、一時フォルダに生成されていたHTMLと静的ファイルが設定画面で登録した公開先へとコピーされます。
(なお、この列にある「sitemap.xml生成」ボタンは「書き出しに成功したURL」をベースにsitemap.xmlを自動生成するものです。生成ボタンを押してから、「公開」ボタンをおせば一緒に公開サイトへ転送されます。)
この状態で一度、公開側のサイトを確認してみてください。意図通り見えていればOKです。CRONの設定を行いましょう。
4.CRONの定期実行設定
基本のCRON設定は下記の通りです(パスは読み替えてください)。
*/5 * * * * cd /var/www/html && bin/cake hat_static_engine work -q
30 3 * * * cd /var/www/html && bin/cake hat_static_engine full -q
0 4 * * 0 cd /var/www/html && bin/cake hat_static_engine purge-logs -q
上から「5分おきにジョブを実行(差分生成)」、「午前3時30分に全ページ書き出しを実行」、「毎週1回、90日以上前のログを削除する」ためのものです。ログの削除は手動で消すことも出来るので不要であれば設定しなくてOKです。
今回、私はエックスサーバー上で本プラグインの動作テストをしましたが、その際のパスは以下のようになりました。PHPのパスを明示的に示したうえ「bin/cake.php」というように実体側を指さないといけなかったのもポイントです。
*/5 * * * * cd /home/(サーバーのユーザー名)/public_html/static-cms.xxxxxx.space/ && /usr/bin/php8.x bin/cake.php hat_static_engine work -q
5.差分生成の設定
さて、手動で全ページ生成が出来るのを確認したら、差分生成の発動条件等を設定します。この設定が入っていないと、CRONが回っていても差分生成は実行されません。
この機能は少し複雑に見えますが、「トリガーとなる”条件”が発動したら、事前に設定した”内容”で静的HTMLを生成する」という機能です。条件と内容とを設定するのがミソです。
多くの場合はブログ記事を書いたときに、記事を差分生成して公開するというような使い方になります(毎回、全ページ生成していたのでは時間がかかる)。そこで、本プラグインではブログコンテンツに関してのみ簡単にセットできるショートカットを用意しています。
まず差分生成の詳細画面の「差分生成する条件」をクリックしてください。

すると下図のような「条件」の設定画面になりますので、「差分生成の基本セットを作る」という見出しの下にある選択ボックスで、条件をセットしたいブログを選んで「この内容で生成する」をクリックしてください。

この操作を行うと、指定したブログで記事が保存されたとき、その記事ページに加えて下記のページも更新されるようになります。
一覧ページ(1ページ目) / 記事詳細ページ(保存した記事) / カテゴリ一覧ページ(更新した記事のカテゴリ・1ページ目) / タグ一覧ページ(更新した記事のタグ・1ページ目) / 年別アーカイブ(1ページ目) / 月別アーカイブ(1ページ目) / RSS
ブログ系のコンテンツは基本セットで簡単に生成できます。このセット内容を参考にして、独自プラグインの保存時の挙動なども差分生成の条件としてセットしてみてください。
別サーバーへの転送
上記のクイックスタートでは触れませんでしたが、書き出したHTMLを別サーバーへ転送するという運用も多いと思います。本プラグインではSSHを使ってrsyncで別サーバーと動機することができます。
1.フィンガープリントの登録

SSHの接続先、秘密鍵、ポートなどをセットして保存します。次に「転送先のホスト鍵を取得」をクリックすると、相手先のフィンガープリントを取得できます。よく内容を確認して間違いなければ「この鍵を登録する」とします。すると、known_hostsに保存され、公開先のサーバーとして使えるようになります。
2.ダッシュボードで手動チェック
設定が完了したら、ダッシュボードの「全ページ生成」からキュー処理を最後まで行って「公開」を行ってください。転送先サーバーへHTMLが送信されていれば成功です。
機能の詳細はマニュアルサイトで
機能の詳細はマニュアルサイトに用意してあります。お確かめ下さい。