FreeNGINX. Cómo Compilarlo
FreeNginx. El porqué de un fork de Nginx
Nginx, es un servidor web con más de una década de historia, que pasó de ser un proyecto personal de Igos Sysoev a un software profesional.
Nginx surge en 2004 y en 2011 pasa a ser una empresa responsable de su desarrollo y mantenimiento con licencia BSD con Maxim Dounin como uno de sus principales mantenedores de forma voluntaria.
El software de Nginx queda en dos partes:
- Nginx: Como software Open Source
- Nginx +: Como software privativo y de pago
En 2019 es comprada por F5 Networks y durante unos años mantiene todo como estaba, pero hace poco las cosas han cambiado...
Una de las cosas que quieren hacer es interferir con las política de seguridad que utiliza Nginx (open source), ante el problema y peligro de esto, se ha creado el fork FreeNginx para no perder el control y seguir manteniendo seguro el código de nginx.
Requisitos para compilar freenginx
A día de hoy no hay binarios de FreeNginx, así que os voy a mostrar una forma de compilarlo para tenerlo disponible si lo deseamos instalar en nuestros equipos o servidodres.
Una de las primeras cosas que debemos tener en cuenta es que Nginx y FreeNginx están desarrollados en C, con lo que para una compilación básica vamos a necesitar de pocas herramientas:
- GCC. El compilador GNU para C
- Librerias para OpenSSL (OpenSSL o LibreSSL o BoringSSL)
- Liberías para ZLib
- Librerías para PCRE (expresiones regulares)
Opcionalmente podemos instalar y usar otra serie de librerías que nos darán una mayor potencia a FreeNginx como son: GeoIP, Perl, libxml, libxslt, etc.
Herramientas y Librerías para compilación
Nosotros vamos a compilar nuestro propio FreeNginx y le vamos a "vitaminar" con varias opciones que no suelen venir por defecto para poder obtener más rendimiento y extraer mayores datos de los Logs cuando lo tengamos funcionando.
Descarga del código fuente del repositorio
El código fuente de FreeNginx está en un repositorio bajo un contro de versiones de tipo Mercurial, lo descargaremos mediante el siguiente comando:
hg clone http://freenginx.org/hg/nginx freenginx
Nos cambiamos al directorio creado 'freenginx' y todos los siguientes procesos los realizaremos desde este directorio.
cd freenginx
Descarga de PCRE2
Desde dentro del directorio freenginx vamos a descargarlos PCRE2, mediante el siguiente comando git:
git clone https://github.com/PCRE2Project/pcre2.git
Ahora nos cambiamos a este nuevo directorio y lo preparamos para que freenginx lo pueda usar en el proceso de compilación:
cd pcre2
./autogen.sh
cd ..
Descarga de ZLib
Seguimos en el directorio de freenginx y nos descargaremos zlib mediante wget:
wget --continue http://zlib.net/zlib-1.3.1.tar.gz -O zlib-1.3.1.tar.gz
tar xzvfp zlib-1.3.1.tar.gz
rm zlib-1.3.1.tar.gz
``
Ajustamos textos para FreeNginx
En este paso, simplemente para dejar correctamente reflejado el uso de FreeNginx, vamos a ajustar los literales que enlaces que muestra freenginx a la nueva web:
sed -i "s/Welcome to nginx/Welcome to freenginx/g" docs/html/index.html
sed -i "s/http:\/\/nginx.org/http:\/\/freenginx.org/g" docs/man/nginx.8
sed -i "s/http:\/\/nginx.org/http:\/\/freenginx.org/g" docs/text/README
sed -i "s/http:\/\/nginx.org/http:\/\/freenginx.org/g" docs/html/index.html
sed -i "s/http:\/\/nginx.org/http:\/\/freenginx.org/g" misc/README
sed -i "s/http:\/\/nginx.org/http:\/\/freenginx.org/g" src/http/modules/perl/nginx.pm
Disminuimos superficie de exposición
Vamos a evitar sacar la versión que tiene ejecutándose nuestro servidor cambiando un directiva interna:
sed -i 's/NGX_HTTP_SERVER_TOKENS_ON);/NGX_HTTP_SERVER_TOKENS_OFF);/g' src/http/ngx_http_core_module.c
Preparamos el proceso de compilación
Ahora nos toca realizar el proceso de configure, antes de realizar el ultimo paso de compilación, aquí indicaremos todos las opciones y cambios que queremos aplicar a una compilación estandard.
El proceso lo lanzamos desde el directorio de freenginx y usaremos el configure que existe dentro del directorio auto:
auto/configure --build=freengninx --prefix=/opt/nginx --sbin-path=/opt/nginx/nginx --conf-path=/opt/nginx/nginx.conf --with-compat --with-select_module --with-file-aio --with-threads --with-http_ssl_module --with-http_realip_module --with-http_geoip_module --with-http_slice_module --with-http_auth_request_module --with-http_addition_module --with-http_secure_link_module --with-http_random_index_module --with-http_sub_module --with-http_stub_status_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_ssl_module --with-stream_ssl_preread_module --with-stream_realip_module --with-stream_geoip_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-zlib=zlib-1.3.1 --with-pcre=pcre2
Como particularidades voy a fijar como nombre de construcción freenginx, la versión la mantengo y puedo consultarla con la opción -v desde la consola. Además dejo fijada la ruta destino de instalación en /opt/nginx, lo que me permite usar esta versión de freenginx como si fuese una versión "portable".
Voy a incluir soporte para GeoIP, obtención de la IP real de las peticiones, amplio el soporte a OpenSSL y métodos Auth.
Paso final. Compilación
Si en el paso anterior no has tenido ningún problema de que te faltase alguna librería, ahora solo hace falta realizar la creación del binario de nginx mediante la compilación, simplemente escribe:
make
Una vez finalizada la compilación vamos a revisar el binario generado que se ha generado en el directorio objs, mediante los parámetro -v y -V:
# Obtener version de freenginx
./objs/nginx -v
nginx version: nginx/1.25.4 (freengninx)
# Ver opciones de compilacion
./objs/nginx -V
nginx version: nginx/1.25.4 (freengninx)
built by gcc 12.2.0 (Debian 12.2.0-14)
built with OpenSSL 3.0.11 19 Sep 2023
TLS SNI support enabled
configure arguments: --build=freengninx --prefix=/opt/nginx --sbin-path=/opt/nginx/nginx --conf-path=/opt/nginx/nginx.conf --with-compat --with-select_module --with-file-aio --with-threads --with-http_ssl_module --with-http_realip_module --with-http_geoip_module --with-http_slice_module --with-http_auth_request_module --with-http_addition_module --with-http_secure_link_module --with-http_random_index_module --with-http_sub_module --with-http_stub_status_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_ssl_module --with-stream_ssl_preread_module --with-stream_realip_module --with-stream_geoip_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-zlib=zlib-1.3.1 --with-pcre=pcre2
Instalación de FreeNginx
Una vez tengas compilado freengnix, para instarlo en tu equipo tan sólo tienes que ejecutar el siguiente comando, como root para que tenga los permisos necesarios para crear las rutas necesarias:
sudo make install
Para desinstalarlo simplemente deberás borrar la ruta /opt/nginx
Uso de freenginx
Los ficheros de configuración y parámetros son los mismos que los de nginx.
En nuestra compilación no hemos indicado que usuario/grupo es el propietario del servicio de freenginx, con lo que para iniciarlo y pararlo deberás hacerlo con el usuario root.
Si quieres definir un usuario/grupo, deberás crearlos para darle permisos para ejecutar el servicio de freenginx, en la llamada del configure deberás incluir la siguiente línea:
auto/configure --user=nginx --group=nginx ...
ó
auto/configure --user=freenginx --group=freenginx ...
Web Oficial de FreeNginx
Toda la información sobre FreeNginx la tenéis en: