baserCMSのサーバ間引越しの際によく遭遇するエラーと対策
さて、本日も続けてbaserCMSの記事です。
弊社がbaserCMSでホームページ制作を行う際は、ローカル環境でテーマをコーディングして、固定ページを作成し、本番環境ないしテスト環境に丸ごとデータを移す、という手順がほとんどです。
たまに設定変更を失念してエラーに引っかかることがあるのでまとめておこうと思います。
データベースの中身とファイルを丸ごと移行する手順になります。
引っ越しの手順
0.(オプション)事前準備~移行先の環境のエラー出力を確認する
何らかの問題が起こった場合はエラー出力やログを読むのが解決の近道です。
- Apache(ないしnginx・IISなど他のWebサーバ)のエラーログ
- PHPのエラーログ・出力
- CakePHP/baserCMSのエラーログ
がbaserCMS設置時のエラー・不具合解決ににおける3種の神器と言えましょう。
共用サーバではApacheのログは簡単には見られない場合もありますが、PHPのエラーについてはphp.iniを編集、またはサーバ管理画面のPHP設定の機能から設定できるサーバがほとんどだと思います。
display_errorsをOnにしてエラーをHTMLで出力、またはlog_errorsをOnにしてerror_logでエラーの出力先ファイルを指定することでPHPのエラーを捕捉できます。
CakePHP/baserCMSのエラーはbaserCMSのデバッグモードをONにすればより多くの情報が画面に表示されるほか、 baserCMSのディレクトリ内app/tmp/logs/以下にも出力されます。 後に不具合を発見・解析しやすいので、あらかじめデバッグモードを1以上に設定しておくとよいでしょう。
1.データベースのデータを移行
移行前の環境のデータベースからbaserCMSのテーブルのデータを全てエクスポートし、移行先の環境のデータベースにインポートします。
共用サーバを利用する場合は、特にMySQLを利用することが多いと思います。 サーバに設置されているGUI管理ツールphpMyAdminなどを利用する場合はエクスポート・インポート機能が用意されていますし、 mysqldumpコマンドとmysqlコマンドを利用してsqlファイルを入出力してもかまいません。
一つのデータベースに複数のbaserCMSをインストールしている場合はテーブルのプリフィックスに気を付けましょう。
SQLiteの場合はデータがファイルに保存されているのでこの手順を意識する必要はありません。
2.ファイルを移行
baserCMSをインストールしたディレクトリ以下のファイルとディレクトリをFTPなどで 移行先の環境にアップロードします。
アップロード不要なファイル
- Vagrantfile vagrant_cookbooks .vagrant などVagrant・Chef関係
- READEME.md
- (移行先でGitによるバージョン管理をしない場合).git .gitignore などGit関係
- (WebサーバとしてIISを利用しない場合)web.default.config
Gitが利用できる場合はGitを使ったほうが楽ですね
3.設定ファイルを変更
SQLiteを利用しておらず、かつデータベースの接続設定が異なる場合は、app/Config/database.phpのデータベース接続設定を変更します。
また、app/Config/install.phpのサイトURLを変更します。
※後者は後に管理画面のシステム設定から変更しても問題ないかと思います。
よくあるエラーの症状と原因と対策
以下、独断と主観により、頻出すると思われるエラーについて列挙します。
1.ディレクトリ・ファイルのパーミッション
症状
ファイルに書き込めないというPHPのエラーが出ます。 特にセッションファイルに書き込めない場合、エラー表示をオフにしていると気づきにくいのですが、ユーザー名とパスワードは合っているはずなのにログインできないなどの症状があります。
また、テーマや一部のファイルが書き込めない場合、管理画面で編集不可と警告が出たり、設定項目がグレーで表示されることが多いです。
原因と対策
利用しているサーバとFTPクライアントソフトによってはFTPでアップロードした際に適切なパーミッションが設定されないことがあります。
baserCMSは一部のディレクトリ内のファイルを読み書きを行うので、該当ディレクトリ以下のパーミッションを書き込み可能に変更します。 サーバによってディレクトリのパーミッションの設定は変わるのですが、 共用サーバの場合は707ないし777を推奨しているサーバが多いでしょうか。
Webサーバ(ないしPHP)の実行ユーザによる書き込みを許可すべき主なディレクトリ
- app/tmp/ → エラーログやキャッシュ・セッションのデータ
- app/Config/ → 各種設定
- app/webroot/theme/ → テーマディレクトリ(特にapp/webroot/themed/テーマ名/Pages以下)
- app/db/ → SQLiteを利用する場合のデータベースファイルの保存先
一部のファイルも管理画面から設定変更を行う場合は書き込み可能になっている必要があります。
書き込み許可が必要なファイルの例
- .htaccessおよびapp/webroot/.htaccess → 管理画面からスマートURLのオンオフの操作をする場合
- app/Config/core.php
こちらのパーミッションは606だったり666だったりします。
2.データベース接続設定
症状
データベースに接続できないという旨のPHPのエラーが出る。
原因と対策
以降前後の環境でデータベース接続設定が異なるのが原因なので、 app/Config/database.phpを修正します。 特に共用サーバはデータベース用のサーバのホストがlocalhost以外に指定されていたり、ユーザーごとにデータベース名のプレフィックスが指定されていることが多いので注意が必要です。 事前に本番環境でデータベースを作成しておき、ローカル側の設定を本番に合わせることができるなら予防も可能です。
3. サイトURLの設定
症状
baserCMSが出力したタグのリンク先が一部おかしい。
原因と対策
移行前の環境のURL設定がそのままです。 管理画面のシステム設定から設定できます。 設定の実体はapp/Config/install.phpのこの部分なので手動で直してもOKです。
Configure::write('BcEnv.siteUrl', 'http://nextat.co.jp/');
Configure::write('BcEnv.sslUrl', '');
4. .htaccessの設定
症状
Webサーバのエラーで500 Internal Server Error が表示されることが多いです。 リダイレクトループが起こったので途中で止めたよ☆(意訳)とのエラーがWebサーバに記録されることもよくあります。 ローカル環境はWebサーバのドキュメントルートのサブディレクトリで開発していたけど サーバではドキュメントルート直下に配置している、またはその逆というケースでよくあるエラーです。
原因と対策
スマートURLがONの時に.htaccessのリダイレクト先を環境にあった設定に変更していないのが原因です。 確認すべきファイルは2つです。共にRewriteBaseの設定を確認する必要があります。
.htaccess
#ドキュメントルートへの設置時
RewriteBase /
#サブディレクトリへの設置時
RewirteBase /subdirectory/
app/webroot/.htaccess
#ドキュメントルートへの設置時
RewriteBase /app/webroot/
#サブディレクトリへの設置時
RewriteBase /subdirectory/app/webroot/
おまけ PHPのバージョンやエクステンションの違い
症状
構文エラーまたは関数やクラスが存在しない等とPHPのエラーが出る。
原因と対策
PHPのバージョンアップにより追加・排除された機能、エクステンションの有無にまつわるエラーです。
PHP 5.4で追加された array() の短縮構文 [] を嬉々として利用していたら サーバのPHPの初期設定が5.3でシンタックスエラーが!なんてこともあります。 共用サーバでもPHPのバージョンを選択できる場合は変更すればOKです。 共用サーバでご利用のPHPのバージョンが選択できない場合、エクステンションの有無によるエラーだった場合は泣きながら他の互換性のある機能を使って書き換えます。
まとめ
長々と書きましたが、移行前と移行後の環境でなるべく環境設定をそろえることで回避できる項目がほとんどです。 特に本番環境はLinux・ローカルの作業はWindowsという方には公式Vagrant Boxの利用をお勧めします。