お名前ドットコムVPSへ移行への道12-エラーログを見て対策

※ 当サイトではアフィリエイト広告を利用しています。リンクは広告リンクも含みます。

この記事は約10分で読めます。
広告

お名前.com VPS を使用中に出たエラーログを見て対策します。
都度、追加していきます。
環境
パソコン Windows11
VPS OS Ubuntu 20.04.3 LTS、 
Docker image: owasp/modsecurity-crs:nginx
image: wordpress:fpm-alpine
こちら↓が環境を構築してきた記録なので参考にしてください。

お名前ドットコムVPSへ移行への道

2024/4お名前.comのレンタルサーバーからVPSへ移行したときの記録になります。

広告

an upstream response is buffered to a temporary file

[warn] 127#127: *2119 an upstream response is buffered to a temporary file /var/cache/nginx/proxy_temp/7/03/0000000037 while reading upstream, client:***.***.***.***, server: kikuichigevps.com, request: "GET /cdn.js HTTP/2.0", upstream: "http://***.***.***.***:80/cdn.js", host: "kikuichigevps.com"

参考:Nginxの設定 – ソフトウェアエンジニアリング – Torutk
Nginxの「proxy_buffer_size」のエラーログ対策・設定方法まとめ(upstream response is buffered to a temporary file) (doudonn.com)

送られてきたリクエストが大きくてバッファに入りきらないので一時的に
多分/var/cache/nginx/proxy_temp/7/03/0000000037に入れたっていうことだろう。
スピードが遅くなるだけで問題となるものではなさそう。
設定値が、どこに書いてあるか見つからないし、変えたことによる影響も見えないので
このまま放置にした。
そもそも、なぞのclientから必要のない大きいリクエストを、
受信した時点で何とかしたい。他の設定をしていく中で自然と消えることを願う。
目次へ

[error] 126#126: *210 access forbidden by rule, client: GatewayのIP, server: kikuichigevps.com, request: “POST /wp-cron.php?doing_wp_cron=1712025848.6137320995330810546875 HTTP/1.1”, host: “kikuichigevps.com”

調査材料

そもそも、これは何のログかというとwaf-nginxのログに出ている。
client: 172.*.*.*が何かといえば以下で調べるとネットワークのGATEWAYになっている。
sudo docker inspect shared
[
{
“Name”: “shared”,

“IPAM”: {
“Driver”: “default”,
“Options”: {},
“Config”: [
{
“Subnet”: “172.*.*.*/16”,
“Gateway”: “172.*.*.*”
}

  1. WP-Cron の動作方法
    • クライアントがサイトにアクセスすると、WP-Cron は現在時刻と予約されたタスクの実行時刻を比較します。
    • 指定された時間を過ぎていれば、タスクを実行します。
  2. 注意点
    • WP-Cron は、OS の cron とは異なります。Web アクセスに依存しているため、アクセス数の少ないサイトでは実行にタイムラグが生じることがあります。
    • サーバー側で用意された cron が利用できない場合や、特定のタスクを定期的に実行したい場合に WP-Cron を活用します。

/wp-cron.php?doing_wp_cron=1712025848.6137320995330810546875? 以降は、WordPress の cron 機能に関する情報です。具体的には、以下の情報を表します。

  • doing_wp_cron: cron ジョブの実行中であることを示します。
  • 1712025848.6137320995330810546875: cron ジョブの開始時刻を表すタイムスタンプです。

この情報は、WordPress が cron ジョブを管理するために使用されます。

詳細

WordPress は、定期的に実行する必要があるタスクをスケジュールするために cron 機能を使用します。これらのタスクには、例えば、データベースのバックアップや投稿の公開などがあります。

cron ジョブは、wp-cron.php というファイルによって実行されます。このファイルは、WordPress のインストールフォルダにあります。

? 以降のパラメータは、wp-cron.php に渡される情報です。これらの情報は、WordPress が実行する cron ジョブを特定するために使用されます。

タイムスタンプ

タイムスタンプは、10進数の Unix 時間を表します。これは、1970 年 1 月 1 日 00:00:00 UTC から経過した秒数を表します。

例えば、以下の URL は、2023 年 3 月 8 日 12:34:56 JST に開始された cron ジョブを表します。

/wp-cron.php?doing_wp_cron=1646722496.6137320995330810546875

参考資料

  • WordPress の cron 機能に関する公式ドキュメント: URL WordPress cron 機能 公式ドキュメント
  • wp-cron.php ファイルに関する解説記事: URL wp-cron.php ファイル 解説記事

止める方法WordPressのwp-cron.phpを停止するときの注意 | お役立ち記事 | 大阪のWeb制作会社 ナンクマ (nankuma.jp)

分かったこと

WordPressが自分でPOST /wp-cron.php?doing_wp_cron=~(~はタイムスタンプ)を実行している。
実効タイミング:
クライアントがサイトにアクセスすると、WP-Cron は現在時刻と予約されたタスクの実行時刻(~タイムスタンプ)を過ぎていれば実行する。
何のためかというとサーバーのCronのように指定された時刻に処理を実行するCron機能がないから、
苦肉の策としてクライアントのアクセスのタイミングを利用している。
ただ、(~タイムスタンプ)の設定の仕組みは未調査。次は何分後だとか設定してるのかも。
私の環境だとWordPressのコンテナがPOST /wp-cron.php?doing_wp_cron=~をhttps://kikuichigevpsにPOSTしているので、
この場合クライアントになりえるのは、VPSのIPとか考えられるが
実際はNginxのGATEWAYのIPになっているっぽい。
目次へ

対策

対策として、この機能自体を止めてホストのCronで定期的にPOST /wp-cron.phpを実行するみたい。
?doing_wp_cron=~は別にいらなそう。
POSTなのでbodyに何か必要かもしれないがエラー回避には、なくてもよかった。
これでwp-cron.phpを実行する本来の目的が達成されているかは、分からない。

wp-cronを停止する
参考:WordPress の wp-cron.php を無効にする | Web Design Leaves
私の環境の場合
htmlディレクトリはバインドマウントしてあるのでSSH接続しているVsコードで直接見れます。
しかし、wp-config.phpはrootユーザで編集しても変更できません。
そこでwp-config.phpを
ターミナルで今、コマンドを実行しているディレクトリにコピーして以下追加。
define( 'DB_COLLATE', getenv_docker('WORDPRESS_DB_COLLATE', '') );
/** wp-cron停止 **/
define('DISABLE_WP_CRON', 'true');←追加

WordPressのコンテナにコピー
sudo docker cp wp-config.php コンテナ名:/var/www/html/wp-config.php
設定を反映
sudo docker restart コンテナ名
ホスト(お名前.comのVPS)のCronで30分毎にwp-cron.phpを実行

設定方法はターミナルで
crontab -e
1. /bin/nano        <---- easiest
*/5 * * * * curl -X POST https://kikuichigevps.com/wp-cron.php
をコピーして右クリックするだけで貼りついた。
CTRL+O
Enter
CTRL+X
nanoの使い方は、参考:https://minoru.okinawa/archives/2247

wafで引っかからないようにwafの入ってるNginxのconfig修正
    location /wp-cron.php {
        allow ホストのIP;
        deny all;

実効ログ
VPSのホストのIP - - [02/Apr/2024:14:30:02 +0900] "POST /wp-cron.php HTTP/2.0" 200 0 "-" "curl/7.68.0" "-"
取り合えず動いている。
wp-cron.phpが何をやっているかは、よくわかりませんがエラーはなくなった。
目次へ

functions.phpを「ファイル更新」したら致命的なエラーをチェックするためにサイトと通信できないため、PHP の変更は取り消されました。SFTP を使うなど、他の手段で PHP ファイルの変更をアップロードする必要があります。

原因はWordPressから自分自身に対してGetする通信がWAFではじかれてる。
ログ
GatewayのIP - - [03/Apr/2024:08:46:35 +0900] "GET /wp-admin/theme-editor.php?theme=cocoon-child-master&file=functions.php&wp_scrape_key=32略95&wp_scrape_nonce=36略4 HTTP/1.1" 403 21
{"transaction":{"client_ip":"GatewayのIP","time_stamp":"Wed Apr 3 08:46:35 2024","server_id":"40略80e","client_port":*****,"host_ip":"WordPressのコンテナのIP","host_port":443,"unique_id":"171210159564.530244","request":{"method":"GET","http_version":1.1,"uri":"/wp-admin/theme-editor.php?theme=cocoon-child-master&file=functions.php&wp_scrape_key=~
自分のパソコンのIP - - [03/Apr/2024:08:46:35 +0900] "POST /wp-admin/admin-ajax.php HTTP/2.0" 200 554
対策はWordPressのphp編集のときだけ手動でGatewayのIPを許可するように
Nginxのconfを修正
location /wp-admin {
        allow GatewayのIP;
結果、phpのファイル更新できた。
ログ
GatewayのIP - - [03/Apr/2024:08:52:14 +0900] "GET /wp-admin/theme-editor.php?theme=cocoon-child-master&file=functions.php&wp_scrape_key=369略b4d&wp_scrape_nonce=1略0 HTTP/1.1" 200 146246
GatewayのIP - - [03/Apr/2024:08:52:15 +0900] "GET /?wp_scrape_key=36947ce5cb97e57dc0ec2008543b7b4d&wp_scrape_nonce=1362168440 HTTP/1.1" 200 289464
自分のパソコンのIP - - [03/Apr/2024:08:52:15 +0900] "POST /wp-admin/admin-ajax.php HTTP/2.0" 200 128
目次へ

所感

WordPressが自分自身にGETやPOSTするときにWAFでひっかる件は他にもありそう。
イチゲをOFUSEで応援する(御質問でもOKです)Vプリカでのお支払いがおすすめです。
MENTAやってます(ichige)
目次へ

コメント

タイトルとURLをコピーしました