#はじめに
fargateでWordpressのcronを実行する際の構成をまとめておきます。
#wp-cronについて
WordPressのジョブの定期実行(一定時間ごとの処理)の仕組みは、デフォルトではwp-cronと呼ばれる方法を利用しています。これは、Webアクセスをトリガーとし、現在実行すべき処理がないかどうかをその都度確認するものです。
しかし、アクセスがない場合、ジョブの定期実行により呼ばれる"予約投稿"が、時間を過ぎても投稿されません。
また、アクセスの多いサイトであればオーバーヘッドも気になります。
そこで、リアルタイムに処理する必要がある場合には、wp-cronからサーバー側の通常のcronに移行します。
#前提条件
- Fargateの構築
こちらの記事を作成ずみです。
#構成
.
├── Dockerfile
├── docker-compose.yml
├── cron.root
├── run.sh
└── html
└── wp-config.php
FROM wordpress:5.8.1-php7.4-apache
RUN set -ex; \
apt-get update && apt-get install -y \
cron \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
COPY html/wp-config.php /var/www/html
#cron実行
COPY cron.root /etc/cron.d/cron
RUN chmod 0644 /etc/cron.d/cron
ADD run.sh /bin/run.sh
CMD ["sh","/bin/run.sh"]
# 所有者の変更
RUN chown -R www-data:www-data /var/www/html
WORKDIR /var/www/html
docker-compose.yml
version: '3'
services:
wordpress:
build: . # カレントディレクトリのDockerfileでイメージをビルド
image: wordpress
ports:
- '80:80' # ローカルのport80でコンテナのport80にアクセスできるようにする
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_NAME: wordpress # MYSQL_DATABASEと一致させる
WORDPRESS_DB_USER: wp_user # MYSQL_USERと一致させる
WORDPRESS_DB_PASSWORD: wp_pass # MYSQL_PASSWORDと一致させる
run.sh
/etc/init.d/cron start
tail -f /dev/null
/etc/init.d/cron start
でスクリプトが終わると、エラーになります。
tail -f /dev/null
という意味がないコマンドを入れます。
cron
* * * * * root /usr/local/bin/php /var/www/html/wp-cron.php >> /var/log/cron1.log 2>&1
(↑cronは下に空行必須です。)
毎分cronが実行されます。
wp-config.php
# データベース設定の下の辺りに、下記の記述を追加します。
define('DISABLE_WP_CRON', 'true');
#確認
Fargate ExecでFargate内にアクセスし、cronが働いているか確認します。
Fargate Execの方法はこちら。
# cat /var/log/cron1.log
// wp-cron.phpのコードが出力されるとok
#参考