2016年6月3日金曜日

複数サイトのメンテナンスを WP-CLI でやろう!(サーバー管理者編)

いままで、WordPressをコマンドラインでメンテしようという情報をブログでいくつか書いてきました(関連情報参照)。ここで纏めということで、サーバー管理者向けに、

  • バックアップ > プラグイン更新 > WordPress 本体更新 > プラグイン更新 > 権限再設定(rootの場合)
WP-CLI(コマンドラインツール)を使って、Linux cronに組み込んで WordPressのメンテナンスを自動化しようっていうのを紹介してみます。本体更新の後に再度プラグイン更新をしているのは、WordPressの新しいバージョンのみ対応のプラグインの場合、本体更新後しかアップデートが出てこないため、念押しでやっています。

この方法を使うためには
  • サーバーにログインできること
  • WP-CLIがインストールでき、動作すること
  • サーバーで cronが利用できること
が必要です。


関連情報



個別説明


1. バックアップ



BackWPUPプラグインによるバックアップを WP-CLIから実施します。
従って、まずは BackWPUPをインストールし、1つ以上のバックアップジョブを作成しておいて、WordPressから正しく動作することを確認しておいてください。
下図のように、Last Runのところに実施した日時が記録されており、LogをチェックしてエラーがなければOKです。



そしてジョブ編集画面のURLをみて、ジョブIDをメモります。
(/wp-admin/admin.php?page=backwpupeditjob&jobid=◯&.....)の◯部分の数字

BackWPUPの特定ジョブをWP-CLIから実行するコマンドとしては
cd  WordPressフォルダ
/usr/local/bin/wp  backwpup  start --jobid=◯の数字
です。

なお
cd  WordPressフォルダ
/usr/local/bin/wp  backwpup jobs
で登録しているジョブ一覧が出ます。

wpは WP-CLIのコマンドツールで、以後 /usr/local/bin にインストールしていると仮定します。
※ rootでコマンドを実施することは非推奨になっています。
もしやるなら、sudo -u  ウェブサーバーの実行ユーザー  --  wp ◯◯ のようにユーザーを限定してやってみてください。

2. プラグイン更新


cd  WordPressフォルダ
/usr/local/bin/wp  plugin update --all 

以下のように、アップデートが実施されます。

3. WordPress 本体更新


以下、メジャーバージョンアップを含む最新版へのアップグレードです。

cd  WordPressフォルダ
/usr/local/bin/wp  core update 
/usr/local/bin/wp  core update-db

ただし  /usr/local/bin/wp  core update  で日本語版 WordPressへ更新されない場合には(up to dateになる)、
/usr/local/bin/wp  core update --force --locale=ja

を試してみてください。

また WP-CLIによるBackWPUPを動作させるなら、BackWPUP側のバックアップスケジュールは「manually only」にしておくとよいです。

どうも WordPress cronでスケジュールすると、とても重くなるようです。
某サーバーでは /wp-cron.php が負荷が大きすぎるから制限したと通達を食らったことがありました。調べると、BackWPUPだったのですよね...

4. 権限再調整(rootの場合)


rootで実施する時は特に、そこままでは root権限になって以後 WordPress側の自動アップデートや書き込みができないトラブルがでます。ので、管理者が root権限で実施している場合には

chown -R  本来のWordPressのオーナー権限   WordPressフォルダ/wp-content/
chown -R  本来のWordPressのオーナー権限   WordPressフォルダ/wp-includes/
chown -R  本来のWordPressのオーナー権限   WordPressフォルダ/wp-admin/

などと権限を調整しておく必要があります。

個別説明が出来た所で、これらのコマンドをログを取りながら実施するCSHスクリプトについて紹介します。サーバー環境によって適宜環境設定を変更してください。

CSHスクリプトの場合で root 権限で実施すると仮定すると


cd  WordPressフォルダ

/usr/local/bin/wp  backwpup  start --jobid=◯の数字

/usr/local/bin/wp  plugin update --all 

/usr/local/bin/wp  core update --force --locale=ja && /usr/local/bin/wp  core update-db

/usr/local/bin/wp  plugin update --all 

chown -R  本来のWordPressのオーナー権限   wp-content/
chown -R  本来のWordPressのオーナー権限   wp-includes/
chown -R  本来のWordPressのオーナー権限   wp-admin/

な感じになります。

これを CSHスクリプトにすると


  • CSHスクリプト   WordPressフォルダ  BackWPUPのジョブID  (言語 / 省略したら ja)

という感じで利用するとして、さらにどういう動作をしたのかログも取りたいと思いますので(ここでは、年月日.log に追記する形で保存)

簡易的なスクリプトにすると下記のような感じになるかなぁと思います。
WordPressのオーナーを apache(Apacheサーバーでありがち)にしてますが、そのあたりはサーバー管理者なら適宜修正できるでしょう。

なお下記のスクリプトは、このブログ用に作成しました。
実際に私が運用しているわけではありません。
拡張するなら、自動アップデート対象にしたくないプラグインを除外してアップデートできるとか、メールで実行完了通知を送るとか、別ファイルでアップデート対象を管理するなど、いろいろ考えられると思います。まぁ1つの参考にはなるかなと思います。

====== wp-auto-update.csh ======
#!/bin/csh -f 

set LOG_DIR = "/◯◯/"
set LOG_FILE = "$LOG_DIR/`date +%Y%m%d`.log"
set WP_CLI = "/usr/local/bin/wp --allow-root"
set WP_LANG = "ja"
set WP_FILE_PERMISSION = "apache"

if ("$1" == "" || "$2" == "") then
 goto usage
endif
if ("$3" != "") then
  set WP_LANG = "$3"  
endif

set WP_DIR = "$1"
set JOBID  = "$2"

if ( ! -d "$WP_DIR" || ! -f "${WP_DIR}/wp-config.php ) then
 echo "Cannot find out $WP_DIR or Incorrect WordPress."
 goto usage
endif

if ( ! -d "$LOG_DIR" ) then
 mkdir $LOG_DIR
endif


cd  $WP_DIR
echo "---" >> $LOG_FILE
echo "Start Log at `date +%Y%m%d.%H:%M:%S`" >> $LOG_FILE
echo "" >> $LOG_FILE

echo "### Backup WordPress files/folder and Database using BackWPUP Plugin ###" >> $LOG_FILE

echo "" >> $LOG_FILE


$WP_CLI  backwpup  start --jobid=$JOBID  >>& $LOG_FILE

echo "" >> $LOG_FILE
echo "### Plugin Update ###" >> $LOG_FILE
echo "" >> $LOG_FILE

$WP_CLI  plugin update --all  >>& $LOG_FILE

echo "" >> $LOG_FILE
echo "### Core Update ###" >> $LOG_FILE
echo "" >> $LOG_FILE

($WP_CLI  core update --force --locale=$WP_LANG && $WP_CLI  core update-db) >>& $LOG_FILE


echo "" >> $LOG_FILE

echo "### Plugin update after Core Update ###" >> $LOG_FILE

echo "" >> $LOG_FILE
$WP_CLI  plugin update --all  >>& $LOG_FILE

echo "" >> $LOG_FILE
echo "### Fixed Owner and Group permission for WordPress  ###" >> $LOG_FILE
echo "" >> $LOG_FILE

chown -R  $WP_FILE_PERMISSION   wp-content/
chown -R  $WP_FILE_PERMISSION   wp-includes/
chown -R  $WP_FILE_PERMISSION   wp-admin/

echo "" >> $LOG_FILE
echo "End Log at `date +%Y%m%d.%H:%M:%S`" >> $LOG_FILE
echo "---" >> $LOG_FILE

exit

usage:
  echo "Usage: $0  WordPressフォルダ  BackWPUPのジョブID  言語"
  exit
====

とまぁ、ざっとこんな感じでしょうか。
本体更新は怖いと思われるかもしれませんが、昔と異なりかなり頻繁にアップデートされているので、メジャーバージョンアップもそれほど怖くはありません。
心配なら、コアのアップデート部分と2つ目のプラグインアップデートの部分を消しておけばいいかなと思います。
また最初と最後にいつ始まって、いつ終わったのかをログに残したほうがいいよねぇということでそういった記載もいれてます。

cronに登録する際には


実際は
===== wp-auto-update-cron.csh  =====
#!/bin/csh -f

cd wp-auto-update.cshのあるフォルダ
wp-auto-update.csh  WordPressフォルダ  BackWPUPのジョブID  言語
wp-auto-update.csh  WordPressフォルダ  BackWPUPのジョブID  言語
wp-auto-update.csh  WordPressフォルダ  BackWPUPのジョブID  言語
wp-auto-update.csh  WordPressフォルダ  BackWPUPのジョブID  言語
=====
とか管理するWordPressの分だけ列挙しておいて

wp-auto-update-cron.csh を cron に登録しておけばよいという感じになりますね。

CSHシェルスクリプトは実行権限つけるのをお忘れなく。

cronへの登録


crontab -e で編集モードにして

0  0 * * *   /絶対パス/wp-auto-update-cron.csh

毎日0時に実行するなら上記を登録して

crontab -l
...
...
0  0 * * *   /絶対パス/wp-auto-update-cron.csh
....

のように登録されていたらOKですね。

最後に


WP-CLIツールはそれ自体を自動アップデートすることができます。
新しい WordPressに対応していない WP-CLIバージョンを利用するのは、意図しない動作をして危険です。

/usr/local/bin/wp cli update --yes
( rootで実行するなら、 /usr/local/bin/wp cli update --yes --allow-root 

をLinux cronにて毎日実行するように登録しておくことをお勧めします。

2016年6月2日 @kimipooh


0 件のコメント:

コメントを投稿

Google+ Badge