NGINX, a més d'utilitzar-se com a servidor web estàtic o dinàmic, disposa d'altres característiques desenvolupades com la majoria de servidors web. Ofereix la funcionalitat de servidor intermediari invers, també anomenat servidor de pas. A més, aquesta funció permet configurar un escenari d'equilibratge de càrrega per distribuir el trànsit per a la disponibilitat, l'escalabilitat i el rendiment.
Un servidor intermediari invers rep les peticions, generalment de clients web, i recupera i serveix els recursos d'un o més servidors. En aquest article t'ensenyem com configurar un servidor intermediari invers amb NGINX utilitzant un únic servidor web Apache amb FastCGI per a la interconnexió i així poder atendre més peticions simultànies.
Què és i com funciona el servidor intermediari invers?
Un servidor de pas o intermediari no genera contingut ni allotja dades; en lloc d'això, el contingut s'obté dels servidors Backend, que normalment tenen connexió directa amb xarxes internes. Per exemple, en un escenari web, quan un servidor intermediari rep trànsit d'un client, fa la petició a un d'aquests servidors Backend perquè la gestioni, generi el contingut i li proporcioni una resposta; aleshores, el servidor intermediari reenvia la resposta al client.
Hi ha múltiples raons per implementar aquesta funció, entre les quals hi ha la seguretat, l'alta disponibilitat, l'equilibratge de càrrega i la centralització de l'autorització. Normalment, en aquestes implementacions, l'arquitectura i el disseny de la infraestructura dels servidors Backend solen estar aïllats/protegits de l'exterior (DMZ); l'única connexió hauria de ser amb el servidor intermediari (que rep i proporciona la resposta al client).
Instal·lació i configuració del servidor web (Apache)
Primer, actualitza els repositoris i els paquets:
# apt update && apt upgrade -yDesprés, instal·la apache i PHP:
# apt install apache2 php-fpm php-curl php-dompdf php-mbstring php-imagick php-zip php-gd -yNormalment s'utilitza el mòdul fcgi del mateix repositori d'Ubuntu, però està desactualitzat:
# apt show libapache2-mod-fcgidPer tant, pots utilitzar FastCGI amb una versió més actualitzada que està disponible al repositori GitHub de FastCGI-Archives. Per fer-ho, primer executa l'ordre següent per instal·lar uns paquets necessaris:
# apt install unzip build-essential apache2-dev gcc make m4 autoconf automake libtool -yDesprés descarrega el codi comprimit:
# cd /tmp/ && wget https://github.com/FastCGI-Archives/fcgi2/archive/refs/heads/master.zipDescomprimeix-lo i accedeix al directori:
# unzip master.zip && cd fcgi2-master/Configura'l:
# ./autogen.sh && ./configureI instal·la'l:
# make && make installPosteriorment, descarrega també el mòdul de rpaf per a les capçaleres:
# cd /tmp/ && wget https://github.com/gnif/mod_rpaf/archive/stable.zipDesprés, descomprimeix-lo, accedeix al directori descomprimit i instal·la'l també:
# unzip stable.zip && cd mod_rpaf-stable && make && make installPer carregar-lo, crea el fitxer:
# vi /etc/apache2/mods-available/rpaf.loadAmb el contingut següent:
LoadModule rpaf_module /usr/lib/apache2/modules/mod_rpaf.soCrea també un altre fitxer per a la configuració:
# vi /etc/apache2/mods-available/rpaf.confAmb aquest contingut (IMPORTANT: Modifica l'adreça IP):
<IfModule mod_rpaf.c>
RPAF_Enable On
RPAF_Header X-Real-Ip
RPAF_ProxyIPs DIRECCION_IP
RPAF_SetHostName On
RPAF_SetHTTPS On
RPAF_SetPort On
</IfModule>Ara activa'ls i també els mòduls següents:
# a2enconf php7.4-fpm && a2enmod rpaf actions proxy_fcgi setenvif cache cache_disk expires headersDesprés, modifica el port per defecte d'Apache del 80 al 8080:
# vi /etc/apache2/ports.confI també desactiva el lloc per defecte:
# a2dissite 000-defaultDesprés copia el fitxer del lloc per defecte (modifica la destinació de l'exemple):
# cp /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/ejemplo.es.confEdita el fitxer del lloc copiat amb un editor de text:
# vi /etc/apache2/sites-available/ejemplo.es.confPer modificar el port, canvia "<VirtualHost *:80>" per "<VirtualHost *:8080>" i canvia el valor de ServerName pel FQDN en qüestió:
<VirtualHost *:8080>
ServerName ejemplo.es
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html/
CacheQuickHandler off
CacheLock on
CacheLockPath /tmp/
CacheIgnoreHeaders Set-Cookie
<Location />
CacheEnable disk
CacheHeader on
CacheDefaultExpire 800
CacheMaxExpire 64000
CacheIgnoreNoLastMod On
ExpiresActive on
ExpiresDefault A300
</Location>
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
Desa els canvis realitzats, surt de l'editor i després activa el lloc:
# a2ensite ejemplo.es.confComprova que la configuració del servei Apache sigui correcta:
# apachectl -tI, si ho és, torna a carregar la configuració reiniciant el servei Apache:
# systemctl restart apache2Després pots comprovar que estigui escoltant pel port modificat:
# ss -tlpn sport :8080I també crear un fitxer d'informació de PHP per fer una prova per comprovar el FastCGI:
# echo "<?php phpinfo(); ?>" | tee /var/www/html/info.phpInstal·lació i configuració d'un servidor intermediari invers amb NGINX
Primer instal·la NGINX i Certbot per obtenir un certificat SSL amb Let's Encrypt:
# apt install nginx python3-certbot-nginxPosteriorment, crea el directori per a la memòria cau de NGINX:
# mkdir -p /var/lib/nginx/cache && chown www-data /var/lib/nginx/cache && chmod 700 /var/lib/nginx/cacheElimina el lloc per defecte:
# rm /etc/nginx/sites-enabled/defaultCrea el fitxer per al lloc que utilitzaràs (modifica l'exemple):
# vi /etc/nginx/sites-available/ejemplo.esAmb el contingut següent (modifica el server_name d'exemple):
proxy_cache_path /var/lib/nginx/cache levels=1:2 keys_zone=nginx_cache:8m max_size=50m;
proxy_cache_key "$scheme$request_method$host$request_uri$is_args$args";
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;
server {
listen 80;
server_name ejemplo.es;
location / {
proxy_pass http://[::1]:8080;
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-Forwarded-Proto $scheme;
proxy_cache nginx_cache;
proxy_cache_bypass $http_upgrade;
proxy_buffering on;
proxy_buffer_size 32k;
proxy_buffers 16 16k;
proxy_busy_buffers_size 32k;
proxy_max_temp_file_size 0;
proxy_temp_file_write_size 32k;
gzip on;
gzip_min_length 1000;
gzip_comp_level 5;
gzip_proxied any;
gzip_vary on;
gzip_types
text/css
text/javascript
text/xml
text/plain
text/x-component
application/javascript
application/json
application/xml
application/rss+xml
font/truetype
font/opentype
application/vnd.ms-fontobject
image/svg+xml;
add_header X-Proxy-Cache $upstream_cache_status;
add_header Strict-Transport-Security 'max-age=31536000; includeSubDomains; preload';
add_header X-Frame-Options SAMEORIGIN;
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";
add_header X-Cache-Status $upstream_cache_status;
add_header X-Powered-By 'Clouding';
}
location ~ /\.ht {
deny all;
}
}Crea un enllaç simbòlic del lloc disponible al directori de llocs actius:
# ln -s /etc/nginx/sites-available/ejemplo.es /etc/nginx/sites-enabled/ejemplo.esFinalment, reinicia el servei NGINX:
# systemctl restart nginx.servicePosteriorment, també pots utilitzar Certbot, que has instal·lat abans, per obtenir el certificat i configurar automàticament nginx:
# certbot --nginx --redirect -d ejemplo.esAddicionalment, si tens problemes de contingut mixt, pots modificar la configuració d'Apache. Per fer-ho, edita el fitxer de configuració:
# vi /etc/apache2/apache2.confI afegeix al final:
<IfModule mod_setenvif.c>
SetEnvIf X-Forwarded-Proto "^https$" HTTPS
</IfModule>Prova de rendiment
Com pots comprovar amb la prova següent, que compara un servidor Plesk amb la mateixa configuració amb un servidor configurat amb aquestes característiques, aquest últim ofereix un temps de resposta millor.
Servidor Plesk amb servidor intermediari NGINX (memòria cau habilitada) amb PHP 7.4 servit per FastCGI amb Apache:
Running 30s test @ https://plesk.ejemplo.es/info.php
12 threads and 50 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 87.18ms 93.88ms 1.49s 95.08%
Req/Sec 51.35 32.85 646.00 96.83%
17578 requests in 30.07s, 1.70GB read
Socket errors: connect 0, read 0, write 0, timeout 33
Requests/sec: 584.66
Transfer/sec: 57.87MBServidor configurat mitjançant aquest article:
Running 30s test @ https://proxy.ejemplo.es/info.php
12 threads and 50 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 59.98ms 27.89ms 1.17s 96.40%
Req/Sec 66.73 12.59 150.00 60.93%
24035 requests in 30.10s, 1.70GB read
Requests/sec: 798.56
Transfer/sec: 57.78MBProva realitzada amb la configuració PHP següent en tots dos servidors:
pm.max.children 26
pm.start_servers 0
pm.min_spare_servers 2
pm.max_spare_servers 8Ho has provat? Deixa'ns els teus comentaris! 🙂