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
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
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
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 🙂
Mozilla/5.0 (Windows NT 10.0; WOW64; rv:63.0) Gecko/20100101 Firefox/63.0
Jajajajaja si esta bien windolero jajajajaja y para los que usen ubuntu lo sabran
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.