本サイトおよび関連サイトにおけるCRONジョブの設定についてのまとめ
各情報サイトやDrupal関連のサイトで紹介されている通り基本的にshellscriptで
#!/bin/sh
/usr/local/bin/php /Drupalを設置したディレクトリ(サーバー側から見た実体ディレクトリ)/cron.php
exitのように書いて登録していれば良いが、この方法だと本サイトのようにマルチサイトで構築している場合に困ったことが起きる。
メインサイトのCRONしか実行してくれないからである。
マルチサイト構成の場合、データベースは別に用意されるのでそちらのデータは一切更新されない。これでは困る。
さまざまな試行錯誤をしてたどり着いた方法がこれ。
#!/bin/sh
/usr/local/bin/curl http://hogesite1.com/cron.php
/usr/local/bin/curl http://hogesite2.com/cron.php
/usr/local/bin/curl http://hogesite3.com/cron.php
exitcurl コマンドをつかって直接アドレスをたたく。curlは指定されたURLからファイルを取得して標準出力に出力するコマンドで、Server側の標準出力がいったいどこを指しているのか、consoleにでるだけなのかはたまた一時ファイルとしてどこかに保存されるのか…。そこはかとなく不安があるが、まあ運用上問題なさげなのでいいだろう。ほかにもwgetなどの似たような機能のコマンドがある。Server側のシステムでコマンドが使えるようになっていなければならないが標準的なものなのでたいていのServerには入ってるはずだ。
これを設定しててわkったのだがcron.phpはguestユーザーからでもアクセスできる。自分のサイトでログインせずにcron.phpのアドレスをたたき、管理レポートの現状報告かログを確認してみるといい。レスポンスを返さないので真っ白な画面が表示されるだけだがちゃんと機能する。
が、ここでちょっと気にかかった。
「これはもしかしてセキュリティ上よろしくないのではなかろうか?」
CRONが実行されたからといって特に被害が出るわけではないが、無制限にアクセスされれば当然大量のリソースを消費するはずだ(CRONで呼び出す処理の内容にもよるがDrupalの場合フェードのチェックからデーターベースの更新まで結構たくさんの事をこなしている)。これはさすがに放置してはまずい。
ということで.htaccess ファイルによる制限にcron関係を追加する。
<Files cron.php> order deny,allow deny from all allow from hogehoge.server.com # AddHandler application/x-httpd-phpcgi .php </Files>
ファイル指定でcron.phpに制限を掛け、自分のServerからのアクセスのみ許可する。CRONはサーバーが実行するわけだから外部からのアクセスはこれで防げる。同じサーバー上の他のユーザー(もしくはプログラム)がアクセスしてきた場合は防げないが、まあそんな物好きもすくなかろう。コメントアウトしているAddHandlerはphpをcgiとして実行させるかどうかの指定。cgi ではなくても特に動作に変わりは内容なのでコメントアウトしてある。cgi でないと不具合がおきる(たいていファイルの作成に関するパーミッション関連)ようなら指定すると良いだろう。
これでセキュリティもそれなりに、CRONが実行されるようになったが、ほかの問題が発生。CRONが実行完了せず固まったままになることが頻発したのだ。
ここで管理者はすこし思い違いをしていたのだが、CRONの実行はそれなりにサーバーリソースを占有するので、なるべくならば動かさないほうが良いと思っていたのだ。なので24時間に一回実行する設定にしていた。
これが大きな間違いだった。たしかにCRONの実行回数は少ないほうがいい。だが、長い間Drupal上でCRONを実行しないと、処理するべきデーターが増大し結果的にCRON実行時の処理時間がながくなり強制終了させられてしまうのだ(サーバー側でスタックしているプロセスをkillしているようだ。またサーバーの説明にCRONの実行時間は一回3分までという文言があった)。
すなわち一度に大量の作業がくるよりは、回数が多くても少ない作業をすばやくこなすほうがサーバーにとっては良いということなのだ。
これに関連して、スクリプトないで3つのサイトにアクセスしていたが、これを3つのファイルに分けて1ファイル1アクセスにし、それぞれを時間差でCRONジョブとして実行するようにしてみた。
結果はいまのところ良好のようである(それでもたまにCRONが止まっているというログがでるときはある)。
Recent comments