2021年01月17日

ブログの実装を見直した

 長いこと「さくらのブログ」にお世話になってきたのですが、ついに「新規アカウント受付終了のお知らせ」が来てしまった。

さくらのブログは、2021年3月2日をもって、新規アカウントの作成受付を終了いたします。

受付終了以降、ブログアカウントをお持ちでない(ブログを一つもお持ちでない)場合、さくらのブログを追加作成することができなくなります。

新規アカウント受付終了のお知らせ

 すでに運用中のブログはそのまま使えるのだけど、近い将来にサービスを終了する予定であることは明らか。特に、これで https に対応する可能性はゼロになったと見てよい。サービス終了に備えて、ブログの実装を見直すことにした。基本的な作戦は、下の通り。

  1. 投稿する時には、ローカルのテキストファイルに記事を書いて、それを整形する。
  2. ブログ関連のファイルを ~/Sites/alchemy/blog/ 以下に置く。また、サイトの他のファイルは ~/Sites/alchemy/ 以下に置く。ローカルで Apache を走らせて、見え方をチェックできるようにする。
  3. ローカルの ~/Sites/alchemy/ ディレクトリを、サーバ上の http://d-alchemy.xyz/ と同期させる。今までは、ブログが http://blog.d-alchemy.xyz/ 以下、その他のページが http://d-alchemy.xyz/ 以下にあったので、ディレクトリツリーが別で、管理しづらかった。今回の見直しで、すべてのファイルが同じディレクトリツリーの中に入ることになる。
  4. これまでの http://blog.d-alchemy.xyz/ 以下の URL は、http://d-alchemy.xyz/blog/ に読み換える。
  5. 「最近の記事」、「アーカイブ」、「タグ」はすべてのページに共通で、かつ新規投稿があるたびに変化する。これを SSI (Server Side Include) で実装する。

 1. テキストファイルを整形するスクリプトは今でも持っている。「Ruby スクリプトでさくらブログに投稿する」に書いた方法で自動投稿を行う時、原稿のテキストファイルからタイトルや記事内容を抽出するのに使っている。これを修正して、html を生成させればよい。タグごと・月ごとに記事をまとめたページも、同時に作成する。

 2. ローカルで Apache を走らせる。Mac の「設定」からは「Web共有」が消えてしまったが、apache2 はインストールされている。sudo apachectl start でよい。(再起動した後は手動で立ち上げる必要がある。自動再起動させることもできるけど、大した手間ではないので、このままで運用する。)

 3. ローカルとサーバを同期させるのが、実はけっこう面倒。さくらの「ライトプラン」では、ssh 接続ができないため、rsync が効かないのです。これについては、outsider reflex の Piro さんが記事を書いている。(「シス管系女子」の人、という方が通りがいいのかも)

この記事では自分で自由に使えるLinuxなサーバーかPCがあるという事を前提として1、さくらのレンタルサーバーのライトプランで静的コンテンツだけのWebサイトを公開・運用する際のノウハウをご紹介します。

さくらのレンタルサーバーの一番安いプランでWebサイトを公開するノウハウ

 lftp を使えばよい、ということなので、Homebrew でインストールした (brew install lftp)。Homebrew を非標準のディレクトリ (/usr/local/homebrew) に置いているので、ビルドにめちゃ時間がかかったけど、問題なくインストールできました。

 4. http://blog.d-alchemy.xyz/ 以下の URL を http://d-alchemy.xyz/blog/ に読み換える。全部のブログ記事を転送しないといけないので、html にリダイレクト指定するのは現実的ではない。これはサーバ側で転送設定しないといけない。

 最初、DNS の設定で http://blog.d-alchemy.xyz/http://d-alchemy.xyz/blog/ を指すようにすればいいかな、と考えた。しかし、これだと、「d-alchemy.xyz/blog に直接アクセスした時」と「blog.d-alchemy.xyz 経由でアクセスした時」で「/」が指す先が違う、という面倒なことが起きる。前者だと「/」は「d-alchemy.xyz」、後者だと「/」は「blog.d-alchemy.xyz = d-alchemy.xyz/blog」となって、これらは違うディレクトリなのですね。

 そこで、「http://d-alchemy.xyz/blogold/ というディレクトリを別に作り、ここへのアクセスを http://d-alchemy.xyz/blog/ に転送するようにした。それには、blogold の中に .htaccess を作成し、下のように書く。

RewriteEngine On
RewriteRule (.*) /blog/$1 [R=301,L]

 これで、blog.d-alchemy.xyz としてアクセスされた時には d-alchemy.xyz/blog に転送され、URL も書き換えられる。従って、html の中で /blog/... などとルートからのパスを記述している場合、正しく d-alchemy.xyz/blog/... が参照される。

 5. SSI の実装。できれば、ファイル名は html のままで、SSI を使いたい。参考になるサイトがいくつか見つかった。

 もう少しいろいろ調べた結果、blog ディレクトリに .htaccess を作成して、下のように書くことにした。

Options +Includes
XBitHack full

 SSI を使いたい html ファイルは、実行許可をつけておく。XBitHack full が指定されていると、実行許可がついているファイルは SSI の指示を実行してくれる。html の中には、次のように書く。

<!--#include virtual="/blog/article/include1.html"-->

 #include virtual のファイル名は、絶対パスで書く必要がある。下の記事にある通り。

 なお、ローカルの apache でテストする時、ブラウザで http://localhost/ にアクセスすると、~/Sites が表示される(以前は /Library/WebServer/Documents だったんだけど、いつ変わったのかな?)。http://localhost:8080/~/Sites/d-alchemy が表示されるように設定した。ついでに、.htaccessRewriteEngineOptions +Includes が有効になるように、/etc/apache2/users/XXXXX.conf に下のように書き込んだ。

Listen 8080
<VirtualHost *:80>
DocumentRoot "/Users/XXXXX/Sites"
</VirtualHost>
<VirtualHost *:8080>
DocumentRoot "/Users/XXXXX/Sites/d-alchemy"
</VirtualHost>

<Directory "/Users/XXXXX/Sites/d-alchemy">
 DirectoryIndex index.html index.php
 AllowOverride FileInfo Options
 Options Indexes MultiViews FollowSymLinks
 Require all granted
</Directory>

 いろいろ大変だったけど、一応移行できたようです。しばらく様子を見て、問題なさそうだったら「さくらのブログ」の方を消去して、こちら1本で運用します。「さくらのブログ」の担当者の方、今までお世話になりありがとうございました!

Posted at 2021年01月17日 09:48:31
email.png