主に共用サーバーで起こる問題だとは思うのですが、Drupalにログインした状態だとサイトが閲覧できなくなることがあります。
この状態に陥ると、未認証ユーザーだと問題なくサイトを見ることができるのに、ログインした瞬間から500 Internal Server Errorのオンパレードになっちゃいます。管理画面も見れなくなるので、お手上げ状態です。
先日、私が運用しているサイトでもログインするとサイト閲覧できなくなる問題が起こったのですが、その時に行った対応を記録しておきたいと思います。
対策1.サーバーのメモリリミットを増やす
.htaccessを使う場合
.htaccessが利用できるサーバーの場合、.htaccessを使ってメモリの使用上限を変更することができます。
.htaccessに以下の内容を追記すれば、使えるメモリの上限を変更できます。
php_value memory_limit 256M
“256M”の部分がメモリの上限値なので、もっと上げたい場合はここを変更してください。
php.iniを使う場合
php.iniを使っている場合は、memory_limitの値を変更することでメモリリミットを調整します。
memory_limit = 256M
ちなみに値を-1にすると上限なしになります。
対策2.キャッシュをクリアする
管理画面にアクセスできないのにどうやってキャッシュをクリアするんだ、と思ったかもしれませんが、管理画面ではなくデータベースで直接消去します。
※データベースを操作する前に必ずバックアップを取ってください。他の問題が発生した場合は、DBを元の状態に戻しましょう。
私のサイトの場合は、キャッシュすべてをクリアするのではなく、Viewsモジュールのキャッシュだけクリアしたら改善しました。Viewsモジュールを利用している場合は、この方法を試してみてください。
phpMyAdminなどでデータベースにアクセスすると、cache_viewsというテーブルがあります。このテーブルにはViewsモジュール用のキャッシュが記録されていますので、テーブル内を空にしてキャッシュを削除しましょう。
これで改善しない場合は、他のキャッシュも削除してみてください。”cache”で始まるテーブルはすべてキャッシュデータが入っています。
原因は何だったのか
サーバーの生ログを見てみると、問題が発生した時間帯に「負荷が上がってリソース不足になっている」旨のメッセージが頻繁に出力されていました。それによって、サーバー側からアカウント制御がかかりプロセスが強制終了されていたみたいです。
プロセスが強制終了したことによって、中途半端なViewsのキャッシュが残り、それが消えなかったことが原因になっていたのではないかと推測しています。これが、冒頭に”主に共用サーバーで起こる問題”と書いた理由です。
専用サーバーやVPSだとアカウント制御はかからないので、推測が正しいとすれば同じ原因で問題が発生することはないですよね。
結局のところ「リソース不足」が問題のトリガーになっているのかなと思います。
あとがき
対策1か対策2のいずれかを実施するだけで改善することもあります。
また、環境によっては両方の対策を実施しても改善しない場合もあると思います。その場合は、そもそもPHPの記述が間違っていたり、ループが発生している可能性も考えられます。