Solución a un problema en dominios alojados en servidores con el panel de control Plesk, relativo a la directiva de PHP open_basedir.
Estamos utilizando un nuevo servidor que tiene soporte para PHP 5. (Hasta el momento estábamos trabajando con PHP 4, pero ya era hora de cambiar). Como siempre, migrar a un nuevo servidor trae sus problemillas, pero afortunadamente con la ayuda del soporte técnico y con la documentación que se encuentra por Internet, se van arreglando.
En este artículo quiero explicar un error que hemos encontrado a la hora de configurar el dominio, que luego he visto que es común a muchas personas que tienen el panel de control Plesk como gestor de los recursos del servidor. Así pues voy a intentar expresar el problema y la solución que hemos encontrado.
El problema con open_basedir
Plesk tiene una configuración propia de la directiva de PHP open_basedir (que se define en el php.ini). Por la configuración de Plesk de open_basedir, sólo se pueden incluir archivos que cuelguen del directorio de publicación del dominio, es decir el directorio httpdocs del dominio.
El estado de open_basedir configurado por Plesk de manera predeterminada es el siguiente:
open_basedir = "/var/www/vhosts/eldominiotuyo.com/httpdocs:/tmp"
Por esa directiva no se pueden incluir archivos (con la función include o require de PHP) que estén en otras carpetas o subcarpetas que cuelguen de las marcadas en el open_basedir.
Nosotros tenemos algunas carpetas que contienen códigos fuera del directorio de publicación y no se estaban pudiendo incluir. Por eso nos estaba saliendo un error PHP como este:
open_basedir restriction in effect. File(./../directorio-fuera-httpdocs/archivo.php) is not within the allowed path(s): (/var/www/vhosts/midominio.com/httpdocs:/tmp)
Luego he visto que este problema lo tienen también usuarios que tengan códigos incluidos en frameworks para PHP como PEAR.
Solución al problema: configurar Plesk
La primera aproximación a la solución fue, como se pensará, modificar el archivo PHP.ini. De hecho, es lo que pensaba que lo arreglaría. Para cambiar la directiva open_basedir del php.ini. Pero los cambios, no surtieron efecto. También probé cambiando la directiva include_path, pero tampoco arregló nada.
Una vez consultado con el servicio técnico de nuestro proveedor, nos aconsejaron mover todas las carpetas al directorio de publicación, pero eso no es posible, por diversas razones. Pero nos dieron la pista que el problema estaba relacionado con Plesk.
Finalmente buscando por Pear y Pesk en Google apareció un artículo muy interesante en una página en ingles: HOWTO: Enable PEAR/Set open_basedir
En ese artículo está expresado paso a paso lo que se tiene que hacer, que voy a resumir en español, para los lectores de desarrolloweb.com a los que les pase lo mismo.
Existe un archivo que Plesk utiliza para configurar cada dominio, de modo que no conviene tocar el php.ini, porque eso afectaría a todo el servidor (y no siempre, porque algunas directivas, como open_basedir, luego las sobreescribe Plesk en otros archivos aparte y por mucho que se toquen en el php.ini no tendrá ningún efecto).
Hay un sitio donde se deben configurar los cambios del php.ini, específicos para cada dominio alojado. En mi caso ese archivo de configuración no estaba creado, por lo que he tenido que crearlo. El archivo de configuración específico para cada dominio está en el directorio
/var/www/vhosts/midominio.com/conf
Y el archivo que hay que crear allí, o modificar si es que ya existe es:
vhost.conf
Para que funcione, el contenido del archivo que he colocado es el siguiente:
<Directory "/var/www/vhosts/midominio.com/httpdocs">
php_admin_value open_basedir "/var/www/vhosts/midominio.com/httpdocs:/tmp:/var/www/vhosts/midominio.com/directorio_includes
php_admin_value display_errors On
</Directory>
Se trata simplemente de definir el open_basedir marcando todos los directorios donde hay archivos que se pretenden incluir desde PHP. (Con incluir un directorio te permite incluir archivos de todos los subdirectorios que haya dentro)
En el código anterior puedes ver que hemos modificado otro parámetro del PHP:
display_errors On (Esto es para poder ver los errores directamente en la página, en vez del log de errores, que es más cómodo por lo menos durante las pruebas y hasta migrar definitivamente el dominio)
Ahora bien, ya sabemos donde tocar para configurar directivas PHP del php.ini específicas para un dominio alojado. Podremos definir todas las directivas que se necesiten. Por ejemplo, otra cosa que se puede necesitar cambiar es anular el safe_mode para un dominio en concreto y eso se puede hacer desde este mismo archivo con la línea:
php_admin_value safe_mode Off
Para que los cambios tengan efecto aun tenemos que realizar un par de pasos.
Se trata primero de decirle a Plesk que actualice la configuración de un dominio. Esto se hace con el comando:
/usr/local/psa/admin/sbin/websrvmng --reconfigure-vhost --vhost-name=midominio.com
Ahora también tendremos que reiniciar el apache, que se puede hacer con el comando:
/etc/init.d/httpd restart
O bien con el comando:
service httpd restart
Esto es todo, ahora debería funcionar. Esperamos que los lectores de DesarrolloWeb.com tengan la misma suerte. A nosotros nos ha ido bien!
En este artículo quiero explicar un error que hemos encontrado a la hora de configurar el dominio, que luego he visto que es común a muchas personas que tienen el panel de control Plesk como gestor de los recursos del servidor. Así pues voy a intentar expresar el problema y la solución que hemos encontrado.
El problema con open_basedir
Plesk tiene una configuración propia de la directiva de PHP open_basedir (que se define en el php.ini). Por la configuración de Plesk de open_basedir, sólo se pueden incluir archivos que cuelguen del directorio de publicación del dominio, es decir el directorio httpdocs del dominio.
El estado de open_basedir configurado por Plesk de manera predeterminada es el siguiente:
open_basedir = "/var/www/vhosts/eldominiotuyo.com/httpdocs:/tmp"
Por esa directiva no se pueden incluir archivos (con la función include o require de PHP) que estén en otras carpetas o subcarpetas que cuelguen de las marcadas en el open_basedir.
Nosotros tenemos algunas carpetas que contienen códigos fuera del directorio de publicación y no se estaban pudiendo incluir. Por eso nos estaba saliendo un error PHP como este:
open_basedir restriction in effect. File(./../directorio-fuera-httpdocs/archivo.php) is not within the allowed path(s): (/var/www/vhosts/midominio.com/httpdocs:/tmp)
Luego he visto que este problema lo tienen también usuarios que tengan códigos incluidos en frameworks para PHP como PEAR.
Solución al problema: configurar Plesk
La primera aproximación a la solución fue, como se pensará, modificar el archivo PHP.ini. De hecho, es lo que pensaba que lo arreglaría. Para cambiar la directiva open_basedir del php.ini. Pero los cambios, no surtieron efecto. También probé cambiando la directiva include_path, pero tampoco arregló nada.
Una vez consultado con el servicio técnico de nuestro proveedor, nos aconsejaron mover todas las carpetas al directorio de publicación, pero eso no es posible, por diversas razones. Pero nos dieron la pista que el problema estaba relacionado con Plesk.
Finalmente buscando por Pear y Pesk en Google apareció un artículo muy interesante en una página en ingles: HOWTO: Enable PEAR/Set open_basedir
En ese artículo está expresado paso a paso lo que se tiene que hacer, que voy a resumir en español, para los lectores de desarrolloweb.com a los que les pase lo mismo.
Existe un archivo que Plesk utiliza para configurar cada dominio, de modo que no conviene tocar el php.ini, porque eso afectaría a todo el servidor (y no siempre, porque algunas directivas, como open_basedir, luego las sobreescribe Plesk en otros archivos aparte y por mucho que se toquen en el php.ini no tendrá ningún efecto).
Hay un sitio donde se deben configurar los cambios del php.ini, específicos para cada dominio alojado. En mi caso ese archivo de configuración no estaba creado, por lo que he tenido que crearlo. El archivo de configuración específico para cada dominio está en el directorio
/var/www/vhosts/midominio.com/conf
Y el archivo que hay que crear allí, o modificar si es que ya existe es:
vhost.conf
Para que funcione, el contenido del archivo que he colocado es el siguiente:
<Directory "/var/www/vhosts/midominio.com/httpdocs">
php_admin_value open_basedir "/var/www/vhosts/midominio.com/httpdocs:/tmp:/var/www/vhosts/midominio.com/directorio_includes
php_admin_value display_errors On
</Directory>
Se trata simplemente de definir el open_basedir marcando todos los directorios donde hay archivos que se pretenden incluir desde PHP. (Con incluir un directorio te permite incluir archivos de todos los subdirectorios que haya dentro)
En el código anterior puedes ver que hemos modificado otro parámetro del PHP:
display_errors On (Esto es para poder ver los errores directamente en la página, en vez del log de errores, que es más cómodo por lo menos durante las pruebas y hasta migrar definitivamente el dominio)
Ahora bien, ya sabemos donde tocar para configurar directivas PHP del php.ini específicas para un dominio alojado. Podremos definir todas las directivas que se necesiten. Por ejemplo, otra cosa que se puede necesitar cambiar es anular el safe_mode para un dominio en concreto y eso se puede hacer desde este mismo archivo con la línea:
php_admin_value safe_mode Off
Para que los cambios tengan efecto aun tenemos que realizar un par de pasos.
Se trata primero de decirle a Plesk que actualice la configuración de un dominio. Esto se hace con el comando:
/usr/local/psa/admin/sbin/websrvmng --reconfigure-vhost --vhost-name=midominio.com
Ahora también tendremos que reiniciar el apache, que se puede hacer con el comando:
/etc/init.d/httpd restart
O bien con el comando:
service httpd restart
Esto es todo, ahora debería funcionar. Esperamos que los lectores de DesarrolloWeb.com tengan la misma suerte. A nosotros nos ha ido bien!
Miguel Angel Alvarez
Fundador de DesarrolloWeb.com y la plataforma de formación online EscuelaIT. Com...