No se pueden instalar nuevos plugins debido al error "No se pudo crear el directorio"
Un miembro de la facultad está teniendo problemas con una instalación de WordPress para instrucción. Corregir problemas individuales de permisos ha sido un proceso de prueba y error, y se ha convertido en un dolor recurrente, así que preguntaré aquí. ¿Qué puedo hacer para que WordPress funcione correctamente? Los tipos de errores que reciben:
Instalando Plugin: Lightbox 2 2.9.2 Descargando paquete de instalación desde http://downloads.wordpress.org/plugin/lightbox-2.2.9.2.zip… Descomprimiendo el paquete… No se pudo crear el directorio. /home/CIM140/public_html/wordpress/wp-content/upgrade/lightbox-2.tmp
Cuando hago su como www-data (el usuario bajo el que corre Apache en Ubuntu), puedo crear ese directorio sin problemas. Mi instancia de prueba de WordPress instala este plugin correctamente, así que no entiendo por qué falla para ellos.

@pwnguin,
Tuve los mismos problemas al ejecutar mod_php con WordPress y finalmente lo resolví.
# chown www-data:www-data /home/CIM140/public_html/wordpress/ -R
Mientras TÚ controles el servidor, esto no causará problemas de seguridad.
EDITADO:
También podrías necesitar cambiar tu umask a 022 para que los nuevos directorios creados por WordPress tengan permisos 755 y los archivos tengan permisos 644.
Otra opción es sobrescribir los permisos predeterminados en wp-config.php:
define('FS_CHMOD_DIR', (0755 & ~ umask()));
define('FS_CHMOD_FILE', (0644 & ~ umask()));
También puedes forzar el método del sistema de archivos para actualizaciones.
- (Preferencia Principal) "Direct" fuerza el uso de solicitudes Directas de E/S de archivos desde PHP, esto puede abrir problemas de seguridad en hosts mal configurados, se elige automáticamente cuando es apropiado.
- (Preferencia Secundaria) "ssh" fuerza el uso de la Extensión SSH de PHP.
- (3ra Preferencia) "ftpext" fuerza el uso de la Extensión FTP de PHP para acceso FTP, y finalmente
- (4ta Preferencia) "ftpsockets" utiliza la Clase Sockets de PHP para acceso FTP.
Estos pueden definirse en wp-config.php con: define('FS_METHOD', 'ftpext');
Puedes obtener todas las constantes definidas actualmente ejecutando el comando print_r(@get_defined_constants());
en php.

ejemplo: drwxrwsr-x 6 www-data www-data 4096 2010-09-22 23:15 wp-content

Intenta cambiarlos a drwxr-xr-x 7 www-data www-data 4096 Sep 24 09:38 wp-content

También nunca he usado el atributo SGID en un directorio, es decir: chmod g+s No creo que sea necesario. Que alguien me corrija si estoy equivocado.

Ah, después de contactar al profesor, parece que está usando SSH por defecto mientras que mi instancia de prueba usa IO directo. Así que es su usuario el que no tiene permisos para crear el directorio.

Para entender por qué estás teniendo estos problemas, necesitas comprender los conceptos subyacentes de propiedad de archivos.
Básicamente, sabes que Apache se ejecuta como el usuario www-data. Es por eso que establecer que todo sea propiedad de ese usuario funciona, porque WordPress verifica que puede crear archivos como el usuario que posee sus propios archivos. Entonces, lo que estás haciendo es hacer que todo sea propiedad del usuario que posee los archivos.
Si tienes control total y absoluto de la máquina, esto está bien. Por otro lado, si es un servidor de alojamiento compartido, entonces has creado un agujero de seguridad.
Normalmente, los servidores web se ejecutan como algún usuario (como www-data) que luego ejecuta código de otros usuarios (como "otto", mi cuenta de usuario). En esta situación, el servidor web no tendría la capacidad de crear archivos como "otto" y, por lo tanto, no podría crear archivos correctamente como mi cuenta. Por lo tanto, esta verificación de WordPress sobre la creación de archivos con la propiedad correcta y, por lo tanto, la capacidad de instalar plugins o actualizar archivos fallaría, correctamente, porque tener mis archivos propiedad del usuario compartido del servidor web sería un riesgo de seguridad.
En tal caso, WordPress debería solicitarme correctamente credenciales FTP, o algo por el estilo. Estas serían una forma de solucionar el problema de la cuenta de usuario autenticándose como el usuario que debería escribir los archivos y luego escribiéndolos como ese usuario.
Ahora, estás intentando resolver este problema cambiando todos los archivos de WordPress para que sean propiedad de la misma cuenta que el servidor web utiliza para escribir los archivos. El enfoque más normal para esto es cambiar cómo el servidor web escribe los archivos, para permitir que el proceso PHP sea "propiedad" de la cuenta de usuario que está ejecutando los archivos.
La respuesta general a esto es "suphp". Esta versión de PHP establece que el usuario que ejecuta el proceso PHP sea el mismo que el propietario de los archivos PHP que está ejecutando. Esto es más seguro en configuraciones de alojamiento compartido, porque garantiza que un proceso PHP ejecutado por el servidor web compartido se ejecute como el propietario de los archivos PHP y, por lo tanto, no pueda leer las cuentas de otros usuarios y similares.
En Ubuntu, creo que esta es la forma general de hacerlo:
Instalar suphp:
$ sudo apt-get install libapache2-mod-suphp
Deshabilitar el antiguo mod_php
$ sudo a2dismod php5
Reiniciar Apache
$ sudo /etc/init.d/apache2 restart
Y listo. Ahora, haz que tus archivos PHP de WordPress sean propiedad del propietario normal de ellos. Sin trucos especiales, sin cambiar permisos o propiedad ni nada por el estilo. Dado que el proceso PHP se ejecutará como el propietario de esos archivos, podrá escribir en ellos como ese propietario. Los directorios deben tener permisos 755, los archivos deben tener 644 (nota: a suphp no le gusta cuando los archivos son editables por grupo, por lo que 755/644 es el conjunto de permisos correcto).

Necesitas dar permisos de escritura a los directorios relevantes. Idealmente, deberías hacerlo solo para el archivo o carpeta específica y luego revertir los permisos para no dejar tu sitio vulnerable.
Puedes solucionar esto usando los siguientes comandos desde la línea de comandos (asumiendo que estás en la carpeta raíz de WordPress):
# cd wp-content
# chmod -R a+w plugins
# chmod -R a+w themes
# chmod -R a+w upgrade
La solución más segura es agregar apache al mismo grupo que el propietario de la instalación de WordPress y cambiar todos los permisos de grupo a escritura.

- Si existe una solución más detallada, agréguela aquí, en lugar de enlazarla. 2. no, el servidor web no debería de ninguna manera tener la capacidad de escribir directamente en los directorios de código, a menos que disfrutes ser hackeado.

@MarkKaplun pero entonces las actualizaciones de extensiones no funcionan, lo que la mayoría de usuarios de WP considera la forma "normal" de administrar un sitio. Una afirmación un poco demasiado fuerte. Que el servidor pueda escribir sobre wp-content es relativamente peor para la seguridad, pero por sí solo no es un gran problema.

@MarkKaplun: Incluso la respuesta aceptada básicamente dice lo mismo - lo único es que es específica para Apache mientras que la mía es genérica.

- Si tu respuesta es la misma, ¿cuál es el sentido de tenerla? 2. ¿Quién dijo que la respuesta aceptada es genial?

@Rarst, también es menos conveniente cerrar con llave la puerta principal de la casa y cerrar las ventanas. Si las personas prefieren buscar archivos hackeados por todo su servidor en lugar de solo en el directorio de uploads, pueden hacer lo que sugiere la respuesta. Las actualizaciones de plugins/temas de Wordpress se hacen mejor a través de un servidor ftp si no te molesta usar una aplicación cliente sftp.

A veces he tenido sitios donde corregir los permisos de directorios y archivos no era suficiente para solucionar este problema. Luego descubrí que uno o más directorios tenían el atributo de inmutabilidad activado. Esto se puede resolver fácilmente ejecutando chattr -R /var/www/sub.domain.tld
como root.
