Ошибка "Permission denied" при обновлении WordPress?
У меня установлен 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.

Мне нужно определить, под каким пользователем процесс обновления 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 бесполезен для вас, если владелец — root
. apache
не является ни пользователем root
, ни членом группы root
(предполагаю, что в вашей системе это так).
В результате apache
попадет в категорию other
, а другие группы имеют только доступ на чтение.
Однако, если бы файл принадлежал другому пользователю, который входит в ту же группу, что и apache
, или если бы он принадлежал самому apache
, тогда 664
мог бы работать, так как применялись бы права владельца или группы.
А что насчет 775?
То же самое, но вы сделали файлы исполняемыми.
Таким образом, здесь нет специфического для WordPress решения вашей проблемы, которая заключается в том, что папки не доступны для записи PHP-скриптами.
Кстати, вам следует сделать все файлы ядра WordPress доступными только для чтения пользователю PHP, чтобы вредоносное ПО не могло их изменить, а затем использовать внешний инструмент для обновления WordPress, например WP CLI через cron или систему контроля версий, такую как git
.
В любом случае, ваша проблема и ее решение связаны с владением и правами доступа к файлам/папкам. Возможно, ваш пользователь apache не входит в нужную группу. Может быть, он не владеет файлами? Только вы можете это определить.

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

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