Información blog

Linux, tutoriales, noticias, sistemas, redes y seguridad informática, entre otras cosas.

viernes, 11 de septiembre de 2015

Cómo combinar Apache2 y Nginx

Más de una vez he hablado de las bondades que ofrece Apache, ya sea por su involucramiento en un servidor LAMP o por la necesidad de usarlo para utilidades tales como Nagios; pero hoy me gustaría ir un poco más allá, pues aunque Apache es de momento el servidor web más usado del mundo y el más famoso de todos, no por ello significa que sea la única o mejor opción... La falta de publicidad de las otras alternativas hace que más de uno piense únicamente en Apache como servidor web, si bien también existen otras opciones. 

Una de ellas que está creciendo notablemente estos últimos años es Nginx; cuya principal virtud es su poco uso de recursos (especialmente de RAM), pero que carece de módulos para servir contenido dinámico (ya sea con php, python...) ; razón por la que en muchos casos es descartado... Eso no significa que sea peor que Apache, sino que habría que considerarlo como una alternativa, pues Apache aunque se caracteriza por ser una utilidad muy completa y robusta, consume mucha RAM en comparación con su competidor.

Viendo esto podemos deducir que Apache podría considerarse la opción completa pero pesada, mientras que Nginx se podría considerar ligero pero no tan completo; con lo que... ¿Por qué no combinar las virtudes de cada utilidad? ¿Es decir, por qué no combinar la ligereza de Nginx con la potencia de Apache? Esto puede parecer complicado de realizar, pero en verdad no lo es tanto.
nginx&apache
Instalando los requisitos

Obviamente si queremos proponernos tener este entorno deberemos tener instalados tres paquetes: Apache2, Nginx y php5; paquetes que se pueden encontrar sin ningún problema en los repositorios oficiales con lo que simplemente habría que escribir:

  1. apt-get install nginx apache2 php5

Combinando los servidores

Ahora que poseemos los servidores preparados, ahora llegaría el turno de combinarlos ya que ahora mismo los dos quieren escuchar en el mismo puerto (aunque solo el primero en arrancar lograría hacerlo) y ambos quieren ser los primeros en todo. En este caso lo que queremos es que todo el mundo se dirija primero a Nginx, y que en caso de que no puedan cargar el contenido (debido a que se trata de algo programado en php por ejemplo) seríamos redirigidos a Apache para poder cargar dicho contenido, usando Apache únicamente cuando fuese necesario y optimizando el uso de la memoria RAM.

Comenzaríamos configurando Nginx y cambiando algunos parámetros que tiene establecidos por defecto éste; pues ahora mismo está configurado para funcionar "a su manera" cuando en verdad queremos que trabaje en equipo con Apache. Para ello necesitaremos dirigirnos a la carpeta /etc/nginx/sites-available y editar el único fichero que tenemos allí disponible; es decir el fichero default.

En dicho fichero habría que configurar los parámetro por defecto (o mejor aún, borrar todo el contenido) y sustituir el contenido por el que pongo a continuación, teniendo cuidado a la hora de establecer el server_name.

  1. server {
  2.         listen   80;
  3.         root /var/www;
  4.         index index.php index.html index.htm;
  5.         # Make site accessible from http://localhost/
  6.         server_name 192.168.1.7;
  7.         location / {
  8.                 try_files $uri $uri/ /index.php;
  9.         }
  10.         location /doc/ {
  11.                 alias /usr/share/doc/;
  12.                 autoindex on;
  13.                 allow 127.0.0.1;
  14.                 allow ::1;
  15.                 deny all;
  16.         }
  17.         location ~ \.php$ {
  18.                 proxy_set_header X-Real-IP  $remote_addr;
  19.                 proxy_set_header X-Forwarded-For $remote_addr;
  20.                 proxy_set_header Host $host;
  21.                 proxy_pass http://192.168.1.7:8080;
  22.         }
  23.          location ~ /\.ht {
  24.                 deny all;
  25.         }
  26. }

Aquí los cambios más importantes serían 
  • La ruta establecida en root ha sido cambiado a /var/www, ruta en la que suelen guardar las páginas alojadas en apache.
  • En la sección index, es muy importante añadir el fichero index.php.
  • El módulo location ~ \.php5 está diseñado para que todo aquello que requiera php sea redirigido al puerto 8080. puerto en el que haremos que apache "escuche". En este caso se ha puesto la ip 192.168.1.7, pero puede ser cualquier otra.
  • Descomentar la sección ~/\.ht 
Lo normal suele ser que, después de esto, se cree un enlace simbólico de este fichero en /etc/nginx/sites-enabled; pero en esto caso al ser un fichero previamente creado no sería necesario.

Con el servidor Nginx preparado, faltaría preparar apache, aunque afortunadamente el cambio es mucho menor que el que hemos tenido que realizar para Nginx, ya que lo que únicamente queremos es cambiar el puerto de escucha al 8080; puerto previamente establecido en Nginx. Para ello habría que dirigirse al directorio /etc/apache2/sites-available/ y configurar el fichero default... Como podéis ver la estructura de datos entre un servidor web y otro difieren poco en este aspecto, con lo que si poseéis nociones es básicas del funcionamiento de uno de los dos servidores web, no os sentiréis demasiado perdidos. En este fichero solo habría que cambiar el parámetro VirtualHost, el cual tendría que estar escuchando en el puerto 8080, tal y como muestro a continuación:

  1. <VirtualHost *:8080>

Con este cambio realizado, únicamente faltaría reiniciar ambos servicios; reiniciando primero apache para que así el puerto 80 quede libre para Nginx:

  1. /etc/init.d/apache2 restart
  2. /etc/init.d/nginx restart

Con esto ya tendríamos nuestro Nginx escuchando en el puerto 80 y redirigiendo todas las peticiones php al puerto 8080 en el cual está escuchando apache ahora, logrando la combinación de ambos servicios.

Espero que os haya resultado útil.

Saludos.

No hay comentarios :

Publicar un comentario