Hola amigas y amigos. Hoy os voy a hablar de un tema que hace tiempo que quería probar. Os explico un poco. Hace años que trabajo con servidores web. Mis primeras experiencias fueron con Apache, el servidor web número uno en el mundo, quizá uno de los más estables y versátiles. Con el paso del tiempo, es cierto, no me terminaba de gustar el uso que hacía de la memoria, teniendo en cuenta que en mis servidores personales no disponía de muchos recursos por un tema económico evidente. Finalmente me decidí a cambiar a Nginx, que por aquel entonces (al igual que ahora) tenía buena fama en su relación rendimiento/recursos. Y hasta ahora he estado muy contento. Pero pasa que el sistema se puede exprimir aún más, creo yo, y ahí tenemos la idea del artículo.

Tal y como he comentado, Apache es muy potente, pero no termina de jugar bien con la memoria. En cambio Nginx tiene problemas con el contenido dinámico (es genial para el estático), ya que necesita módulos como php-fpm para hacerlo funcionar. Sabiendo esto, ¿por qué no hacemos que trabajen juntos? De esta manera aprovechamos sus potenciales y solapamos sus carencias.

Para el artículo me he servido de Ubuntu Server en su versión 16.04. Creo que es bastante común en usuarios domésticos, es cierto. En entornos corporativos no se suele utilizar, pero creo que nos irá bien gracias a su facilidad de uso. Existen múltiples guías en Internet sobre su instalación en una máquina virtual local o un VPS.

Esquema funcionamiento reverse proxy

El primer paso es instalar el servidor web Nginx, previa actualización de nuestro sistema.

sudo apt update
sudo apt upgrade
sudo apt install nginx

Una vez instalado, debemos crear el siguiente fichero de configuración:

sudo nano /etc/nginx/sites-available/team.ochobitsunbyte.pw

El nombre del fichero es el que utilizo para este artículo. Cada cual que use el que más le guste. Su contenido es el siguiente:


Y añadimos:

  • En el apartado root debemos indicar la correcta ubicación del proyecto.
  • Con ‘try_files’ el servidor Nginx intentará servir cualquier página, si no puede el fichero se enviará al proxy.
  • Con ‘proxy_pass’ indicamos al servidor dónde tendrá que dirigirse a la dirección del proxy.
  • Finalmente con ‘location ~ /\.ht’ bloqueamos el acceso vía web a los ficheros .htaccess.
  • Con esta configuración todas las extensiones que acaben en php, serán reenviadas al backend, que Apache ejecutará en el puerto 8080.

Para activar el Virtual Host escribimos:

sudo ln -s /etc/nginx/sites-available/team.ochobitsunbyte.pw /etc/nginx/sites-enabled/team.ochobitsunbyte.pw

Y eliminamos el fichero de configuración por defecto:

sudo rm /etc/nginx/sites-enabled/default

Ok, pues continuemos, ahora vamos a instalar el servidor Apache.

Primero de todo, instalamos Apache más varias librerías que necesita:

sudo apt -y install apache2 libapache2-mod-fastcgi php-fpm

Ahora editamos el fichero ports.conf, donde cambiaremos el puerto 80 por el puerto 8080. Hay que hacerlo porque el puerto 80 lo utiliza Nginx.

sudo nano /etc/apache2/ports.conf

Y añadimos:

NameVirtualHost 127.0.0.1:8080
Listen 127.0.0.1:8080

Guardamos y pasamos a copiar el fichero que viene por defecto de configuración de Apache por uno nuestro:

sudo cp /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/team.ochobitsunbyte.pw.conf

Lo editamos:

sudo nano team.ochobitsunbyte.pw.conf

Modificamos el puerto del Virtual Host:

VirtualHost *:8080

Además de añadir el nombre de nuestro dominio.

Guardamos y reiniciamos Apache:

systemctl restart apache2.service

Comprobamos que ha cambiado el puerto, escribiendo:

sudo netstat -tlpn

Tal y como se muestra en la imagen:


Si os fijáis, anteriormente hemos instalado el módulo de Apache ‘fastcgi’, ahora nos toca habilitarlo. El primer paso es deshabilitar el módulo php7.0 (si lo tuviésemos instalado):

sudo a2dismod php7.0

A continuación vamos a agregar un bloque de configuración para mod_fastcgi, que depende a su vez de mod_action. Este último está deshabilitado por defecto, por lo que nos toca habilitarlo.

sudo a2enmod actions

Vamos a modificar el fichero de configuración del módulo, añadiendo unas líneas adicionales:

sudo nano /etc/apache2/mods-enabled/fastcgi.conf

Son las siguientes, a partir de la etiqueta<IfModule mod_fastcgi.c>, añadimos:

AddType application/x-httpd-fastphp .php
Action application/x-httpd-fastphp /php-fcgi
Alias /php-fcgi /usr/lib/cgi-bin/php-fcgi
FastCgiExternalServer /usr/lib/cgi-bin/php-fcgi -socket /run/php/php7.0-fpm.sock -pass-header Authorization
<Directory /usr/lib/cgi-bin>
Require all granted
</Directory>

Guardamos el fichero y salimos.

Con el siguiente comando comprobaremos la configuración:

sudo apachectl -t

Ahora, para finalizar, vamos a crear un fichero dentro de /var/www/html/team.ochobitsunbyte.pw, llamado info.php, que nos permitirá comprobar la configuración de PHP:

nano /var/www/html/team.ochobitsunbyte.pw/info.php

Con el siguiente contenido:

<?php

phpinfo();

?>

Una vez hecho esto, en la web veremos la siguiente información:

Se nos muestra información detallada de la configuración del servidor, indicando librerías, servicios, ubicación de ficheros y directorios, además del uso de puertos.

Espero que haya sido de vuestro interés. Es cierto que quedan cosas pendientes, como habilitar https o el caché, por ejemplo. ¿Habéis probado alguna vez un esquema similar? ¿Era muy diferente al de este artículo? ¿Qué mejorarías?

Nos leemos en la próxima.

Os adjunto un serie de enlaces que me han servido para crear el artículo:

NGINX reverse proxy

How to configure Nginx as a Web Server and Reverse Proxy for Apache one Ubuntu 16.04

0 0 votos
Article Rating
Subscribe
Notificarme de
guest

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

9 Comments
más antiguo
más nuevo más votado
Reacciones en línea
Ver todos los comentarios
bmontoyaIT

Buenas tardes David,
Muy interesante el artículo, entiendo que esto es aplicable también a otras extensiones como asp, incluso se podrían redirigir a otros servidores; IIS, etc.

Tengo cierta experiencia con apache2 , pero nginx lo he usado poco, sobre todo como proxy inverso. Es muy interesante poder utilizar nginx para todo lo estático y utilizarlo como proxy solo para contenido dinámico. Este sistema sobre contenedores permitiría tener mucha flexibilidad en un único servidor sin los problemas típicos de tener demasiados servicios sobre la misma máquina física.

Estaría bien que hicieras una segunda parte intentando optimizar al máximo el funcionamiento de nginx y apache2. Se me ocurre que tener 2 programas como estos cacheando puede llegar a ser contraproducente para el rendimiento, o consumir demasiada RAM.

Gracias por el trabajo.

frk7z

Buenas david, buena guía para ir iniciándose.

Una duda, si dices que nginx tiene problemas para el contenido dinámico ya que necesita el módulo php-fpm para que funcione, y para eso usas apache, por qué instalas php-fpm en apache y no usas el módulo mod_php del mismo? Para el caso que expones no sería mejor usar fastcgi como módulo de nginx nada más y ahorrar el paso por apache?

W41N10

Aún no llego tan lejos, en mis proyectos aún uso la misma dirección para front y back pero parece es esto me servira en el futuro, gracias, de momento me parece algo extraño, ¿no se puede usar Nginx en ambas partes?

jove

Hola David, me ha gustado mucho el artículo.

Jugando con VPS yo había hecho algo parecido usando nginx como proxy inverso para ssl y redirigiendo a los backend por http.

Montado en LXC o LXD y jugando con reglas de firewall se queda un diseño chulo, con un host con lo mínimo (en mi caso ssh, firehol y lxc) y con los servicios en los contenedores incluyendo al proxy inverso.

Hago como tú: a contenedor nuevo con servicio web, fichero nuevo en sites-available y enlace en sites-enabled.
Si el backend a montar lo permite también uso nginx en lugar de apache.

Ahora he empezado a migrar a lxd y los contenedores que puedo de debian/ubuntu a alpine, queda algo minúsculo.

Un saludo.

Mediapro

Buenisimo, aplica para centos 7?