Compilando NGINX con modulos adicionales

Muchas veces por comodidad y/o velocidad instalamos NGINX en nuestro sistema usando un simple apt install . Luego queremos implementar o activar características en nuestro servidor web y nos damos cuenta que no podemos, porque sencillamente el NGINX que instalamos no las soporta. Les mostrare los pasos para compilar NGINX agregándole módulos adicionales, con lo cual podrán explotar mejor las bondades de este ligero y potente servidor web/proxy.

Después de una búsqueda por internet, me decidí por los siguientes módulos que a mi entender son los más usados. Si necesitan de otro que no está en la lista pueden agregárselos también.

NGINX PageSpeed: Módulo open-source que optimiza tu sitio automáticamente.

Google brotli: Brotli es una librería de compresión de datos de Google.

NGINX Cache Purge: Módulo que agrega la capacidad de purgar contenido de cachés FastCGI, proxy, SCGI y uWSGI.

NGINX Slowfs Cache: Módulo que agrega la capacidad de almacenar en caché archivos estáticos.

NGINX coolkit: Como indica su nombre es una colección de pequeños y útiles complementos de NGINX.

Headers more NGINX Module : Módulo que configura, agrega y borra encabezados de salida arbitrarios en servidores http de NGINX.

NGINX http passenger module: Ejecuta y administra sus aplicaciones Ruby, Node.js y Python en su servidor web con facilidad.

Además de estos módulos le daremos a nuestro NGINX la capacidad de soportar TLSv1.3 el nuevo estándar de OpenSSL. Todo el proceso de compilación lo hare sobre un contenedor de proxmox usando como sistema debian 9. Por lo que puede haber dependencias y paquetes que usare que para algunos no sea necesario. Tratare de minimizar lo más posible los errores de dependencia y compilación. Todo lo adicional que se instale aquí es necesario y obligatorio si usan una plantilla de Debian 9 en proxmox.

Comenzaremos creando un CT(contenedor) en proxmox usando como OS Debian 9. Las propiedades del mismo las dejo a su gusto ya que no puedo adivinar para que lo van a usar. Lo iniciamos y configuramos para el uso, ssh sourcelist etc.

apt update 
apt upgrade

En este punto recomiendo hacer una salva del contenedor.

Instalaremos estas herramientas necesarias para compilar

apt install build-essential zlib1g-dev libpcre3 libpcre3-dev unzip

Dependencias necesarias para los módulos y trabajo

apt install curl git mc htop libperl-dev libxml-libxml-perl libxml2-dev libxml2-utils python-libxml2 libxslt1.1 libxslt1-dev python-libxslt1 libxml-filter-xslt-perl libxml-libxslt-perl libgd-dev libgd-perl libgd-text-perl python-gd libgoogle-perftools4 libgoogle-perftools-dev

Ahora procedemos a instalar Passenger:

apt install dirmngr --install-recommends

apt install apt-transport-https ca-certificates

Agregamos esta entrada en nuestro sourcelist:

deb https://oss-binaries.phusionpassenger.com/apt/passenger stretch main

Importamos la llave del repositorio

con proxy
apt-key adv --keyserver-options http-proxy=http://ipproxy:port/ --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 561F9B9CAC40B2F7

sin proxy
apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 561F9B9CAC40B2F7

Seguido actualizamos nuestra paquetería e instalamos el passenger

apt update

apt install passenger passenger-dev libgeoip-dev

Para evitar el error a la hora de compilar con el módulo de pagespeed debemos instalar lo siguiente (esto me costó trabajo encontrarlo, pero les regalo el TIP)

apt install uuid-dev

Crearemos el usuario y el grupo que usara nuestro NGINX.

adduser --system --no-create-home --shell /bin/false --group --disabled-login nginx

En este punto recomiendo hacer una salva del contenedor.

Ahora procederemos a bajar todas las fuentes de los módulos y de NGINX a nuestro contendor. Personalmente como no me gusta el reguero y siempre renombro los ficheros y carpetas para un mejor entendimiento, descargare todo para la carpeta root. La carpeta root no será el destino final de las fuentes para compilar, posteriormente los moveré ya renombrados y organizados para la ubicación final. Si ustedes consideran este paso innecesario y quieren descargarlo y descompactarlos directamente donde se usarán, siéntanse libre de hacerlo.

Revisamos todas las últimas versiones tanto de los módulos como de NGINX. Los links los doy al inicio cuando describo los módulos.

Creamos una carpeta en root donde descargaremos todo.

mkdir -p /root/nginx && cd /root/nginx

Empezamos descargando la última versión estable (hasta la fecha de creación del tutorial) de NGINX.

wget http://nginx.org/download/nginx-1.14.1.tar.gz 
y descomprimimos
tar -zxvf nginx*

Creamos una carpeta dentro de nginx para depositar ahí los módulos que usaremos

mkdir -p /root/nginx/modules && cd /root/nginx/modules

MODULOS (las versiones de los módulos son las más recientes a la fecha de creación del tutorial)

1- Cache Purge

wget https://github.com/FRiCKLE/ngx_cache_purge/archive/2.3.tar.gz

mv 2.3.tar.gz ngx_cache_purge-2.3.tar.gz

tar -xvf ngx_cache_purge-2.3.tar.gz

2- Coolkit

wget https://github.com/FRiCKLE/ngx_coolkit/archive/0.2.tar.gz

mv 0.2.tar.gz ngx_coolkit-0.2.tar.gz

tar -xvf ngx_coolkit-0.2.tar.gz

3- SlowFS

wget https://github.com/FRiCKLE/ngx_slowfs_cache/archive/1.10.tar.gz

mv 1.10.tar.gz ngx_slowfs_cache-1.10.tar.gz

tar -xvf ngx_slowfs_cache-1.10.tar.gz

4- Headers More

wget https://github.com/openresty/headers-more-nginx-module/archive/v0.33.tar.gz

mv v0.33.tar.gz ngx_headers-more-v0.33.tar.gz

tar -xvf ngx_headers-more-v0.33.tar.gz

mv headers-more-nginx-module-0.33 ngx_headers-more-0.33

5- PageSpeed

NPS_VERSION=1.13.35.2-stable
wget https://github.com/pagespeed/ngx_pagespeed/archive/v${NPS_VERSION}.tar.gz
tar -xzf v${NPS_VERSION}.tar.gz
cd incubator-pagespeed-ngx-${NPS_VERSION}/
NPS_RELEASE_NUMBER=${NPS_VERSION/beta/}
NPS_RELEASE_NUMBER=${NPS_VERSION/stable/}
psol_url=https://dl.google.com/dl/page-speed/psol/${NPS_RELEASE_NUMBER}.tar.gz
[ -e scripts/format_binary_url.sh ] && psol_url=$(scripts/format_binary_url.sh PSOL_BINARY_URL)
wget ${psol_url}
tar -xzvf $(basename ${psol_url})  # extracts to psol/

rm 1.13.35.2-x64.tar.gz

mv incubator-pagespeed-ngx-1.13.35.2-stable ngx_pagespeed-1.13.35.2-stable

cd ..

rm *.gz

NOTA: Debido al bloqueo que tiene algunas páginas de Google el siguiente link no puede ser alcanzado desde cuba, por lo que tendrán que bajarlo usando otra alternativa. El fichero resultante 1.13.35.2-x64.tar.gz deberán descomprimirlo (carpeta psol) dentro de la carpeta de los fuentes de ngx_pagespeed. El resultado se muestra en la siguiente captura.

6- Brotli

mkdir -p /usr/share/nginx && cd /usr/share/nginx
mkdir -p modules && cd modules

git clone https://github.com/google/ngx_brotli.git

cd ngx_brotli/

git submodule update --init --recursive

7- OpenSSL con soporte TSL v1.3

cd /usr/share

git clone https://github.com/openssl/openssl.git 

cd openssl

git branch -a #ver las ramas disponibles

git checkout OpenSSL_1_1_1-stable

./config shared enable-tls1_3 --prefix=/usr/share/openssl --openssldir=/usr/share/openssl -Wl,-rpath,'$(LIBRPATH)'

Ahora procedemos a copiar todos los módulos a su ubicación final (/usr/share/nginx/modules/) ordenados y renombrados.

cd /root/nginx/modules/

mkdir -p /usr/share/nginx/modules/ngx_cache_purge-2.3

rsync -r /root/nginx/modules/ngx_cache_purge-2.3/* /usr/share/nginx/modules/ngx_cache_purge-2.3

mkdir -p /usr/share/nginx/modules/ngx_coolkit-0.2

rsync -r /root/nginx/modules/ngx_coolkit-0.2/* /usr/share/nginx/modules/ngx_coolkit-0.2

mkdir -p /usr/share/nginx/modules/ngx_slowfs_cache-1.10

rsync -r /root/nginx/modules/ngx_slowfs_cache-1.10/* /usr/share/nginx/modules/ngx_slowfs_cache-1.10

mkdir -p /usr/share/nginx/modules/ngx_headers-more-0.33

rsync -r /root/nginx/modules/ngx_headers-more-0.33/* /usr/share/nginx/modules/ngx_headers-more-0.33

mkdir -p /usr/share/nginx/modules/ngx_pagespeed-1.13.35.2-stable

rsync -r /root/nginx/modules/ngx_pagespeed-1.13.35.2-stable/* /usr/share/nginx/modules/ngx_pagespeed-1.13.35.2-stable

En este punto recomiendo hacer una salva del contenedor.

Finalmente vamos compilar nuestro NGINX ahora que ya tenemos todos los módulos listos.

cd /root/nginx/nginx-1.14.1/

./configure --prefix=/etc/nginx \
    --sbin-path=/usr/sbin/nginx \
    --conf-path=/etc/nginx/nginx.conf \
    --error-log-path=/var/log/nginx/error.log \
    --http-log-path=/var/log/nginx/access.log \
    --lock-path=/var/lock/nginx.lock \
    --pid-path=/var/run/nginx.pid \
    --http-client-body-temp-path=/var/lib/nginx/body \
    --http-fastcgi-temp-path=/var/lib/nginx/fastcgi \
    --http-proxy-temp-path=/var/lib/nginx/proxy \
    --http-scgi-temp-path=/var/lib/nginx/scgi \
    --http-uwsgi-temp-path=/var/lib/nginx/uwsgi \
    --user=nginx \
    --group=nginx \
    --with-debug \
    --with-file-aio \
    --with-google_perftools_module \
    --with-mail \
    --with-mail_ssl_module \
    --with-threads \
    --with-select_module \
    --with-stream \
    --with-stream_ssl_module \
    --with-http_addition_module \
    --with-http_auth_request_module \
    --with-http_dav_module \
    --with-http_flv_module \
    --with-http_geoip_module \
    --with-http_gunzip_module \
    --with-http_gzip_static_module \
    --with-http_image_filter_module \
    --with-http_mp4_module \
    --with-http_perl_module \
    --with-http_random_index_module \
    --with-http_realip_module \
    --with-http_secure_link_module \
    --with-http_stub_status_module \
    --with-http_sub_module \
    --with-http_ssl_module \
    --with-http_v2_module \
    --with-http_xslt_module \
    --with-poll_module \
    --with-openssl=/usr/share/openssl \
    --with-openssl-opt=enable-tls1_3 \
    --add-module=/usr/share/nginx/modules/ngx_brotli \
    --add-module=/usr/share/nginx/modules/ngx_pagespeed-1.13.35.2-stable \
    --add-module=/usr/share/passenger/ngx_http_passenger_module \
    --add-module=/usr/share/nginx/modules/ngx_cache_purge-2.3 \
    --add-module=/usr/share/nginx/modules/ngx_coolkit-0.2 \
    --add-module=/usr/share/nginx/modules/ngx_slowfs_cache-1.10 \
    --add-module=/usr/share/nginx/modules/ngx_headers-more-0.33

make

make install

Si todo salió bien podemos probar nuestro NGINX. Antes crearemos 2 carpetas que NGINX usara.

mkdir -p /var/lib/nginx/{body,fastcgi}

Probamos

# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Ahora crearemos el servicio de NGINX.

nano /lib/systemd/system/nginx.service

Dentro agregamos
 
[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t
ExecStart=/usr/sbin/nginx
ExecReload=/usr/sbin/nginx -s reload
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target

Arrancamos y activamos nuestro NGINX

systemctl start nginx
systemctl enable nginx

Al comprobar nuestro servicio vemos este error

service nginx status

veremos un error

fixing nginx.service: Failed to read PID from file /run/nginx.pid: Invalid argument #Conflicto entre systemd y nginx

Aquí es cuando nuestro amigo @Koratsuki empieza a hablar mal de systemd 🙂

Les daré 2 posibles soluciones.

a)

nano /etc/nginx/nginx.conf

buscar: 
#pid  logs/nginx.pid;
cambiar a:
pid  /run/nginx.pid;

b)

mkdir /etc/systemd/system/nginx.service.d
printf "[Service]\nExecStartPost=/bin/sleep 0.1\n" > /etc/systemd/system/nginx.service.d/override.conf

Nota: A mi me funciono solo la opcion b

Reiniciamos todo y probamos de nuevo:

service nginx stop
service nginx start

# service nginx status
* nginx.service - The NGINX HTTP and reverse proxy server
   Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
  Drop-In: /etc/systemd/system/nginx.service.d
           `-override.conf
   Active: active (running) since Wed 2018-11-14 19:48:49 UTC; 59min ago
  Process: 509 ExecStartPost=/bin/sleep 0.1 (code=exited, status=0/SUCCESS)
  Process: 491 ExecStart=/usr/sbin/nginx (code=exited, status=0/SUCCESS)
  Process: 117 ExecStartPre=/usr/sbin/nginx -t (code=exited, status=0/SUCCESS)
 Main PID: 507 (nginx)
    Tasks: 2 (limit: 4915)
   CGroup: /system.slice/nginx.service
           |-507 nginx: master process /usr/sbin/nginx
           `-508 nginx: worker process

Nov 14 19:48:42 web systemd[1]: nginx.service: Failed to reset devices.list: Operation not permitted
Nov 14 19:48:42 web systemd[1]: Starting The NGINX HTTP and reverse proxy server...
Nov 14 19:48:48 web nginx[117]: nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
Nov 14 19:48:48 web nginx[117]: nginx: configuration file /etc/nginx/nginx.conf test is successful
Nov 14 19:48:49 web systemd[1]: Started The NGINX HTTP and reverse proxy server.

Finalmente hagamos una prueba sencilla con uno de los modulos, especificamente con el de nginx_status. El cual lo activamos al compilarlo –with-http_stub_status_module

nano /etc/nginx/nginx.conf

agregamos dentro de server

location /nginx_status {
        # Habilitar las estadísticas
        stub_status on;
        # No registrar en los logs los accesos a la página de estado
        access_log   off;
        # Permitir que únicamente mi IP pueda visitar la página #
        allow 10.122.193.0/24;
        allow 127.0.0.1;
        # Denegar el acceso al resto del mundo #
        deny all;
        }

allow 10.122.193.0/24; rango de IP de LAN de su red

Recargamos el NGINX o lo reiniciamos. En nuestro navegador accedemos a http://ipdelnginx/nginx_status y obtendremos algo como esto

active connections — Número de conexiones abiertas.
server accepts handled requests — En el ejemplo, nginx ha aceptado 1 conexiones, procesado 1 de ellas (Ninguna fue cerrada) y ha procesado 1.
reading — Peticiones de cabecera leídas.
writing — Peticiones leídas, procesadas, o escritas en respuesta al cliente.
waiting — Conexiones keep-alive, activas en el momento (Lectura + Escritura)

En este tutorial solo les muestro los pasos para compilar e instalar el NGIX con módulos extra, no les muestro las configuraciones para usarlo. En futuros tutoriales o continuación de este le mostrare a medida que lo vaya probando como usar los diferentes módulos.

Espero les ayude este tutorial y a partir de ahora tengan un servidor web mucho más potente que antes

alex out

¿De cuánta utilidad te ha parecido este contenido?

¡Haz clic en una estrella para puntuar!

Promedio de puntuación 4 / 5. Recuento de votos: 1

Hasta ahora, ¡no hay votos!. Sé el primero en puntuar este contenido.

Sobre Alexander Rivas Alpizar 61 artículos
Administrador de Redes IDEAR Cienfuegos

5 comentarios

  1. Google Chrome 84.0.4147.105 Google Chrome 84.0.4147.105 Windows 10 x64 Edition Windows 10 x64 Edition
    Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36

    Se pude reemplazar el apache de windows por nginx, tengo entendido que hay funciones especificas que optimizan el funciomiento de nginx no estan en windows, se puede hacer o sigo con apache

  2. Google Chrome 70.0.3538.110 Google Chrome 70.0.3538.110 Windows 10 x64 Edition Windows 10 x64 Edition
    Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36

    un tip viejo te falto apt install libcurl3 es una dependencia que pide el passenger en ubuntu 18.04 para poder instalarse jejejej otro tip para que agreges al tutu

    • Firefox 63.0 Firefox 63.0 Windows 10 x64 Edition Windows 10 x64 Edition
      Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:63.0) Gecko/20100101 Firefox/63.0

      Eso te pasa por usar Mierduntu, pero es válida la aclaración. En debian no se precisa. Al que use Ubuntu ya se dará cuenta de las dependencias necesarias. Que por lo que noto es solo 1. Y tutu es lo que usan las bailarinas 🙂

  3. Firefox 63.0 Firefox 63.0 Windows 10 x64 Edition Windows 10 x64 Edition
    Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:63.0) Gecko/20100101 Firefox/63.0

    Bien Ale… Un Ngix con esteroides. Un abrazo.

Dejar una contestacion

Tu dirección de correo electrónico no será publicada.


*