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