Instalación de Owncloud con Nginx

Hoy decidí pasar mi actual instalación de Owncloud del muy recorrido Apache a Nginx principalmente para intentar descartar un problema de performance en la sincronización de un gran numero de archivos. La experiencia definitivamente no fue como un paseo en el parque. Me tope con varios problemas, tantos que lo que empezó como un “para mediodía empezaré con las pruebas” para la la noche solo quería no volver a ver un error 404 más.

Empezamos con los detalles.

El resultado esperado

Se espera terminar con un servidor de archivos WebDAV utilizando el paquete de software Owncloud. El servidor debe poder atender un alto numero de solicitudes HTTP por el puerto 80 y utilizar solo software libre.

Los materiales

* OpenSuse 13.1
* Nginx 1.4.4
* PHP 5.5
* MariaDB (o MySQL Community Server)
* Owncloud 6
* phpMyAdmin (para crear la base de datos y el usuario que usara Owncloud)
* nano (si prefieres otro editor eres libre de utilizarlo)

Suelo usar Ubuntu Server como plataforma para servidores pero esta vez preferí usar OpenSuse porque Owncloud (la versión comercial) ofrece una máquina virtual con Owncloud preinstalado y esta VM usa OpenSuse. Suponiendo que hayan elegido esta distribución por alguna razón, decidí ir por el camino seguro y repetir la misma decisión.
El uso de phpMyAdmin es opcional. Si te sientes más cómodo ingresando las sentencias desde el teclado puedes hacerlo a tu manera.

Instalación de OpenSuse

La instalación de openSuse es bastante simple y amigable. En lo único que me puse a jugar fue en las particiones. Utilice LVM con la siguiente configuración:

  • sd1 400Mb
  • sd2 1Tb
    • 40Gb para la raíz /
    • 960Gb para la partición /cloudfiles que es donde almacenaré los archivos
  • swap 4Gb

Estoy redactando el mapa de particiones de memoria así que debes perdonarme si los tamaños no son exactamente precisos.

Durante la instalación elijo usar el escritorio Xfce porque nunca sabes cuando puede ser necesario contar con un entorno gráfico pero como no estamos instalando un equipo de escritorio Xfce será suficiente para salir de apuros.

Me limito a instalar solo los paquetes básicos para tener el servidor funcionando. Luego instalaremos los paquetes requeridos por este tutorial conforme los vayamos necesitando.

Instalación de Nginx

Una vez que la instalación de OpenSuse ha terminado procedemos a instalar el servidor Nginx. Ejecutamos el siguiente comando en la consola:

Finalizada la instalación arrancamos el servicio y además le pedimos a Suse que inicie el servicio cada vez que el servidor arranque.

Podemos probar que nuestro servidor funciona dirigiéndonos al url http://localhost en el mismo servidor (es aquí donde el entorno gráfico resulta útil). Si el resultado es un error 403 Forbidden (porque no hay ninguna página web que mostrar) entonces nuestro servidor esta funcionando correctamente.

Instalación de PHP-FPM

Php-fpm es una versión de PHP orientada a servidores con alta demanda de solicitudes. A diferencia de la versión de php que solemos usar como un módulo de Apache o CGI esta versión se comporta como un servicio con quien interactuamos a traves de sockets.

Su instalación es tan simple como ejecutar el siguiente comando:

Puedes instalar más módulos de PHP si los necesitas. La instalación de módulos se realiza tal como con el PHP de siempre.

Finalizada la instalación arrancamos el servicio y le pedimos a Suse que inicie el servicio cada vez que el servidor arranque.

 Configuración de PHP-FPM

Ahora que nuestro servidor PHP esta corriendo hagamosle cambios para adecuarlo a nuestras necesidades. Nos vamos al directorio /etc/php5/fpm/ .

y empezamos a editar el fichero php-fpm.conf . Busca y edita las siguientes lineas:

Necesitaremos hacer tambien cambios en php.ini que debería estar en este mismo directorio. Si no es así puedes copiar este fichero de la ubicación ya conocida /etc/php5/cli/php.ini

Ahora abrimos php.ini para aplicarle algunos cambios.

Una vez que hayamos guardado los cambios reiniciamos el servidor PHP.

Configuración de Nginx

Vamos a hacerle algunos retoques a nuestro servidor web para acomodarlo a nuestra necesidades y para poder usarlo con PHP. Empecemos editando el archivo de configuración de Nginx.

A continuación tienes el script de configuración del servidor que debe encontrarse en nginx.conf. He agregado comentarios a la mayor parte del código para que entiendas que es lo que hace cada línea. La función detallada de cada comando o parámetro la puedes encontrar en la documentación de Nginx cuyo link se encuentra al final de este tutorial.

Me tomé la libertad de traducir algunos comentarios ya existentes del ingles al español.

Con esto tenemos la configuración básica del servidor web pero no nos será de utilidad si no definimos los sitios virtuales que va a servir. Hacemos eso a continuación.

En el directorio /etc/nginx (donde estamos ahora) creamos el directorio sites-enabled y en su interior colocaremos la configuración respectiva a cada sitio web que nuestro servidor es capaz de servir.

Para crear nuestro site por defecto escribimos:

Y pegamos la siguiente configuración en el editor nano que acaba se abrirse:

Obviamente tu debes reemplazar el valor localhost en el parámetro server_name por el nombre asignado a tu servidor.

Puedes probar la expresión regular ^((?U).+\.php)(.*)$ usada para obtener la ruta del archivo solicitado y las variables entregadas con la herramienta web regex101.com. Hasta el momento esta expresión regular ha cumplido mis expectativas.

Instalación de la base de datos

Para este servidor he elegido usar MariaDB como SGBD pero bien puedes usar otro como MySQLPostgreSQL. Para el caso de este tutorial si decides usar MySQL los pasos no variarán en absoluto.

Instalámos MariaDB.

Y luego arrancamos el servicio y le pedimos a Suse que arranque el servicio cada vez que se encienda el servidor.

Nota: MariaDb es un fork de Mysql Community Server. Esa es la razón de la similitud entre ambos servidores de base de datos. Tanta similitud que el nombre del script del servicio para controlar la base de datos es mysql.service en vez de mariadb.service.

Por defecto el script post-instalación creará el usuario root sin contraseña. Esto debe ser cambiado por supuesto. Puede hacerlo usando el cliente de la base de datos:

o usando un administrador web como phpMyAdmin.  Recuerda que phpMyAdmin no admite contraseñas vacías desde su pantalla de logeo. Para ello deberás cambiar el valor del parámetro de configuración de phpMyAdmin AllowNoPassword a true.

Luego busco y edito la linea a:

Creación de la base de datos

La creación de schemas y asignación de privilegios es un tema para otro tutorial. Crea una base de datos y un usuario para que sea usada por Owncloud y limita el acceso de este usuario a solo esta base de datos. Si tienes dificultad puedes hacerlo a través de phpMyAdmin que cuenta con una interfase gráfica para realizar estas acciones.

Instalación de Owncloud

Con Nginx y Php-fpm configurados la instalación de Owncloud no debería da mayores problemas. No hay problema de permisos de archivos que chown y chmod no puedas resolverlo. En mi caso, como cree una partición especial para almacenar los archivos que deseo administrar le ordeno a Owncloud durante su instalación que deseo que use /cloudfiles (mi partición creada durante la instalación de openSuse). Para ello me aseguro que /cloudfiles sea accesible por Nginx para evitar problemas de permisos.

 

Recursos de información

Las siguientes fuentes fueron muy útiles para salvar los problemas encontrados. No fueron todas las fuentes que use, pero si las mas útiles, las que importan.

Nginx + PHP-FPM + MySQL + phpMyAdmin on Ubuntu 12.04
http://www.lonelycoder.be/nginx-php-fpm-mysql-phpmyadmin-on-ubuntu-12-04/
Tutorial para instalar y configurar un LEMP en Ubuntu Pangolin.

How to Install Nginx With PHP-FPM And MySQL On openSUSE 12.1
http://www.itzgeek.com/how-tos/linux/opensuse/how-to-install-nginx-with-php-fpm-and-mysql-on-opensuse-12-1.html

Debugging Nginx Configuration Trick
http://www.justincarmony.com/blog/2012/01/13/debugging-nginx-configuration-trick/
Una idea para probar resultados de reglas rewrites en Nginx.

Nginx: 413 Request Entity Too Large Error and Solution
http://www.cyberciti.biz/faq/linux-unix-bsd-nginx-413-request-entity-too-large/
De aquí obtuve la solución al error “413 Request Entity Too Large” al intentar cargar archivos de más de 2Mb.

Regular Expressions 101 — an online regex tester for javascript, php, pcre and python.
http://regex101.com/
Extraordinaria herramienta para probar expresiones regulares.

What’s means this ‘(?U)’ on nginx regex
http://stackoverflow.com/questions/15657486/whats-means-this-u-on-nginx-regex
Encontre este ?U en un ejemplo de ocnfiguración de Nginx. Sospeche que podría hacer referencia a la opcion U de las expresiones regulares. De suerte tenia razón.

Nginx documentation
http://nginx.org/en/docs/
Infaltable. Una documentación completa. Cada comando disponible para configurar nginx está aquí, incluso con algunos ejemplos.

Nginx Community
http://wiki.nginx.org/Modules
También encontré documentación aquí pero, a diferencia de la documentación oficial, esta es agradable a la vista.

Deja un comentario