Cómo configurar un servidor VPS [Parte 3] - Instalar y optimizar Nginx y PHP

¡Hola! Seguimos con la serie de tutoriales de configuración de un servidor VPS. ¡Ahora toca instalar Nginx!

Si quieres ver los tutoriales de esta guía, mira esta serie de tutoriales para configurar un servidor VPS con Debian y Nginx.

Tras haber completado con éxito el tutorial anterior, vamos a entrar por SSH a la consola de nuestro servidor y, lo primero que tenemos que hacer es actualizar:

# apt-get update && apt-get upgrade

Qué es Nginx

Nginx es un servidor HTTP liberado bajo licencia BSD. Además de como servicio HTTP, podemos utilizar Nginx como servidor proxy inverso, y para IMAP, POP3 o SMTP, aunque yo me centraré en la parte HTTP, que es lo que actualmente nos importa.

Es un gran competidor de Apache y fue creado como servidor Web de alto rendimiento y, su utilización va creciendo muy rápidamente. Por ejemplo, WordPress.com utiliza Nginx para dar servicio a los usuarios de dichas páginas (ojo, no confundir WordPress.com con WordPress.org).

Rendimiento

Son muchos los que dicen que Nginx es mucho más rápido que Apache. Otros son fieles a Apache y no mueven sus páginas de ahí ni locos. Yo llevo con Apache ya cierto tiempo y creo que es hora de migrar a Nginx. Con una buena configuración y puesta a punto podemos optimizar mucho la velocidad y el consumo de memoria de nuestra página. Vamos a ver cómo hacerlo en este tutorial.

Investigando sobre el rendimiento y la comparación entre Apache y Nginx, he encontrado un artículo de Joe Williams en el que realiza la comparación. Os pongo en situación:

  • Sistema operativo: CentOS 5.1.
  • Dual 2.4GHz Xeon CPUs
  • 4GB RAM

Algunas gráficas de los resultados obtenidos son:

Si queréis ver con detalle el estudio de rendimiento realizado, visitad este artículo.

INSTALACIÓN Y CONFIGURACIÓN

Vamos a ver la instalación y configuración de Nginx en varios pasos. Utilizaremos la versión que está incluida en los repositorios. Si venís del tutorial anterior, habréis visto que al instalar iRedMail, se configura Apache por defecto. Vamos a cambiar esto para optimizar nuestra Web.

Paso 1 - Instalar Nginx

Introducimos el siguiente comando para intalar Nginx: # apt-get install nginx

Paso 2 - Instalar PHP y módulos

Vamos a instalar los módulos necesarios de PHP para que nuestra página (Wordpress) funcione correctamente. Es complicado saber cuáles son los módulos que vamos a necesitar, pues depende de los objetivos de cada uno, pero se podría decir que lo mínimo sería lo que os pondré a continuación: # apt-get install php5-common php5-mysql php5-xmlrpc php5-cgi php5-curl php5-gd php5-cli php5-fpm php-apc php5-dev php5-mcrypt Tras esto, vamos a comprobar la versión: root@tutorialvps:~# php -v PHP 5.4.4-14+deb7u8 (cli) (built: Feb 17 2014 09:18:47) Copyright (c) 1997-2012 The PHP Group Zend Engine v2.4.0, Copyright (c) 1998-2012 Zend Technologies

Paso 3 - Configurar PHP-FPM

Ahora que los componentes necesarios para que funcione nuestra instalación de WordPress, toca  configurar un par de cosas de PHP-FPM. Primero tendremos que modificar la variable cgi.fix_pathinfo del archivo que se encuentra en /etc/php5/fmp/php.ini para poner su valor a '0'.

# nano /etc/php5/fpm/php.ini Buscamos la variable cgi.fix_pathinfo y la dejamos así: cgi.fix_pathinfo=0

Esto es una medida de seguridad para PHP, ya que si esta variable tuviese valor '1', los usuarios podrían ver información que no deberían a través de los archivos PHP servidos.

A continuación modificaremos otra variable en el archivo siguiente:

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

Buscamos esta línea y la dejamos así:

listen = /var/run/php5-fpm.sock

Para finalizar con PHP-FPM, reiniciamos el servicio:

# service php5-fpm restart

Paso 4 - Configurar Nginx

Vamos a realizar la configuración de Nginx. Nuestra configuración dependerá del número de cores (CPUs) de nuestra máquina. Ya sabemos desde un principio que tenemos 1 CPU, pero para asegurarnos, introducimos el siguiente comando en la terminal:

# lscpu Obteniendo este resultado: root@tutorialvps:~# lscpu Architecture:          x86_64 CPU op-mode(s):        32-bit, 64-bit Byte Order:            Little Endian CPU(s):                1

El archivo de configuración de Nginx se encuentra en /etc/nginx/nginx.conf, por lo que tendremos que modificarlo para dejarlo a nuestro gusto. Como hemos obtenido un resultado de '1' en el número de CPUs, buscaremos la línea worker_processes (está de las primeras) y la dejaremos con valor '1'. El fichero completo lo dejo a continuación:

user www-data; worker_processes 1; pid /var/run/nginx.pid; events { worker_connections 1024; # multi_accept on; } http { ## # Basic Settings ## sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; server_names_hash_bucket_size 64; types_hash_max_size 2048; server_tokens off; index index.php index.html index.htm; include /etc/nginx/mime.types; default_type application/octet-stream; ## # Logging Settings ## access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log; ## # Gzip Settings ## gzip on; gzip_disable "msie6"; gzip_vary on; gzip_proxied any; gzip_comp_level 3; gzip_buffers 16 8k; gzip_http_version 1.1; gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript; upstream php5-fpm { keepalive 8; server unix:/var/run/php5-fpm.sock; } ## # Virtual Host Configs ## include /etc/nginx/conf.d/*.conf; include /etc/nginx/sites-enabled/*; }

Paso 5 - Configuración mínima de funcionamiento para un servidor Nginx

Ahora vamos a hacer un pequeño "Hola Mundo" con Nginx. El objetivo es crear una carpeta donde se encuentren los archivos de WordPress y que la "raíz" del servidor sea esa, es decir, que los usuarios accedan a ese directorio cuando vean la página Web. Además, en el siguiente paso, eliminaremos Apache.

Apache está actualmente funcionando en el puerto 80, así que lo que hagamos no funcionará hasta que no paremos/eliminemos su servicio.

Del mismo modo que Apache, Nginx configura los sitios (páginas Web) desde una carpeta llamada sites-available y los activa mediante sites-enabled para poder servir sus contenidos. Al instalar Nginx, tenemos el archivo default dentro de la carpeta /etc/nginx/sites-available. En ese archivo, tendremos una configuración temporal, es decir, hasta que instalemos Wordpress.

Nuestro servidor va a escuchar en el puerto 80 (HTTP) y va a servir los archivos que se encuentren en /var/www/wordpress, así que escribimos lo siguiente en la terminal para crear el directorio:

# mkdir /var/www/wordpress Ahora vamos al fichero default:

# nano /etc/nginx/sites-available/default

Abriremos un "bloque" llamado server con corchetes. Dentro, indicaremos el puerto por el que escuchamos y la raíz del servidor. Además, indicaremos el orden de prioridad de los archivos index. Primero PHP y luego HTML. También indicaremos el nombre de dominio. Las líneas acaban con ';'.

server { listen 80; root /var/www/wordpress; index index.php index.html index.html; server_name tutorialvps.tk www.tutorialvps.tk; }

Si os fijáis, he añadido 'www' como prefijo al dominio, pero sin embargo, si abro la URL con estas 'www', da error. Para ello, tenemos que añadir un registro CNAME en nuestros DNS. Tarda un rato en propagarse, así que paciencia.

Tras esto, tal cual nos indican en WordPress como configuración, añadimos los siguientes bloques dentro del bloque server:    location / { try_files $uri $uri/ /index.php?q=$uri&$args; } location ~ \.php$ { try_files $uri =404; fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_index index.php; include fastcgi_params; } location = /favicon.ico { log_not_found off; access_log off; } location = /robots.txt { allow all; log_not_found off; access_log off; } location ~ /\. { deny all; } location ~* /(?:uploads|files)/.*\.php$ { deny all; } El archivo quedará finalmente de la siguiente manera: server { listen 80; root /var/www/wordpress; index index.php index.html index.htm; server_name tutorialvps.tk www.tutorialvps.tk; location / { try_files $uri $uri/ /index.php?q=$uri&$args; } location ~ \.php$ { try_files $uri =404; fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_index index.php; include fastcgi_params; } location = /favicon.ico { log_not_found off; access_log off; } location = /robots.txt { allow all; log_not_found off; access_log off; } location ~ /\. { deny all; } location ~* /(?:uploads|files)/.*\.php$ { deny all; } ####### PHPMYADMIN ####### } He dejado un pequeño hueco para cuando tengamos que instalar phpMyAdmin. En él irá la configuración correspondiente en los siguientes tutoriales.

Paso 6 - Eliminar Apache del servidor

A continuación eliminaremos Apache del servidor para dejar paso a Nginx. Para ello, tenemos que ver qué paquetes dependen de Apache. Esto lo hacemos con el siguiente comando:

# dpkg --get-selections | grep apache Eliminaremos los paquetes que nos haya devuelto la terminal con: # apt-get remove --purge nombredelpaquete A mí me ha devuelto: root@tutorialvps:~# dpkg --get-selections | grep apache apache2-mpm-prefork                             install apache2-utils                                   install apache2.2-bin                                   install apache2.2-common                                install libapache2-mod-auth-mysql                       install libapache2-mod-php5                             install libapache2-mod-wsgi                             install Así que introduciré lo siguiente: # apt-get remove --purge apache2-mpm-prefork apache2-utils apache2.2-bin apache2.2-common libapache2-mod-auth-mysql libapache2-mod-php5 libapache2-mod-wsgi Finalmente, nos desharemos de las dependencias que ya no necesitemos y reiniciar el servicio de Nginx: # apt-get autoremove# service nginx restart

Paso 7 - Testear la configuración

Ahora tenemos que ver si todo lo que hemos hecho funciona. Para ello, crearemos un archivo index.html y otro info.php. Con ellos, comprobaremos si el servidor funciona bien y si PHP responde como debe hacerlo.

# nano /var/www/wordpress/index.html Introducimos el siguiente contenido: <html> <head> <title>Geeky Theory mola mucho!</title> </head> <body> <h1>Hey! Geeky Theory mola mucho!</h1> </body> </html>

Tras esto probamos PHP: # nano /var/www/wordpress/info.php Introducimos el siguiente contenido: <? phpinfo(); ?>

Ahora vamos a comprobar si el archivo index.php tiene prioridad sobre index.html. Para ello, renombramos info.php a index.php: # mv /var/www/wordpress/info.php /var/www/wordpress/index.php

¡Funciona perfecto! Si no va bien, tenéis que refrescar la caché pulsando CTRL+F5. Bien, vamos a ir acabando ya esta parte del tutorial. Comprobad si os funciona el correo electrónico (https://tutorialvps.tk/mail).

No funciona, ¿verdad? Que no cunda el pánico. Esto se debe a que hemos eliminado Apache y el servicio iRedMail funciona con él. En el siguiente tutorial realizaremos la configuración para poder utilizar el correo electrónico con Nginx.

¡Un saludo!

Si queréis registraros en Digital Ocean para tener vuestro VPS, haced click en este botón:

[button link='https://www.digitalocean.com/?refcode=635dcf868b93' size='large' color='blue' target='blank']Digital Ocean[/button]