jueves, 7 de abril de 2016

Como instalar Drupal 8 con Nginx en Ubuntu 14.04

En este tutorial, vamos a instalar Drupal 8 junto con Nginx como servidor web, Mysql como el servidor de base de datos y PHP-FPM para manejar las solicitudes de PHP.

Existen dos motivos principales por los que voy a utilizar Nginx junto con Drupal 8. El primero es que consume menos recursos en el servidor y el segundo que es mucho más rápido que apache.

También aclarar que he elegido a Ubuntu como distribución de Linux, ya que es muy simple de manejar y funciona muy bien junto con Drupal 8.

Sin dar tantas vueltas comencemos...

Vamos a conectarnos al servidor por consola mediante SSH

ssh ale@158.124.***.***

Instalar Nginx en Ubuntu

No vamos a instalar la versión oficial de Nginx debido a que no cuenta con el módulo fastcgi_cache_purge que se utiliza para vaciar la cache y será de utilidad en el futuro. En su lugar voy a instalar una versión de rtCamp que ya tiene este módulo compilado.

sudo add-apt-repository ppa:rtcamp/nginx -y
sudo apt-get update
sudo apt-get install nginx-custom -y

Una vez que se complete el proceso, puedes confirmar que Nginx se instaló correctamente con el siguiente comando.

nginx -v 

Además, si visitas la dirección IP del servidor podrás ver la página de bienvenida que muestra Nginx.
Una vez que tenemos Nginx instalado debemos realizar algunas configuraciones básicas. Pero antes debes determinar la cantidad de núcleos y que tiene tu servidor y el límite de archivos abiertos que soporta.

Ejecuta los siguientes comando y toma nota:

grep processor /proc/cpuinfo | wc -l
ulimit -n

Ahora abre el archivo de configuración de Nginx:

sudo nano /etc/nginx/nginx.conf
No explicaré cada una de las líneas que se encuentran en este archivo, pero si revisaremos lo básico para tener un server bastante decente.


  1. Comienza asignándole tu nombre de usuario (de ubuntu) a la primera línea user.
  2. worker_processes indica que cantidad de workers que va a levantar el server para atender las peticiones. Se recomienda levantar tantos workers como núcleos tenga el servidor. En mi caso como tengo 2 núcleos puse 2 workers.
  3. worker_connections es la cantidad de conexiones que atenderá cada worker, yo le asigne 1024 conexiones que es precisamente la cantidad de archivos abiertos que soporta mi servidor.
  4. La línea multi_accept debes descomentarla y asegúrate que esta puesta en "on".
  5. keepalive_timeout determina cuantos segundos Nginx tendrá la conexión abierta con el cliente. Yo en mi caso le asigné 15 segundos ya que no quiero que el server este mucho tiempo sin hacer nada.
  6. Descomenta la línea server_tokens y asegúrate que este en "off".
  7. Debajo de server_tokens agrega una nueva línea con la directiva "client_max_body_size" que indica la cantidad máxima (en mb) que podrá tener un archivo al ser subido al servidor. En mi caso le asigne 64 mb y la línea debe quedar así: client_max_body_size 64m;
  8. Descomenta la línea gzip_proxied y asígnale el valor "any". 
  9. gzip_comp_level indica cuanto se comprimirán los archivos antes de enviados al cliente. Yo le asigne un valor 2 ya que un valor muy alto podría afectar el rendimiento del CPU del servidor.


Con estos cambios hechos, verificamos que no tenemos errores de sintaxis.

sudo nginx -t

Si todo está bien, reiniciamos Nginx:

sudo service nginx restart


Instalar PHP-FPM

Al igual que pasaba con Nginx, el repositorio de Ubuntu no cuenta con todos los paquetes PHP necesarios. Sin embargo, existe un paquete que se encuentra actualizado y mantenido por Ondřej Surý.

Agregamos el repositorio y actualizamos la lista de paquetes con los siguientes comandos:

sudo apt-add-repository ppa:ondrej/php5-5.6 -y
sudo apt-get update

Luego instalamos PHP:

sudo apt-get install php5-fpm php5-common php5-mysqlnd php5-xmlrpc php5-curl php5-gd php5-imagick php5-cli php-pear php5-dev php5-imap php5-mcrypt

Después que la instalación termine, confirmamos que PHP fue instalado correctamente:

php5-fpm -v



Ahora que tenemos PHP instalado en el sistema, debemos configurarlo para que trabaje perfectamente con Nginx.

Abre el archivo de configuración por defecto de php-fpm:

sudo nano /etc/php5/fpm/pool.d/www.conf

Cambia las siguientes líneas remplazando www-data con tu nombre de usuario de Ubuntu:

user = www-data
group = www-data
listen.owner = www-data
listen.group = www-data

Ahora debemos ajustar el famoso php.ini para que incrementar el tamaño máximo de un archivo que se puede subir al servidor e igualarlo al valor que pusimos antes en la configuración de Nginx.

sudo nano /etc/php5/fpm/php.ini

Cambia los valores de las siguientes líneas con el valor que indicaste en la configuración de Nginx.

upload_max_filesize = 2M
post_max_size = 8M

Presiona CTL X y luego “Y” para guardar los cambios.
Comprueba que la configuración no tienes errores de sintaxis :

sudo php5-fpm -t

Si no tienes errores reinicia el servicio de php-fpm:

sudo service php5-fpm restart

Instalar MySQL


El último servicio que necesitamos instalar es MySQL, que requiere muy poca configuración con respecto a lo que ya tenemos instalado.

Instala MySQL con el siguiente comando:

sudo apt-get install mysql-server

Se te presentará una pantalla de configuración en la que debes introducir la contraseña para el usuario root de MySQL.
Ahora que ya terminamos la instalación, debemos crear las tablas que necesita MySQL para que funcione correctamente:

sudo mysql_install_db

Ahora aseguramos la instalación con el siguiente comando:

sudo mysql_secure_installation

Ingresas la contraseña del usuario root que creamos cunado instalamos MySQL. Además, se te pedirán una serie de datos en donde puedes dejar los valores por defecto.


Configurar Nginx con Drupal 8

Finalmente vamos a comenzar con la instalación de Drupal 8.

Creamos la estructura de directorios en la carpeta home de nuestro usuario:

mkdir drupaldev.com
mkdir drupaldev.com/logs
mkdir drupaldev.com/public

chmod -R 755 drupaldev.com

Ahora es tiempo de crear un bloque de servidor Nginx, donde configuraremos como se manejará este sitio concreto dentro de Nginx.

cd /etc/nginx/sites-available

Creamos un archivo para manejar la configuración, Nombra a este archivo igual que el nombre de dominio del sitio para mantener las cosas ordenadas y claras.

sudo nano drupaldev.com

Copia y pega las siguientes lineas de configuración dentro del archivo:

server {
    server_name drupaldev.com www.drupaldev.com;
    root /home/ale/drupaldev.com/public/; ## <-- carpeta donde se encuentran los archivos de Drupal.

    access_log /home/ale/drupaldev.com/logs/access.log;
    error_log /home/ale/drupaldev.com/logs/error.log;

    location = /favicon.ico {
        log_not_found off;
        access_log off;
    }

    location = /robots.txt {
        allow all;
        log_not_found off;
        access_log off;
    }

    location ~ \..*/.*\.php$ {
        return 403;
    }

    location ~ ^/sites/.*/private/ {
        return 403;
    }

    location ~ (^|/)\. {
        return 403;
    }

    location / {
        # try_files $uri @rewrite; # For Drupal <= 6
        try_files $uri /index.php?$query_string; # For Drupal >= 7
    }

    location @rewrite {
        rewrite ^/(.*)$ /index.php?q=$1;
    }

    location ~ '\.php$|^/update.php' {
        fastcgi_split_path_info ^(.+?\.php)(|/.*)$;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $request_filename;
        fastcgi_intercept_errors on;
        fastcgi_pass unix:/var/run/php5-fpm.sock;
    }

    location ~ ^/sites/.*/files/styles/ { # For Drpal >= 7
        try_files $uri @rewrite;
    }

    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
        expires max;
        log_not_found off;
    }
}

Debes cambiar las rutas donde se encuentran los archivos de instalación de Drupal y donde se encuentran los logs por tus propias rutas.

Por defecto Nginx solo incluye los sitios que tengamos activos en sites-enabled, por lo que vamos a crear un symlink hacia dicha carpeta.

sudo ln -s /etc/nginx/sites-available/drupaldev.com /etc/nginx/sites-enabled/drupaldev.com

Para que los cambios tengan efecto, debemos comprobar que no tenemos errores de sintaxis y reiniciar Nginx.

sudo nginx -t
sudo service nginx restart


Crear una base de datos para el sitio

Cuando manejemos muchos sitios en el mismo servidor, una buena práctica es crear un usuario de MySQL para cada sitio. También debes asegurarte que cada usuario tiene privilegio solo para acceder a su base de datos.

Entra en MySQL con el usuario root:

mysql -u root -p



Creamos la base de datos para el sitio:

CREATE DATABASE drupaldev_com;

Ahora creamos un usuario nuevo para la base de datos con el siguiente comando. Recuerda cambiar username y password por tus propios valores.

CREATE USER 'username'@'localhost' IDENTIFIED BY 'password';

Le damos los permisos requeridos para manejar la base de datos al nuevo usuario:

GRANT ALL PRIVILEGES ON drupaldev_com.* TO 'username'@'localhost';

Para que los cambios tengan efecto ejecutamos el siguiente comando:

FLUSH PRIVILEGES;

Y finalmente salimos de MySQL:

exit;

Instalar Drupal 8 

Para instalar Drupal 8 vamos a necesitar instalar drush y git.

Drush en la forma de manejar Drupal mediante la línea de comandos y  git es un gestor de control de versiones.

Puedes instalarlos con el siguiente comando:

sudo apt-get install git drush -y

A continuación, nos situamos en el directorio public de nuestro sitio y descargamos Drupal 8:

cd /home/ale/drupaldev.com/public/
drush dl drupal-8

Ahora movemos al directorio public todos los archivos que estén dentro de la carpeta drupal-8.0.x que descargamos recién y luego eliminamos esta carpeta.

mv drupal-8.0.6/* /home/ale/drupaldev.com/public/
rm -R drupal-8.0.6/

En este paso vamos a editar los archivos de configuración de Drupal 8. Te diriges al directorio "sites/default" y copias los 2 archivos de configuración necesarios.

cd sites/default
cp default.settings.php settings.php
cp default.services.yml services.yml

Tenemos que crear un nuevo directorio llamado files dentro de site/default y darle los permisos adecuados.

mkdir files/
chmod a+w *

Si en este momento visitas el dominio del sitio web con un navegador, podrás ver la página principal de instalación de Drupal 8.

¡Taraaaaan!

Elegimos el lenguaje que deseemos y hacemos click en Save and Continue.
Ahora podemos elegir el tipo de instalación que llevaremos a cabo, yo te recomiendo que elijas estándar. Haz click en Guardar y continuar.



En este paso debemos introducir todos los datos necesarios para poder acceder a la base de datos que creamos en pasos anteriores. Por razones de seguridad es recomendable que, en opciones avanzada, elijas un prefijo para el nombre de las tablas en la base de datos. Luego sigue adelante al siguiente paso.
En estos momentos se está llevando a cabo la instalación...

Una vez que termine el proceso de instalación, vamos a completar todos los datos del sitio como el nombre, correo, nombre de usuario, contraseña, etc.

Una vez que termina esta última parte del proceso de instalación y si todo salió bien, veremos la página de Inicio de nuestro sitio web.


Increíblemente a mí me ha funcionado todo a la primera (cosa que no esperaba). Yo sé que todo este proceso no es una tarea fácil, así que tómalo con calma. Si sigues el tutorial paso a paso no deberías tener ningún problema.

Igual ante cualquier duda o problema que tengas puedes contactarme en los comentario y seguro te hecho una mano.

¡Un saludo y hasta la próxima!