En la entrada de hoy voy a explicar cómo desplegar el entorno bautizado como «NAMP» por mi compañero Ismael Ramos.

Este entorno consiste en un servidor Web Nginx que escuchará las peticiones Web en el puerto 80 y cacheará y redirigirá las mismas a un servidor Web Apache, que estará ejecutando el PHP con PHP-FPM 7.2.

Este entorno da un rendimiento y seguridad espectaculares y a mi opinión es el tipo de plataforma que se debería montar hoy en día en servidores web sin balanceo (un único frontal).

Primeros pasos:

 

Partimos de la base de que el entorno se va a desplegar en un servidor CentOS 7, el ejemplo es extensible a Debian/Ubuntu pero tendréis que adecuar los paquetes que se instalan entre otras cosas.

Primeramente, instalaremos Apache junto a sus módulos principales:

yum install httpd mod_proxy_uwsgi mod_fcgid mod_ssl

Seguidamente, como vamos a usar PHP 7.2, instalaremos la misma, para ello, instalamos el repo de remi, instalamos las yum utils, habilitamos el repo de php72 de remi y procedemos a instalar los paquetes de PHP 7.2. ¡Especial importancia a instalar PHP-FPM!

#Instalamos los repos necesarios
yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
yum install http://rpms.remirepo.net/enterprise/remi-release-7.rpm

#Instalamos las yum utils
yum install yum-utils

#Habilitamos el repo php72
yum-config-manager --enable remi-php72  

#Instalamos PHP
yum install php php-mcrypt php-cli php-gd php-curl php-mysql php-ldap php-zip php-fileinfo php-fpm

Por último, nos quedaría instalar nginx:

yum install nginx

Preparación del entorno:

 

Bien, ahora que tenemos todo instalado, lo primero es preparar el entorno en el que vamos a desplegar nuestra plataforma «NAMP». Esto incluye crear los usuarios y sus directorios y ajustar permisos de los mismos. Como estamos haciendo un ejemplo, vamos a suponer la creación de la web prueba.midominio.com con el usuario prueba.

#Añadimos el usuario prueba y le damos una contraseña.
adduser prueba
passwd prueba
# Creamos el document root de la web y la carpeta de logs
mkdir –p /var/www/vhosts/prueba.midominio.com/httpdocs
mkdir –p /var/www/vhosts/prueba.midominio.com/logs

# Ahora, cambiamos el owner del document root y los logs
chown –R prueba:prueba /var/www/vhosts/prueba.midominio.com/

Por último, quedaría editar el fichero passwd para cambiar el home del usuario prueba al de la ruta /var/www/vhost/prueba.midominio.com.

La línea debería quedar más o menos así:

prueba:x:1000:1000::/var/www/vhosts/prueba.midominio.com:/bin/bash

Configuración de PHP-FPM:

 

Ahora procederemos a configurar PHP-FPM. Tras instalar PHP-FPM, se nos ha generado una ruta en /etc/php-fpm.d/ dentro de la cual tenemos un pool por defecto llamado www.conf.

Lo primero que vamos a hacer es mover el pool por defecto a .back y generaremos el nuestro propio:

mv /etc/php-fpm.d/www.conf /etc/php-fpm.d/www.back

Seguidamente, generamos nuestro pool:

vim /etc/php-fpm.d/prueba.conf

Con el contenido:

[prueba.midominio.com]
user = prueba
group = prueba
listen = /var/www/vhosts/prueba.midominio.com/php-fpm.sock
listen.owner = apache
listen.group = apache
listen.mode = 0660
listen.allowed_clients = 127.0.0.1
pm = dynamic
pm.max_children = 50
pm.min_spare_servers = 5
pm.max_spare_servers = 35
php_value[session.save_handler] = files
php_value[session.save_path]    = /var/lib/php/session
php_value[soap.wsdl_cache_dir]  = /var/lib/php/wsdlcache

Fijaros en que indicamos un nombre para el pool entre los corchetes. Con las variable user y group indicamos que usuario y grupo ejecutarán el pool y el PHP, después, con listen, indicamos donde se ubicará el socket de FPM.

Configuración de Apache:

 

Bien, ahora pasamos a configurar Apache. Lo primero de todo, como vamos a utilizar PHP-FPM como handler del PHP, no podemos utilizar Prefork como MPM de Apache, por lo que tendremos que cambiar el MPM a Event.

Para ello, editamos el fichero /etc/httpd/conf.modules.d/00-mpm.conf y comentamos la línea de prefork y descomentamos la de event,  el fichero debe quedar con un contenido similar a este:

#LoadModule mpm_prefork_module modules/mod_mpm_prefork.so

LoadModule mpm_event_module modules/mod_mpm_event.so

Seguidamente, vamos a cambiar los puertos de escuchar de Apache a los puertos 7080 y 7081, pues Nginx será quien escuche en el puerto 80 y 443.

Para ello, editamos el fichero /etc/httpd/conf/httpd.conf y cambiamos las líneas «Listen» por las siguientes:

Listen 7080
Listen 7081

Ahora, vamos a crear nuestro virtualhost de prueba.midominio.com.  Para ello, creamos el fichero /etc/httpd/conf.d/prueba_vhost.conf con el siguiente contenido:

#Declaramos el Virtualhost para 7080 (Sin HTTP) en nuestra IP
<VirtualHost 192.168.1.102:7080 >
#Declaramos el nombre al que escuchará el VH
        ServerName "prueba.midominio.com:80"
        ServerAlias "www.prueba.midominio.com"
        UseCanonicalName Off
#Declaramos el DocumentRoot y los Logs
        DocumentRoot "/var/www/vhosts/prueba.midominio.com/httpdocs"
        CustomLog /var/www/vhosts/prueba.midominio.com/logs/access_log custom
        ErrorLog "/var/www/vhosts/prueba.midominio.com/logs/error_log"
#Indicamos el usuario que ejecutará el sitio.
        <IfModule mod_suexec.c>
                SuexecUserGroup "prueba" "prueba"
        </IfModule>
         <IfModule mod_ssl.c>
                SSLEngine off
        </IfModule>
#Importante, aquí indicamos que ejecute el PHP con el socket de PHP-FPM
        <Directory /var/www/vhosts/prueba.midominio.com>
	<IfModule mod_proxy_fcgi.c>
                        <Files ~ (\.php$)>
                                SetHandler proxy:unix:///var/www/vhosts/prueba.midominio.com/php-fpm.sock|fcgi://127.0.0.1:9000
                        </Files>
                </IfModule>
                Options -Includes +ExecCGI
        </Directory>
               <Directory /var/www/vhosts/prueba.midominio.com/>
                Options +FollowSymLinks
        </Directory>
        DirectoryIndex "index.html" "index.cgi" "index.pl" "index.php" "index.xhtml" "index.htm" "index.shtml"
        <Directory /var/www/vhosts/prueba.midominio.com/>
                AllowOverride AuthConfig FileInfo Indexes Limit Options=Indexes,SymLinksIfOwnerMatch,MultiViews,FollowSymLinks,ExecCGI,Includes,IncludesNOEXEC
        </Directory>
</VirtualHost>

 

Configuración de NGINX:

 

El siguiente paso es configurar Nginx para que escuche las peticiones web de nuestro dominio prueba.midominio.com y las pase a Apache.

Para ello, primero de todo, editaremos el fichero /etc/nginx/nginx.conf y comentaremos el virtualhost que Nginx genera por defecto, es aquel que está contenido dentro de las variables Server {}. Deberíamos dejar el fichero comentado similar a esto:

#    server {
#        listen       80 default_server;
#        listen       [::]:80 default_server;
#        server_name  _;
#        root         /usr/share/nginx/html;
        # Load configuration files for the default server block.
#        include /etc/nginx/default.d/*.conf;
#        location / {
#        }
#        error_page 404 /404.html;
#            location = /40x.html {
 #       }
#        error_page 500 502 503 504 /50x.html;
#            location = /50x.html {
#        }
#    }

Ahora, vamos a crear, como hicimos en Apache, un virtualhost en Nginx para el dominio. Para ello, creamos el fichero  /etc/nginx/conf.d/prueba.conf y añadimos:

#Establecemos la ruta en la que se depositara la caché de Nginx, su duración, su tamaño y su nivel de cache
proxy_cache_path  /var/nginx/cache  levels=1:2    keys_zone=STATIC:10m
    inactive=24h  max_size=1g;
#Abrimos directiva server para generar virtualhost, su nombre e IP:puerto
server {
    listen 192.168.1.102:80 default_server;
    server_name prueba.midominio.com;
#Indicamos que caché el contenido estático.
 location / {
                proxy_pass http://192.168.1.102:7080;
                proxy_set_header Host             $host;
                proxy_set_header X-Real-IP        $remote_addr;
                proxy_set_header X-Forwarded-For  $proxy_add_x_forwarded_for;
                proxy_set_header X-Accel-Internal /internal-nginx-static-location;
	     proxy_buffering        on;
                proxy_cache            STATIC;
                proxy_cache_valid      200  1d;
                add_header X-Cache-Status $upstream_cache_status;
        }
 location @fallback {
                proxy_pass http://192.168.1.102:7080;
                proxy_set_header Host             $host;
                proxy_set_header X-Real-IP        $remote_addr;
                proxy_set_header X-Forwarded-For  $proxy_add_x_forwarded_for;
                access_log off;
        }
 location ~ ^/(.*\.(ac3|avi|bmp|bz2|css|cue|dat|doc|docx|dts|eot|exe|flv|gif|gz|htm|html|ico|img|iso|jpeg|jpg|js|mkv|mp3|mp4|mpeg|mpg|ogg|pdf|png|ppt|pptx|qt|rar|rm|svg|swf|tar|tgz|ttf|txt|wav|woff|woff2|xls|xlsx|zip))$ {
                try_files $uri @fallback;
        }
}

Ahora solo nos queda generar el directorio donde se va a depositar la caché:

mkdir –p /var/nginx/cache

Y ahora vamos a activar la comprensión GZIP mediante Nginx, para ello, generamos un fichero de configuración:

vim /etc/nginx/conf.d/gzip.conf

Y añadimos:

gzip on;
gzip_comp_level 9;
gzip_http_version 1.1;
gzip_proxied any;
gzip_min_length 10;
gzip_vary on;
gzip_buffers 16 8k;
gzip_types text/plain application/javascript application/x-javascript text/javascript text/xml text/css application/xml application/xml+rss application/xhtml+xml image/svg+xml image/x-icon image/bmp image/png image/gif;

 

Ajuste final:

 

Ahora mismo nuestro entorno funcionaría, pero nos queda un último paso y es instalar el módulo mod_rpaf para Apache, que nos permitirá realizar un forward de las IPs desde Nginx, en otras palabras, en los logs de Apache y el server status observaremos la IP real del visitante en lugar de la IP del propio servidor (pues nginx pasa la petición a Apache).
Para ello, habilitamos el repo del módulo:

vim /etc/yum.repos.d/nux-misc.repo

Con el siguiente contenido:

[nux-misc]
name=Nux Misc
baseurl=http://li.nux.ro/download/nux/misc/el7/x86_64/
enabled=0
gpgcheck=1
gpgkey=http://li.nux.ro/download/nux/RPM-GPG-KEY-nux.ro

Instalamos el módulo desde dicho repo:

yum --enablerepo=nux-misc install mod_rpaf

Y ahora editamos el fichero de configuración del módulo para habilitarlo:

vim /etc/httpd/conf.d/mod_rpaf.conf
LoadModule rpaf_module modules/mod_rpaf.so

<IfModule rpaf_module>
RPAF_Enable       On
RPAF_ProxyIPs     192.168.1.102
RPAF_Header       X-Forwarded-For
RPAF_SetHostName  On
RPAF_SetHTTPS     On
RPAF_SetPort      On
</IfModule>

 

Ahora si, paso final.

 

¿Que nos queda? Comprobar nuestra sintaxis y reiniciar servicios.

Comprobad mediante Apachectl -S y Nginx -T que vuestra sintaxis es correcta y no hayáis cometido fallos.

Si todo está bien, proceded con el reinicio de servicios:

systemctl restart php-fpm.service 
systemctl restart nginx.service
systemctl restart httpd.service

Y mediante un cURL podremos comprobar que nuestra caché está activa (Nota, el primer cURL no cacheará, lanzad el mismo dos veces pues cuando se genere la segunda petición ya si habrá generado la caché):

curl prueba.midominio.com -s -I -H "secret_header:true"
HTTP/1.1 200 OK
Server: nginx/1.12.2
Date: Sun, 01 Jul 2018 08:43:43 GMT
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
Vary: Accept-Encoding
X-Powered-By: PHP/7.2.6
Link: <http://prueba.midominio.com/index.php?rest_route=/>; rel="https://api.w.org/"
X-Cache-Status: HIT

Como podéis ver, la caché está activa por la cabecera X-Cache-Status: HIT

 

¡Espero que os sirva!

 


0 comentarios

Deja una respuesta

Marcador de posición del avatar

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *