soybeans59
Forum Replies Created
-
AuthorPosts
-
フィードバックをヒントにソースコードを追いかけ、本来なら特定の条件の時にのみ advanced-cache.php ファイルが作成されることを確認しました。
私のケースではHyperDBを利用しているため page-cache.php ファイル内の下記コードの $cache_db->dbname がNULLになり、その結果、advanced-cache.php ファイルがユーザーがサイトにアクセスする度に作成されていました。
$sql = “SHOW TABLES FROM
{$cache_db->dbname}
LIKE ‘{$cache_db->prefix}site_cache'”;そこで、強制的にdbname=’wordpress’ にすることで毎回作成されないようにしました(念の為、ファイルロックは入れておくことにしました)。貴重なインプットありがとうございました!
Kusanagiご担当者様
WP KUSANAGI 1.3.3にバージョンアップ後も、advanced-cache.php でシンタックスエラーとなる事象を確認致しました。
advanced-cache.php の具体的なシンタックスエラーは以下の部分となります。
###PHPコード###
略
new SiteManagerAdvancedCache();
ここから
foreach ( $this->device_regexes as $group => $regex ) {
if ( preg_match( $regex, $_SERVER[‘HTTP_USER_AGENT’] ) ) {
return $group;
}
}
return false;
}
}
new SiteManagerAdvancedCache();
ここまで
###PHPコード###new SiteManagerAdvancedCache(); を宣言している下の部分に上記のコード(”ここから”から”ここまで”とかいた部分)が紛れ込むというものです。
以下、調査結果です。
advanced-cache.php は kusanagi-core フォルダ内の advanced_cache_tpl フォルダ内の advanced-cache.tpl をベースに作成されていることを確認致しました。また、最終的な advanced-cache.php を生成するには page-cache.php で advanced-cache.tpl をベースとして文字列の置換処理が行われていることを確認致しました。
トラブル改善に向けての最初の対応は、置換処理中に上記の構文エラーを引き起こす原因が紛れていると調査を進めていたのですが、もろもろ考慮した結果、文字列の置換処理が今回のエラーに直結している可能性は低いと判断致しました(置換処理が上記の構文エラーを引き起こすような処理になっていないはず?)。そこで、最終的に生成したプログラムを advanced-cache.php に書き込む部分に問題があるのではという結論に至りました。
【対処】
page-cache.php で advanced-cache.php に書き込み処理をしている部分に対して LOCK_EX オプションを追加致しました。実装は以下の通りです(ログを取得するようにカスタマイズ済)。// 出力先ファイルに書き込み(排他ロックを適用)
$result = @file_put_contents($advanced_cache_file, $advanced_cache_data, LOCK_EX);
if ($result === false) {
error_log(“[ERROR] 同時アクセスが発生しました: ” . $advanced_cache_data);
} else {
error_log(“[INFO] ファイルの書き込みに成功しました: “);
}結果、bcacheを有効にした日には必ず1度以上は起こっていたシンタックスエラーのトラブルが、現在5日連続で発生していない状況です。
上記内容を踏まえ、
・LOCK_EXを入れることは適切なのか
・または別の問題なのか
・LOCK_EXを入れることはページ表示速度に影響はないかなど(1つのファイルをロックするので表示速度に影響がある可能性有)以上、アドバイスをいただけると助かります。
上記の件について、現在リリース済みの環境で不具合の原因と思われる箇所にデバッグ機能を入れて動作確認を行なっております。結果が見えてきましたら改めてご報告させていただきます。
>>上記ファイル更新後、現象が再発するようであれば、ご連絡お願いします。
アップデート後も再現することを確認済でございます。Kusanagi Runs on Docker(1.6.5) スクリプト内で不具合を見つけたので報告致します。fcache 関連のコマンド(on, off, status)を実行する際に以下のエラーがでます(内部的にはfcacheは有効になっているようです)。
$ kusanagi-docker config fcache status
grep: $TARGETDIR/.kusanagi.httpd: No such file or directory
/home/ubuntu/.kusanagi/lib/config.sh: line 61: [: : integer expression expected
INFO: fcache is off
INFO: Done.下記のファイルの k_fcache 関数の修正が必要のようです。
lib/config.sh b/lib/config.sh
修正前: local _t=”$(grep NO_USE_FCACHE= ‘$TARGETDIR/.kusanagi.httpd’)”
修正後: local _t=”$(grep NO_USE_FCACHE= “$TARGETDIR/.kusanagi.httpd”)”AWS EC2 UbuntuOS、MacBook いずれの環境でも同様のエラーが見受けられますので共通のエラーかと思われます。
ご確認よろしくお願いいたします。
環境情報を共有致します。
`
$ docker version
Client: Docker Engine – Community
Version: 24.0.2
API version: 1.43
Go version: go1.20.4
Git commit: cb74dfc
Built: Thu May 25 21:51:00 2023
OS/Arch: linux/amd64
Context: defaultServer: Docker Engine – Community
Engine:
Version: 24.0.2
API version: 1.43 (minimum version 1.12)
Go version: go1.20.4
Git commit: 659604f
Built: Thu May 25 21:51:00 2023
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.6.21
GitCommit: 3dce8eb055cbb6872793272b4f20ed16117344f8
runc:
Version: 1.1.7
GitCommit: v1.1.7-0-g860f061
docker-init:
Version: 0.19.0
GitCommit: de40ad0
`
`
$ docker-compose –version
docker-compose version 1.29.2, build unknown
`
`
primestrategy/kusanagi-ftpd 1.0.10-r0 cea5b6081e8f 11 months ago 424MB
primestrategy/kusanagi-httpd 2.4.58-r4 234f1ac4ff76 11 months ago 564MB
primestrategy/kusanagi-nginx 1.24.0-r15 2521b56e418c 11 months ago 522MB
primestrategy/kusanagi-nginx 1.25.3-r4 64e5db10e708 11 months ago 528MB
primestrategy/kusanagi-php 8.1.26-r0 ba20117101d1 11 months ago 671MB
primestrategy/kusanagi-php 8.1.25-r3 f64a5389cb1c 12 months ago 677MB
primestrategy/kusanagi-nginx 1.25.3-r3 f5979d3b4b00 12 months ago 528MB
primestrategy/kusanagi-ftpd 1.0.9-r2 2cd512df8772 12 months ago 427MB
primestrategy/kusanagi-php 7.4.33-r22 0a050e863e45 12 months ago 675MB
primestrategy/kusanagi-php 8.0.30-r5 dac722d1f988 12 months ago 673MB
primestrategy/kusanagi-php 8.0.30-r3 9db9dacd74a5 14 months ago 656MB
primestrategy/kusanagi-php 7.4.33-r20 4a7cd0a2a966 14 months ago 657MB
primestrategy/kusanagi-nginx 1.23.4-r14 3b7e7f3f3473 14 months ago 501MB
primestrategy/kusanagi-ftpd 1.0.9-r0 b9c89c0acb15 14 months ago 408MB
`
少々カスタマイズをしておりベースとしているイメージは以下になります。
primestrategy/kusanagi-nginx:1.25.3-r5
primestrategy/kusanagi-php:7.4.33-r22
wordpress:cli-2.9.0-php8.3
primestrategy/kusanagi-ftpd:1.0.10-r0
データベースは外部のリモートデータベースを利用中追加情報です。
下記のエラーログをPHPコンテナで確認しております。繰り返し以下のログが出ている状況です。上記のシンタックスエラーと関係はございますか?
[13-Nov-2024 01:49:01 UTC] WordPress database error Incorrect database name ” for query SHOW TABLES FROM
LIKE ‘wp_site_cache’ made by KUSANAGI_Page_Cache::create_cache_table
[13-Nov-2024 01:49:01 UTC] WordPress database error Table ‘wp_site_cache’ already exists for query
CREATE TABLEwp_site_cache
(
id
bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT,
hash
varchar(32) NOT NULL,
content
longtext NOT NULL,
device_url
text NOT NULL,
type
varchar(20) NOT NULL,
post_type
varchar(200) NOT NULL,
headers
text NOT NULL,
user_agent
text NOT NULL,
server
varchar(16) NOT NULL,
updating
tinyint(1) NOT NULL DEFAULT ‘0’,
create_time
datetime NOT NULL,
expire_time
datetime NOT NULL,
PRIMARY KEY (id
),
KEYhash
(hash
),
KEYexpire_time
(expire_time
),
KEYtype
(type
,post_type
),
KEYupdating
(updating
)
) DEFAULT CHARACTER SET utf8mb4 made by KUSANAGI_Page_Cache::create_cache_table
[13-Nov-2024 01:49:01 UTC] WordPress database error Incorrect database name ” for query SHOW TABLES FROMLIKE ‘wp_site_cache’ made by KUSANAGI_Page_Cache::create_cache_table
[13-Nov-2024 01:49:02 UTC] WordPress database error Table ‘wp_site_cache’ already exists for query
CREATE TABLEwp_site_cache
(
id
bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT,
hash
varchar(32) NOT NULL,
content
longtext NOT NULL,
device_url
text NOT NULL,
type
varchar(20) NOT NULL,
post_type
varchar(200) NOT NULL,
headers
text NOT NULL,
user_agent
text NOT NULL,
server
varchar(16) NOT NULL,
updating
tinyint(1) NOT NULL DEFAULT ‘0’,
create_time
datetime NOT NULL,
expire_time
datetime NOT NULL,
PRIMARY KEY (id
),
KEYhash
(hash
),
KEYexpire_time
(expire_time
),
KEYtype
(type
,post_type
),
KEYupdating
(updating
)
) DEFAULT CHARACTER SET utf8mb4 made by KUSANAGI_Page_Cache::create_cache_table- This reply was modified 1 month, 1 week ago by soybeans59.
- This reply was modified 1 month, 1 week ago by soybeans59.
追加の質問なのですが、advanced-cache.php というファイルは頻繁に書き換えが行われるファイルなのでしょうか?
もしその場合、どこで書き換え処理(ファイルの更新)が行われているのか教えていただけると助かります。satoru 様
ご連絡ありがとうございます。
KRoDがバージョンアップされていることを確認し、新しいバージョンのKusanagiプラグインを取得できました。新しいバージョンで検証させていただきます。
yosuke 様、ご連絡ありがとうございます。
提供情報が不足しており申し訳ございません。エラーログとKusanagiの情報などを共有いたします。
$ kusanagi-docker status Name Command State Ports --------------------------------------------------------------------------------------------------------------------------------------------------------------- wordpress_config docker-entrypoint.sh wp -- ... Restarting wordpress_ftp /bin/sh -c /docker-entrypo ... Up wordpress_httpd /docker-entrypoint.sh /usr ... Up (healthy) 0.0.0.0:80->80/tcp,:::80->80/tcp, 8080/tcp, 0.0.0.0:443->8443/tcp,:::443->8443/tcp, 8443/udp wordpress_php /usr/local/bin/docker-entr ... Up (healthy) INFO: Done. $ kusanagi-docker --version 1.6.2 INFO: Done.
nginxコンテナ
以下のような500エラーを吐いております。
{"log":"10.0.31.196 - - [07/Nov/2024:04:38:23 +0000] \"GET / HTTP/1.1\" 500
phpコンテナ
シンタックスエラーの情報です{"log":"[07-Nov-2024 04:38:30 UTC] PHP Parse error: syntax error, unexpected '}', expecting end of file in /home/kusanagi/wordpress/DocumentRoot/wp-content/advanced-cache.php on line 239\n","stream":"stderr","time":"2024-11-07T04:38:30.062941601Z"} {"log":"[07-Nov-2024 04:38:30 UTC] PHP Parse error: syntax error, unexpected '}', expecting end of file in /home/kusanagi/wordpress/DocumentRoot/wp-content/advanced-cache.php on line 239\n","stream":"stderr","time":"2024-11-07T04:38:30.269020456Z"} {"log":"[07-Nov-2024 04:38:31 UTC] PHP Parse error: syntax error, unexpected '}', expecting end of file in /home/kusanagi/wordpress/DocumentRoot/wp-content/advanced-cache.php on line 239\n","stream":"stderr","time":"2024-11-07T04:38:31.159448671Z"} {"log":"[07-Nov-2024 04:38:31 UTC] PHP Parse error: syntax error, unexpected '}', expecting end of file in /home/kusanagi/wordpress/DocumentRoot/wp-content/advanced-cache.php on line 239\n","stream":"stderr","time":"2024-11-07T04:38:31.516737511Z"} {"log":"[07-Nov-2024 04:38:34 UTC] PHP Parse error: syntax error, unexpected '}', expecting end of file in /home/kusanagi/wordpress/DocumentRoot/wp-content/advanced-cache.php on line 239\n","stream":"stderr","time":"2024-11-07T04:38:34.180800412Z"}
また、頻繁に advanced-cache.php ファイルの書き換えが行われていることも確認しております。
- This reply was modified 1 month, 1 week ago by soybeans59.
<?php if ( ! defined( 'ABSPATH' ) ) { exit; } if ( is_admin() ) { return; } class SiteManagerAdvancedCache { private $device_regexes = array( 'smart' => '/\(iPhone|\(iPod|Android .+ Mobile|IEMobile|Windows Phone|Android; Mobile; .+Firefox/', 'tablet' => '/\(iPad| Android |Android; Tablet; .+Firefox/', ); private $sites = array( ); private $allowed_query_keys; private $site_mode = false; private $theme_switcher_disabled = false; private $replace_class_file; function __construct() { global $table_prefix; $this->replace_class_file = WP_CONTENT_DIR . '/replace-class.php'; if ( ! isset( $_SERVER['REQUEST_URI'] ) || ! isset( $_SERVER['HTTP_USER_AGENT'] ) || ! isset( $_SERVER['REQUEST_METHOD'] ) || ! isset( $_SERVER['SCRIPT_NAME'] ) || ! isset( $_SERVER['SERVER_NAME'] ) ) { return; } if ( ! isset( $_SERVER['REQUEST_METHOD'] ) || $_SERVER['REQUEST_METHOD'] != 'GET' ) { return; } if ( defined( 'CACHE_EXCLUDE_IP' ) ) { $exclude_ips = explode( '|', CACHE_EXCLUDE_IP ); foreach ( $exclude_ips as $exclude_ip ) { if ( $_SERVER['REMOTE_ADDR'] == $exclude_ip || preg_match( '/' . preg_quote( $exclude_ip ) . '/', $_SERVER['REMOTE_ADDR'] ) ) { return; } } } if ( defined( 'CACHE_EXCLUDE_GET' ) && isset( $_GET[CACHE_EXCLUDE_GET] ) ) { return; } foreach ( array_keys( $_COOKIE ) as $key ) { if ( strpos( $key, 'wordpress_logged_in_' ) === 0 || strpos( $key, 'comment_author_' ) === 0 ) { return; } } $this->allowed_query_keys = array( 'm','p','posts','w','cat',略 ); switch ( $this->site_mode ) { case 'domain' : $add_prefix = isset( $this->sites[$_SERVER['SERVER_NAME']] ) && $this->sites[$_SERVER['SERVER_NAME']] != 1 ? $this->sites[$_SERVER['SERVER_NAME']] . '_' : ''; $site_id = isset( $this->sites[$_SERVER['SERVER_NAME']] ) ? $this->sites[$_SERVER['SERVER_NAME']] : ''; $table = $table_prefix . $add_prefix; $this->replace_class_file = WP_CONTENT_DIR . '/replace-class-' . $site_id . '.php'; break; case 'directory' : $key = '/'; if ( trim( $_SERVER['REQUEST_URI'], '/' ) ) { $dirs = explode( '/', trim( $_SERVER['REQUEST_URI'], '/' ), 2 ); $key .= array_shift( $dirs ) . '/'; unset( $dirs ); } $add_prefix = isset( $this->sites[$key] ) && $this->sites[$key] != 1 ? $this->sites[$key] . '_' : ''; $site_id = isset( $this->sites[$key] ) ? $this->sites[$key] : BLOG_ID_CURRENT_SITE; $table = $table_prefix . $add_prefix; $this->replace_class_file = WP_CONTENT_DIR . '/replace-class-' . $site_id . '.php'; break; default : $table = $table_prefix; $site_id = ''; } if ( $this->theme_switcher_disabled || ( ! $group = $this->get_device_group() ) ) { $group = ''; } if ( ( isset( $_SERVER['HTTPS'] ) && $_SERVER['HTTPS'] == 'on' ) || ( isset( $_SERVER['X-Forwarded-Proto'] ) && $_SERVER['X-Forwarded-Proto'] == 'https' ) ) { $protocol = 'https'; } else { $protocol = 'http'; } $requerst_query = ''; $request_uri = parse_url( $_SERVER['REQUEST_URI'] ); if ( isset( $request_uri['query'] ) ) { parse_str( $request_uri['query'], $requerst_query ); foreach ( $requerst_query as $key => $var ) { if ( ! in_array( $key, $this->allowed_query_keys ) ) { unset( $requerst_query[$key] ); } } ksort( $requerst_query ); $requerst_query = http_build_query( $requerst_query ); } if ( $requerst_query ) { $request_uri = $request_uri['path'] . '?' . $requerst_query; } else { $request_uri = $request_uri['path']; } $device_url = array( $group, $protocol, $_SERVER['SERVER_NAME'], $request_uri ); $device_url = implode( '|', $device_url ); $hash = md5( $device_url ); $now = date( 'Y-m-d H:i:s' ); $expire = date ( 'Y-m-d H:i:s', time() - 30 ); if ( defined( 'CACHE_DB_NAME' ) && defined( 'CACHE_DB_USER' ) && defined( 'CACHE_DB_PASSWORD' ) && defined( 'CACHE_DB_HOST' ) ) { $dbset = array( 'host' => CACHE_DB_HOST, 'user' => CACHE_DB_USER, 'pass' => CACHE_DB_PASSWORD, 'name' => CACHE_DB_NAME ); } else { $dbset = array( 'host' => DB_HOST, 'user' => DB_USER, 'pass' => DB_PASSWORD, 'name' => DB_NAME ); } $dbh = mysqli_connect( $dbset['host'], $dbset['user'], $dbset['pass'], $dbset['name'] ); if ( false === $dbh ) { return; } if ( function_exists( 'mysqli_set_charset' ) ) { mysqli_set_charset( $dbh, DB_CHARSET ); } else { $sql = 'set names ' . DB_CHARSET; mysqli_query( $dbh, $sql ); } mysqli_select_db( $dbh, $dbset['name'] ); $sql = " SELECT * FROM {$table}site_cache WHERE <code>hash</code> = '$hash' AND <code>expire_time</code> >= '$expire' "; $ret = mysqli_query( $dbh, $sql ); if ( $ret ) { while ( $row = mysqli_fetch_object( $ret ) ) { if ( $row->device_url == $device_url && ( strpos( $row->content, '<!-- page cached by KUSANAGI. ' ) !== false || strpos( $row->content, '<!-- page cached by WP SiteManager. ' ) !== false ) ) { if ( $row->expire_time < $now ) { if ( ! $row->updating ) { $sql = " UPDATE {$table}site_cache SET <code>updating</code> = 1 WHERE <code>hash</code> = '$hash' AND <code>type</code> = '{$row->type}' AND <code>expire_time</code> = '{$row->expire_time}' "; mysqli_query( $dbh, $sql ); break; } } $headers = unserialize( $row->headers ); if ( $headers ) { foreach ( $headers as $key => $header ) { header( $key . ': ' . $header ); } } if ( $row->updating ) { header( 'Cache-Control: no-cache' ); header( 'X-B-Cache: updating' ); } else { header( 'X-B-Cache: cache' ); } if ( file_exists( $this->replace_class_file ) ) { require_once( $this->replace_class_file ); $row->content = KUSANAGI_Replace::replace( $row->content ); } if ( 'rest_api' == $row->type ) { header( 'X-cache-ID: ' . $row->hash ); echo $row->content; } else { echo $row->content; echo "\n" .'<!-- CacheID : ' . $row->hash . ' -->'; } exit; } } } mysqli_close( $dbh ); } function get_device_group() { $path = preg_replace( '#^' . str_replace( '\\', '/', $_SERVER['DOCUMENT_ROOT'] ) . '#', '', str_replace( '\\', '/', ABSPATH ) ); if ( isset( $_GET['site-view'] ) ) { if ( strtolower( $_GET['site-view'] ) == 'pc' ) { setcookie( 'site-view', 'pc', 0, $path ); return false; } foreach ( $this->device_regexes as $group => $regex ) { if ( strtolower( $_GET['site-view'] ) == strtolower( $group ) ) { setcookie( 'site-view', $group, 0, $path ); return $group; } } } elseif ( isset( $_COOKIE['site-view'] ) ) { if ( strtolower( $_COOKIE['site-view'] ) == 'pc' ) { setcookie( 'site-view', 'pc', 0, $path ); return false; } foreach ( $this->device_regexes as $group => $regex ) { if ( strtolower( $_COOKIE['site-view'] ) == strtolower( $group ) ) { setcookie( 'site-view', $group, 0, $path ); return $group; } } } foreach ( $this->device_regexes as $group => $regex ) { if ( preg_match( $regex, $_SERVER['HTTP_USER_AGENT'] ) ) { return $group; } } return false; } } new SiteManagerAdvancedCache(); foreach ( $this->device_regexes as $group => $regex ) { if ( preg_match( $regex, $_SERVER['HTTP_USER_AGENT'] ) ) { return $group; } } return false; } } new SiteManagerAdvancedCache();
ご連絡ありがとうございます。
理由が分かり安心致しました。
次回の更新を待っております。ご連絡ありがとうございます。
>RoD では、SSL証明書の登録が可能です。
こちらの方法を検証したいと思います。また、外部データベースを用いたRoDの運用方針が固まって参りましたので、改めて御礼申し上げます。
いつも丁寧に迅速にサポート頂きまして、ありがとうございました。今後も利用させていただく際に気になったところはフィードバックさせていただこうと思いますのでよろしくお願いいたします。
ご返信ありがとうございます。
>docker-compose run config sh を実行し、/home/kusanaigi の該当ファイルを削除することで対処してください。
こちらの方法で運用したいと思います。返信が遅れ申し訳ありません。
>上記の件ですが、こちらで再現しません。疎通方法は、curl -v http://IPアドレス/ で200 OKを返していることを確認しています。
>すいませんが、どのような方法で疎通確認を行っているか、ご教授ください。
AWSのロードバランサーの下に接続するターゲットグループのプロトコルをHTTPにすることで接続ができることを確認いたしました。プロトコルがHTTPSだとKusanagi RoD に接続ができませんでした(こちらの原因と詳細は詰めれておりません)。RoDでも以下のURL先のようにSSL証明書の発行オプションの用意はないのでしょうか。
https://kusanagi.tokyo/document/commands/ssl/
>単純にALB配下にdocker host を追加したい場合は、上位の認識通りで、ディレクトリコピー、docker-compose up -d、kusanagi-docker config push を実行します。
ありがとうございます。こちらの方法で対応しようと思います。>また、AWSをお使いの場合、ECS/Fargate を用いてdocker-compose の内容をもとに、環境構築と運用をできるようです。ただし、こちらではこの方法は未検証です。
>docker-compose で ecs を使用する方法は、つい最近(2023/11)にEOLになったようです。
貴重な情報ありがとうございました。お世話になります。
返信が遅くなり申し訳ございません。>>MacOS Xの場合、OSにインストールているbashのバージョンが古いため、homebrewなどで最新のbashをインストールする必要があります。
以前返信をいただいておりましたこちらの件、確かにBashのバージョンを上げることで解決致しました。>>上記の件ですが、こちらで再現しません。疎通方法は、curl -v http://IPアドレス/ で200 OKを返していることを確認しています。
再度検証いたします。結果がまとまり次第ご連絡させていただきます。>>こちら、指定したデータベースに WordPressで使用するテーブル( wp_ で始まるテーブルすべて)が存在する場合に、WordPressのプロビジョンが失敗するために発生します。データベース内のテーブルを削除してから kusanagi-docker provison を実行してください。
wp_などで始まるテーブルが存在する既存の外部のデータベースにはプロビジョンでは接続できないという理解であっておりますか?
また、上記の仕様を踏まえますと、Kusanagi Runs on Dockerが動いているサーバーをスケールする(サーバーの台数を増やす(負荷分散))運用が生じる場合、プロビジョンではなく、contents フォルダなどのベースとなるコードセットがある前提でdocker-compose up -d
を実施後、kusanagi-docker config push
でコードのリリースという運用になるのでしょうか?
スケールを考慮したTipsなどがあれば教えていただけると助かります。 -
AuthorPosts