Recientemente en un blog de WordPress configurado para ejecutar PHP como Aplicación FastCGI a veces no respondía porque parece que algo relacionado con FastCGI se quedaba colgado, generando en los logs errores como estos:

[warn] mod_fcgid: process 24957 graceful kill fail, sending SIGKILL
[warn] [client xx.xx.xx.xx] mod_fcgid: read data timeout in 45 seconds
[error] [client xx.xx.xx.xx] Premature end of script headers: index.php

lo que también producía alto consumo de CPU y de tráfico del servidor, haciendo que las webs configuradas como Aplicación FastCGI respondieran con error 503 Service unavailable (servicio no disponible) y que las webs como Módulo Apache fueran muy lentas. Incluso del alto consumo de recursos el servidor empezaba a tumbar servicios (servidor web HTTP, servidor de correo SMTP, etc.), que el fantástico vigilante WatchDog volvía a levantar, excepto en una ocasión en la que el perrito también se quedó pillado.

Los errores en FastCGI podían estar relacionados con la manipulación de imágenes entre otras cosas, según comentaban en la red. Cuando fallaba, cambiando el blog de WordPress de Aplicación FastCGI a Módulo Apache volvía a funcionar, pero entonces se producía otro problema: ciertas imágenes no se veían. En los logs aparecía este error ejecutando PHP como Módulo Apache:

[error] [client xx.xx.xx.xx] PHP Warning: imagegif():
Unable to open '/ruta/wp-content/uploads/imagen.gif' for writing:
Permission denied in
/ruta/wp-includes/class-wp-image-editor.php on line 334

En la web la imagen no aparecía cuando tenía que ejecutar funciones de manipulación de imágenes como get_thumbnail(). La carpeta /wp-content/uploads/ tenía permisos 755, y cambiándolos a 777 ya funcionaba. Pero como tener la carpeta /uploads con permisos 777 no es seguro, había que encontrar otra solución.

Buscando por Internet encontré el artículo “How to Setup Secure Media Uploads“, donde se explica una forma segura de tener permisos 777 en la carpeta /wp-content/uploads/ pero restringiendo su acceso mediante .htaccess, de manera que sólo los archivos permitidos puedan recuperarse de ese directorio y subdirectorios. Para el resto de archivos no permitidos, da error 403 Forbidden (Prohibido). Basta con poner en /wp-content/uploads/ el archivo .htaccess siguiente:

# secure uploads directory
 
<Files ~ ".*\..*">
	Order Allow,Deny
	Deny from all
</Files>
 
<FilesMatch "\.(jpg|jpeg|jpe|gif|png|tif|tiff)$">
	Order Deny,Allow
	Allow from all
</FilesMatch>

Podemos añadir más extensiones de archivo o eliminar las que no usemos. Por ejemplo, para permitir también archivos pdf:

<FilesMatch "\.(jpg|jpeg|jpe|gif|png|tif|tiff|pdf)$">
Etiquetas: , , , , , , , , , , , , , , , , , ,
Deja una Respuesta