Не удается установить новые плагины из-за ошибки "Could not create directory"

24 сент. 2010 г., 22:19:12
Просмотры: 38.5K
Голосов: 7

Преподаватель испытывает трудности с учебной установкой WordPress. Решение проблем с правами доступа происходит хаотично и стало постоянной головной болью, поэтому я задам вопрос здесь. Что можно сделать, чтобы WordPress просто работал? Вот типичные ошибки, которые они получают:

Установка плагина: Lightbox 2 2.9.2 Скачивание пакета установки с http://downloads.wordpress.org/plugin/lightbox-2.2.9.2.zip… Распаковка пакета… Не удалось создать директорию. /home/CIM140/public_html/wordpress/wp-content/upgrade/lightbox-2.tmp

Когда я выполняю su как www-data (пользователь, под которым работает Apache в Ubuntu), я могу без проблем создать эту директорию. Моя тестовая установка WordPress устанавливает этот плагин без проблем, поэтому я не понимаю, почему это не работает для них.

0
Все ответы на вопрос 6
6

@pwnguin,

У меня были такие же проблемы с mod_php в WordPress, и я наконец разобрался.

# chown www-data:www-data  /home/CIM140/public_html/wordpress/ -R

Пока вы контролируете сервер, это не вызовет проблем с безопасностью.


РЕДАКТИРОВАНО:

Возможно, вам также потребуется изменить umask на 022, чтобы новые директории, создаваемые WordPress, имели права 755, а файлы — 644.

Другой вариант — переопределить стандартные права файлов в wp-config.php:

define('FS_CHMOD_DIR', (0755 & ~ umask()));
define('FS_CHMOD_FILE', (0644 & ~ umask()));

Также можно принудительно задать метод файловой системы для обновлений.

  • (Основной выбор) "Direct" — принудительно использует прямой файловый ввод-вывод из PHP, что может создать проблемы безопасности на плохо настроенных хостах. Выбирается автоматически, если это возможно.
  • (Второй выбор) "ssh" — принудительно использует SSH-расширение PHP.
  • (Третий выбор) "ftpext" — принудительно использует FTP-расширение PHP для доступа по FTP.
  • (Четвёртый выбор) "ftpsockets" — использует класс PHP Sockets для FTP-доступа.

Эти методы можно определить в wp-config.php с помощью: define('FS_METHOD', 'ftpext');

Все текущие определённые константы можно получить, выполнив команду print_r(@get_defined_constants()); в PHP.

24 сент. 2010 г. 22:35:44
Комментарии

Уже сделал это =(

jldugger jldugger
24 сент. 2010 г. 22:39:50

пример: drwxrwsr-x 6 www-data www-data 4096 2010-09-22 23:15 wp-content

jldugger jldugger
24 сент. 2010 г. 22:40:53

Попробуй изменить их на drwxr-xr-x 7 www-data www-data 4096 Sep 24 09:38 wp-content

Chris_O Chris_O
24 сент. 2010 г. 23:01:13

Также я никогда не использовал атрибут SGID для директории, например: chmod g+s. Я не думаю, что это необходимо. Поправьте меня, если я ошибаюсь.

Chris_O Chris_O
24 сент. 2010 г. 23:13:02

Ах, после связи с преподавателем, оказалось, что по умолчанию используется SSH, в то время как мой тестовый экземпляр использует прямой ввод-вывод (direct IO). Так что проблема в том, что у его пользователя нет прав на создание директории.

jldugger jldugger
25 сент. 2010 г. 01:17:48

Действительно, принудительная установка FSMETHOD в direct решила непосредственную проблему. Теперь я займусь поиском альтернатив, но пока что проблема решена. Невероятно сложно было отследить!

jldugger jldugger
25 сент. 2010 г. 01:35:34
Показать остальные 1 комментариев
0

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

По сути, вы знаете, что Apache работает от пользователя www-data. Именно поэтому установка владельца всех файлов этим пользователем работает - WordPress проверяет, что может создавать файлы от имени пользователя, которому принадлежат его собственные файлы. Таким образом, вы делаете так, чтобы всем владел пользователь, которому принадлежат файлы.

Если у вас есть полный и тотальный контроль над машиной, это нормально. С другой стороны, если это shared-хостинг, то вы создали брешь в безопасности.

Обычно веб-серверы работают от какого-то пользователя (например, www-data), который затем выполняет код других пользователей (например, "otto", мой пользовательский аккаунт). В такой ситуации веб-сервер не сможет создавать файлы от имени "otto" и, следовательно, не сможет корректно создавать файлы как мой аккаунт. Таким образом, проверка WordPress на возможность создания правильно принадлежащих файлов и, следовательно, установки плагинов или обновления файлов будет проваливаться, и это правильно, потому что если бы мои файлы принадлежали общему пользователю веб-сервера, это было бы риском для безопасности.

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

Сейчас вы пытаетесь решить эту проблему, изменяя владельца всех файлов WordPress на тот же аккаунт, от которого веб-сервер записывает файлы. Более нормальный подход для этого - изменить способ, которым веб-сервер записывает файлы, чтобы позволить PHP-процессу "принадлежать" пользовательскому аккаунту, от которого он выполняет файлы.

Общее решение для этого - "suphp". Эта версия PHP устанавливает пользователя, от которого работает PHP-процесс, таким же, как владелец PHP-файлов, которые он выполняет. Это безопаснее в настройках shared-хостинга, потому что гарантирует, что PHP-процесс, запущенный общим веб-сервером, работает от владельца PHP-файлов и, следовательно, не может читать аккаунты других пользователей и тому подобное.

В Ubuntu, я считаю, это общий способ сделать это:

Установить suphp:

$ sudo apt-get install libapache2-mod-suphp

Отключить старый mod_php

$ sudo a2dismod php5 

Перезапустить Apache

$ sudo /etc/init.d/apache2 restart

И вуаля. Теперь ваши файлы WordPress PHP должны принадлежать их обычному владельцу. Никаких специальных трюков, изменения прав или владения и тому подобного. Поскольку PHP-процесс будет работать от владельца этих файлов, он сможет записывать в них как этот владелец. Директории должны иметь права 755, файлы - 644 (заметьте, suphp не любит, когда файлы доступны для записи группой, поэтому 755/644 - правильный набор прав).

17 апр. 2016 г. 12:31:35
0
-1

Для меня (на Ubuntu) пришлось добавить umask 002 в файл /etc/apache2/envvars, чтобы WordPress загружал плагины/изображения с правами 775 вместо 755 (т.е. разрешить всем, кроме Apache и root, изменять загруженные файлы)

27 сент. 2013 г. 01:32:39
5
-1

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

Вы можете исправить это с помощью следующих команд из командной строки (предполагается, что вы находитесь в корневой папке WordPress):

# cd wp-content
# chmod -R a+w plugins
# chmod -R a+w themes
# chmod -R a+w upgrade

Самое безопасное решение — добавить Apache в ту же группу, что и владелец установки WordPress, и изменить все групповые разрешения на доступные для записи.

17 апр. 2016 г. 10:03:28
Комментарии
  1. Если есть более подробное решение, добавьте его здесь, вместо того чтобы ссылаться на него. 2. нет, веб-сервер ни в коем случае не должен иметь возможность напрямую записывать в директории с кодом, если только вам не нравится быть взломанным.
Mark Kaplun Mark Kaplun
17 апр. 2016 г. 10:14:30

@MarkKaplun но тогда обновления расширений не работают, что большинство пользователей WP считает "нормальным" способом работы сайта. Слишком категоричное утверждение. Возможность сервера записывать в wp-content относительно хуже для безопасности, но само по себе это не является огромной проблемой.

Rarst Rarst
18 апр. 2016 г. 09:36:12

@MarkKaplun: Даже принятый ответ по сути говорит то же самое - единственное отличие в том, что он специфичен для Apache, а мой ответ универсален.

Varun Varun
23 июн. 2016 г. 07:31:14
  1. Если ваш ответ одинаковый, в чем смысл его существования? 2. Кто сказал, что принятый ответ отличный?
Mark Kaplun Mark Kaplun
23 июн. 2016 г. 08:54:52

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

Mark Kaplun Mark Kaplun
23 июн. 2016 г. 09:03:00
0
-1

Иногда на сайтах бывает, что исправление прав доступа к директориям и файлам не решает проблему. В таких случаях я обнаруживал, что на одной или нескольких директориях установлен неизменяемый флаг (immutable flag). Это легко исправить, выполнив команду chattr -R /var/www/sub.domain.tld от имени root.

28 нояб. 2019 г. 17:08:49
1
-1

Очень простое решение: измените разрешения для папки opt, выполнив команду sudo chmod -R 777 /opt.

7 янв. 2021 г. 07:32:29
Комментарии

Пожалуйста, [отредактируйте] ваш ответ и добавьте объяснение: почему это может решить проблему? Почему вы считаете, что это хорошее решение – разрешить всем читать, записывать и выполнять файлы в этих директориях?

fuxia fuxia
8 янв. 2021 г. 02:04:01