Ошибка "Permission denied" при обновлении WordPress?

1 апр. 2020 г., 23:51:03
Просмотры: 14.9K
Голосов: 0

У меня установлен WordPress, который отказывается автоматически обновляться через стандартную кнопку обновления в админке. Получаю следующую ошибку:

"Распаковка обновления… Обновление не может быть установлено, потому что мы не сможем скопировать некоторые файлы. Обычно это связано с несовместимыми правами доступа к файлам: wp-admin/includes/update-core.php….. Ошибка установки"

Warning: copy(/var/www/html/wp-admin/includes/update-core.php): failed to open stream: Permission denied in /var/www/html/wp-admin/includes/class-wp-filesystem-direct.php on line 281

Информация о сайте:

  • Работает на Google Cloud Compute Engine
  • Настроены соответствующие публичные ключи и правила firewall для доступа к БД, ssh2 и т.д. с локального компьютера
  • Сайт работает на Apache, PHP 7.3, MariaDB в системе Centos 7
  • Все функции, кроме обновления, работают нормально. Это включает обычные страницы, записи и обновления плагинов
  • Все права доступа к файлам установлены в 664, к папкам - 775, как рекомендует WordPress
  • В файле wp-config есть строка "define('FS_METHOD','direct');"
  • Пользователь WordPress - "apache"
  • Пользователь FTP - "ftpusername"
  • ftpusername входит в группу ftpusername, как и apache
  • Все файлы и папки принадлежат пользователю apache
  • Все файлы и папки принадлежат группе "apache"

Доступ к сайту осуществляется через SFTP Filezilla с пользователем "ftpusername" и приватным ключом. SSH доступ через MobaXterm с тем же пользователем и ключом.

Мне нужно определить, под каким пользователем работает процесс обновления WordPress, так как это не тот пользователь, который выполняет все остальные операции со страницами и записями, хотя все файлы и папки принадлежат apache.

3
Комментарии

Ваш вопрос заключается в том, под каким пользователем работает PHP-процесс на вашем сервере? Это вопрос, который вы могли бы задать на StackOverflow, без необходимости упоминания или знания WordPress. Настройки прав доступа к файлам сильно зависят от сервера, рекомендуемые значения могут не подойти вам, а значения, которые работают у вас, могут сломать настройки других людей.

Tom J Nowell Tom J Nowell
2 апр. 2020 г. 00:04:15

Я спрашиваю не только про PHP, я знаю этого пользователя. Я спрашиваю, почему WordPress не может выполнить обновление. Последний абзац в моем вопросе — это настоящая неизвестность...

Rick9004 Rick9004
3 апр. 2020 г. 14:23:09

WordPress не знает, под каким пользователем он работает, и не проверяет это. Единственное, что его волнует — может ли он записать файл, а в вашем случае не может. Если прямая запись невозможна, он попытается использовать FTP и запросит у пользователя учетные данные.

Tom J Nowell Tom J Nowell
3 апр. 2020 г. 14:44:41
Все ответы на вопрос 1
2

Мне нужно определить, под каким пользователем процесс обновления WordPress считает себя запущенным, так как это не тот пользователь, под которым выполняются все остальные страницы и посты, поскольку у меня все файлы и папки принадлежат apache.

Процесс обновления WordPress не имеет представления о том, под каким пользователем он запущен, и ему это безразлично. Он даже не проверяет пользователя, да и зачем ему это. Владелец файла и пользователь, под которым работает процесс PHP, могут намеренно отличаться. Если это неверный пользователь, WordPress об этом не узнает и ничего не сможет сделать.

Весь код, выполняемый PHP-FPM, будет работать под одним и тем же пользователем, независимо от того, WordPress это или простой файл info.php, который вы поместили в корень веб-сайта.

Вот ваша проблема:

Warning: copy(/var/www/html/wp-admin/includes/update-core.php): failed to open stream: Permission denied in /var/www/html/wp-admin/includes/class-wp-filesystem-direct.php on line 281

Код, выполняемый из PHP-файлов, не имеет прав на изменение этого файла. Это предупреждение PHP исходит от самого PHP, а не от WordPress.

Вам необходимо:

  • убедиться, что файл доступен для записи/удаления пользователем процесса PHP
  • убедиться, что папка доступна для записи/удаления пользователем процесса PHP. Даже если права на файл в порядке, это не значит, что права на папку тоже хорошие
  • что владение этой папкой правильно, как для владельца, так и для группы. Даже если права на файл и папку в порядке, это не значит, что они применяются к пользователю процесса PHP.

Это не так просто, как установить правильный номер разрешения с помощью chmod. Владение имеет огромное значение.

Например, 664:

разрешения 664

664 бесполезен для вас, если владелец — root. apache не является ни пользователем root, ни членом группы root (предполагаю, что в вашей системе это так).

В результате apache попадет в категорию other, а другие группы имеют только доступ на чтение.

Однако, если бы файл принадлежал другому пользователю, который входит в ту же группу, что и apache, или если бы он принадлежал самому apache, тогда 664 мог бы работать, так как применялись бы права владельца или группы.

А что насчет 775?

разрешения 775

То же самое, но вы сделали файлы исполняемыми.

Таким образом, здесь нет специфического для WordPress решения вашей проблемы, которая заключается в том, что папки не доступны для записи PHP-скриптами.


Кстати, вам следует сделать все файлы ядра WordPress доступными только для чтения пользователю PHP, чтобы вредоносное ПО не могло их изменить, а затем использовать внешний инструмент для обновления WordPress, например WP CLI через cron или систему контроля версий, такую как git.

В любом случае, ваша проблема и ее решение связаны с владением и правами доступа к файлам/папкам. Возможно, ваш пользователь apache не входит в нужную группу. Может быть, он не владеет файлами? Только вы можете это определить.

3 апр. 2020 г. 14:58:32
Комментарии

Спасибо... Для тестирования я установил права 777 на все файлы и папки на сайте. Я убедился, что все пользователи Apache и PHP находятся в общей группе. Кстати, это тестовый сайт. Та же ошибка продолжает возникать. Мне бы хотелось узнать, в какой именно файл или папку WordPress пытается записать, но я не могу это определить. WordPress не выдает никакой дополнительной информации об ошибке, кроме сообщения, которое я уже задокументировал.

Rick9004 Rick9004
9 апр. 2020 г. 18:39:26

В сообщении об ошибке указан файл: /var/www/html/wp-admin/includes/update-core.php. Установка прав 777 опасна, так как это означает, что любой пользователь может записать в этот файл, независимо от того, кто он, и любой может его выполнить. Например, загруженные JPEG-файлы могут быть исполнены. Кроме того, это не WordPress выводит ошибку, а PHP. Та же ошибка возникла бы, если бы Drupal или Joomla попытались записать в этот файл. Как я уже говорил в своем ответе, дело не в том, чтобы угадать правильные три числа. Скорее всего, проблема в правах владения и группах, а вы не предоставили никакой информации о том, в каких группах находятся файлы и пользователь.

Tom J Nowell Tom J Nowell
9 апр. 2020 г. 20:31:55