Не удается установить новые плагины из-за ошибки "Could not create directory"
Преподаватель испытывает трудности с учебной установкой 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 устанавливает этот плагин без проблем, поэтому я не понимаю, почему это не работает для них.

@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.

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

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

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

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

Чтобы понять, почему у вас возникают эти проблемы, нужно разобраться в базовых концепциях владения файлами.
По сути, вы знаете, что 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 - правильный набор прав).

Вам необходимо предоставить права на запись соответствующим директориям. В идеале, следует делать это только для нужных файлов или папок, а затем вернуть обратно разрешения, чтобы не оставлять ваш сайт уязвимым.
Вы можете исправить это с помощью следующих команд из командной строки (предполагается, что вы находитесь в корневой папке WordPress):
# cd wp-content
# chmod -R a+w plugins
# chmod -R a+w themes
# chmod -R a+w upgrade
Самое безопасное решение — добавить Apache в ту же группу, что и владелец установки WordPress, и изменить все групповые разрешения на доступные для записи.

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

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

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

- Если ваш ответ одинаковый, в чем смысл его существования? 2. Кто сказал, что принятый ответ отличный?

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

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