WordPress, PHP-FPM, Nginx purge и странные ошибки

12
M
На сайте с 14.01.2008
Offline
112
mrr
2197

Жили-были пара сайтов и все у них было хорошо.

Потом насатала пара переезжать на новый сервер.

Заодно обычный PHP 5.6 был заменен на 7-ю версию FastCGI (Nginx + PHP-FPM), добавлено кэширование fastcgi, пересобран nginx с модулем fastcgi_cache_purge и в вордпрессы добавлен плагин Nginx Helper.

Сайты стали работать быстрее и все было замечательно, пока не вышло обновление для одного из плагинов.

После успешного обновления сайты перестали открываться, выдавая различные странные ошибки. Логи ошибок внизу.

Все ошибки я для себя условно разделил на три типа:

1. когда прописан инклюд file.php, а в браузере идет попытка инклюдить file.pgp

2. ошибки в плагинах (даже тех, которые не обновлялись), один раз ошибка была в теме

3. ошибки в движке вордпресса

Каждый раз для устранения ошибок помогало либо накатывание бекапа файлов, либо перезаливка файлов движка вордпресса, либо удаление проблемных плагинов, либо полное восстановление из резервной копии.

Если только удалить плагины, в которых вдруг появлялась ошибка, то следующим шагом ошибки обязательно появлялись в движке worpdress.

В момент возникновения ошибки внутри файлов на указанных строках корректный код. Права доступа на файлы и папки верные.

Я сначала думал, что проблема в обновляемом плагине, но после успешного восстановления работы сайтов почти всегда удавалось успешно обновить плагин до новой версии, на которой был сбой и потом все работало замечательно до очередного обновления.

Также эти "странные" ошибки возникают, если попытаться добавить новый плагин.

Если не пытаться ничего обновлять и добавлять из новых плагинов - сайты работают замечательно и без проблем.

Но оставаться без обновлений вообще или каждый раз по несколько часов тратить на восстановление работоспособности тоже не дело...

Примеры ошибок:

Fatal error: require_once(): Failed opening required '/var/www/.../wp-includes/pomo/entry.pgp' (include_path='.:') in /var/www/.../wp-includes/pomo/translations.php on line 11


Fatal error: require(): Failed opening required '/var/www/.../wp-includes/functions.php.php' (include_path='.:') in /var/www/.../wp-settings.php on line 98

Fatal error: Uncaught LogicException: Passed array does not specify an existing static method (class 'ComposerAutoloaderInit8c8f8a97754b755b52ca9d931feaed91' does not have a method 'loadClassLoader') in /var/www/.../wp-content/plugins/wordpress-seo/vendor/composer/autoload_real_52.php:22 Stack trace: #0 /var/www/.../wp-content/plugins/wordpress-seo/vendor/composer/autoload_real_52.php(22): spl_autoload_register(Array, true) #1 /var/www/.../wp-content/plugins/wordpress-seo/vendor/autoload_52.php(7): ComposerAutoloaderInit8c8f8a97754b755b52ca9d931feaed91::getLoader() #2 /var/www/.../wp-content/plugins/wordpress-seo/wp-seo-main.php(56): require('/var/www/...') #3 /var/www/.../wp-content/plugins/wordpress-seo/wp-seo.php(45): require_once('/var/www/...') #4 /var/www/.../wp-settings.php(268): include_once('/var/www/...') #5 /var/www/.../data/www/k in /var/www/.../wp-content/plugins/wordpress-seo/vendor/composer/autoload_real_52.php on line 22

Warning: require_once(/var/www/.../wp-includes.widgets/class-wp-widget-media-image.php): failed to open stream: No such file or directory in /var/www/.../wp-includes/default-widgets.php on line 29

Fatal error: Uncaught Error: Call to undefined function did_action() in /var/www/.../wp-content/themes/sahifa/framework/admin/inc/tgm/class-tgm-plugin-activation.php:2101 Stack trace: #0 /var/www/.../wp-content/themes/sahifa/framework/admin/framework-admin.php(12): require_once() #1 /var/www/.../wp-content/themes/sahifa/functions.php(22): require_once('/var/www/...') #2 /var/www/.../wp-settings.php(426): include('/var/www/...') #3 /var/www/.../wp-config.php(99): require_once('/var/www/...') #4 /var/www/.../wp-load.php(37): require_once('/var/www/...') #5 /var/www/.../wp-admin/admin.php(31): require_once('/var/www/...') #6 /var/www/.../wp-admin/index.php(10): require_once('/var/www/...') #7 {main} thrown in /var/www/.../wp-content/themes/sahifa/framework/admin/inc/tgm/class-tgm-plugin-activation.php on line 2101

Fatal error: Uncaught Error: Call to undefined function did_action() in /var/www/.../wp-content/plugins/imagify/inc/classes/class-imagify-abstract-cron.php:96 Stack trace: #0 /var/www/.../wp-content/plugins/imagify/imagify.php(81): Imagify_Abstract_Cron->init() #1 /var/www/.../wp-includes/class-wp-hook.php(286): _imagify_init('') #2 /var/www/.../wp-includes/class-wp-hook.php(310): WP_Hook->apply_filters(NULL, Array) #3 /var/www/.../wp-includes/plugin.php(453): WP_Hook->do_action(Array) #4 /var/www/.../wp-settings.php(327): do_action('plugins_loaded') #5 /var/www/.../wp-config.php(99): require_once('/var/www/...') #6 /var/www/.../wp-load.php(37): require_once('/var/www/...') #7 /var/www/.../wp-blog-header.php(13): require_once('/var/www/...') #8 /var/www/.../data in /var/www/.../wp-content/plugins/imagify/inc/classes/class-imagify-abstract-cron.php on line 96

Fatal error: Uncaught Error: Call to undefined function get_template_dirdctory() in /var/www/.../wp-content/themes/sahifa/functions.php:14 Stack trace: #0 /var/www/.../wp-settings.php(426): include() #1 /var/www/.../wp-config.php(99): require_once('/var/www/...') #2 /var/www/.../wp-load.php(37): require_once('/var/www/...') #3 /var/www/.../wp-blog-header.php(13): require_once('/var/www/...') #4 /var/www/.../index.php(17): require('/var/www/...') #5 {main} thrown in /var/www/.../wp-content/themes/sahifa/functions.php on line 14
Евгений Крупченко
На сайте с 27.09.2003
Offline
178
#1

телепатически такие вопросы не решаются. надо иметь доступ к файлам.

в логах все же написано.

открываете /wp-includes/pomo и смотрите действительно ли там есть файл entry.pgp

подозреваю что это опечатка чья-то и должно быть на самом деле entry.php

тогда открываете wp-includes/pomo/translations.php on line 11 и правите

также wp-includes/functions.php.php вызывает сомнения. может просто functions.php есть файл?

тоже правите на правильный.

остальные ошибки (Call to undefined function...) скорей всего вытекают из предыдущей.

потом до и после обновления обращаете внимание на дату модификации этих проблемных файлов. чтоб понимать точно когда и после какого действия они изменялись.

ну и конечно никогда нельзя исключать что сайт на wp уже давненько не ваш сайт :)

и на нем полно "левых" файлов, левых зашифрованных php-вставок в случайных файлах.

надо только на месте смотреть...

M
На сайте с 14.01.2008
Offline
112
mrr
#2

Выше об этом писал, что в скриптах все ок, повторюсь.

EvGenius:
открываете /wp-includes/pomo и смотрите действительно ли там есть файл entry.pgp

В файле прописан entry.php, но когда возникает ошибка при вызове через браузер он становится *.pgp

EvGenius:
также wp-includes/functions.php.php вызывает сомнения. может просто functions.php есть файл?

Также в скрипте прописан верный вызов файла, который существует.

Т.е. ни entry.pgp, ни functions.php.php в момент возникновения ошибки в коде нет. В коде прописаны верные вызовы entry.php и functions.php

Евгений Крупченко
На сайте с 27.09.2003
Offline
178
#3

ну тогда чем еще помочь? :)

никто кроме вас не видит что там происходит. может быть что угодно.

M
На сайте с 14.01.2008
Offline
112
mrr
#4

Помочь тем, что подсказать в какую сторону копать.

С кодом все ок, получается проблема в nginx в части обработки кода? Такое вообще может быть, чтобы, например, в скрипте прописано куча инклюдов, он первые файлы инклюдит нормально, а у двадцатого файла вдруг меняет расширение?

Все что менял на сервере до возникновения проблемы описано в первом посте.

D
На сайте с 28.06.2008
Offline
1101
#5

По моему решение очевидно - убрать разные прослойки (плагины). Зачем они? Nginx прекрасно из коробки кеширует все что нужно. Грамотно настрокить кеширование и все.

Понаустанавливаете 100500 ненужных плагинов, а потом ищите что с чем не дружит.

У меня Nginx + PHP-FPM, но CSM Джумла (стандатрное кеширование джумлы все выключено - кеширует только Nginx) (php 7,2). Все работает идеально.

M
На сайте с 14.01.2008
Offline
112
mrr
#6
Dram:
По моему решение очевидно - убрать разные прослойки (плагины). Зачем они? Nginx прекрасно из коробки кеширует все что нужно. Грамотно настрокить кеширование и все.

Само кеширование настроено из коробки и работает идеально, согласен.

Вот только из вордпресса, на сколько мне известно, при обновлении записи нельзя делать сброс кеша из коробки.

Для этого я и поставил модуль fastcgi_cache_purge https://github.com/FRiCKLE/ngx_cache_purge в nginx, а в сам вордпресс плагин Nginx Helper.

Вы fastcgi_cache_purge предлагаете убрать?

Dram:
У меня Nginx + PHP-FPM, но CSM Джумла (стандатрное кеширование джумлы все выключено - кеширует только Nginx) (php 7,2). Все работает идеально.

Если не обновлять плагины и не добавлять новые плагины, то все тоже работает идеально.

Чтение, редактирование и добавление новых постов идет без проблем.

D
На сайте с 28.06.2008
Offline
1101
#7

Понятно, да вспомнил - мне мой кодер писал специальное решение, куда вводишь нужный урл и оно очищает его кеш. Но уже потом где-то в сети я видел и спец команду - как по ssh можно очистить не весь кеш а только нужную страницу, погуглите.

---------- Добавлено 02.06.2018 в 17:28 ----------

Вот нашел этот кусок кода у себя, все работает.

/**
* Функция очистки кеша Nginx
*
* CommentsHelperQuery::clearCache('http(s)://*');
*
* @param string $value
* @return
*/
function clearCache($value)
{
jimport('joomla.filesystem.file');

if(!empty($value))
{
$data = parse_url($value);
$filename = md5('GET|site.ru|'.$data['path']);

JFile::delete('/var/cache/nginx/papka-kesha-saita/'.substr($filename, -1).'/'.substr($filename, -3, 2).'/'.$filename);

return true;
}
return false;
}
}
M
На сайте с 14.01.2008
Offline
112
mrr
#8

Все-таки дело не в кеширование nginx похоже.

Когда отключаю для домена fastcgi_cache, перезапускаю nginx, опять пытаюсь установить\обновить плагины - получаю ошибки с подменой букв в путях:

Warning: require_once(/var/.../wp-contelt/plugins/wp-cerber/cerber-load.php): failed to open stream: No such file or directory in /var/.../wp-content/plugins/wp-cerber/wp-cerber.php on line 82

Fatal error: require_once(): Failed opening required '/var/.../wp-contelt/plugins/wp-cerber/cerber-load.php' (include_path='.:') in /var/.../wp-content/plugins/wp-cerber/wp-cerber.php on line 82

Fatal error: require_once(): Failed opening required '/var/.../wp-content/plugins/wp-mail-smtp/wp-mail-smtp.php����' (include_path='.:') in /var/.../wp-content/plugins/wp-mail-smtp/wp_mail_smtp.php on line 52

Warning: require(/var/.../wp-includes/class-wp-post.pfp): failed to open stream: No such file or directory in /var/.../wp-settings.php on line 170

Причем, что странно, в одной и той же ошибке пишет и не верную папку wp-contelt и верную wp-content при указании на место возникновения ошибки.

LEOnidUKG
На сайте с 25.11.2006
Offline
1722
#9

У вас походу где-то вирус прошился. Не бывает с воздуха замены php на pgp. Это не магия, это строгий код.

Не пробовали залить WP файлы все заново под ноль? т.е. версия точно держит PHP7? У вас последняя версия PHP7?

✅ Мой Телеграм канал по SEO, оптимизации сайтов и серверов: https://t.me/leonidukgLIVE ✅ Качественное и рабочее размещение SEO статей СНГ и Бурж: https://getmanylinks.ru/
M
На сайте с 14.01.2008
Offline
112
mrr
#10

Вряд ли вирус будет активничать только когда я решу плагины обновлять, а когда в админке добавляю\правлю - ничего не делать...

Пробовал заливать файлы вордпресса поверх из чистого дистибутива - раза два из десяти попыток помогло.

В основном использую восстановление из резервной копии - это хоть и дольше намного, зато восстанавливает работоспособность в половине случаев.

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий