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 upgradeEn 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-devAhora procedemos a instalar Passenger:
apt install dirmngr --install-recommends
apt install apt-transport-https ca-certificatesAgregamos esta entrada en nuestro sourcelist:
deb https://oss-binaries.phusionpassenger.com/apt/passenger stretch mainImportamos 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 561F9B9CAC40B2F7Seguido actualizamos nuestra paquetería e instalamos el passenger
apt update
apt install passenger passenger-dev libgeoip-devPara 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-devCrearemos el usuario y el grupo que usara nuestro NGINX.
adduser --system --no-create-home --shell /bin/false --group --disabled-login nginxEn 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/nginxEmpezamos 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/modulesMODULOS (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.gz2- 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.gz3- 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.335- 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 *.gzNOTA: 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 --recursive7- 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-stableEn 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 installSi 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 successfulAhora 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.targetArrancamos y activamos nuestro NGINX
systemctl start nginx
systemctl enable nginxAl 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 nginxAquí 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.confNota: 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







No comments yet