Nginx Debian · 10 min read · Jan 23, 2026

Construyendo Nginx Desde Fuente En Debian Squeeze

Construyendo Nginx Desde Fuente En Debian Squeeze

Versión 1.0
Autor: Michel Käser

Este tutorial describe cómo puedes construir nginx desde fuente en Debian Squeeze. Además, incluiremos algunos módulos de terceros útiles como el naxsi WAF (firewall de aplicaciones web), SPDY, etc.

Al final tendrás una instalación de nginx completamente funcional.

¡No emito ninguna garantía de que esto funcione para ti!

1 Requisitos

Para seguir este tutorial necesitarás lo siguiente:

  • un servidor dedicado que ejecute Debian Squeeze
  • aproximadamente 30 minutos de tiempo para leer cuidadosamente

2 Notas Preliminares

En este tutorial utilizaremos la versión de desarrollo de nginx como nuestra base de fuente. Ten en cuenta que estas versiones pueden ser inestables y no se recomienda ejecutarlas en un servidor de producción.

Sin embargo, algunos módulos como SPDY requieren la versión 1.3.1x de nginx o posterior, y personalmente diría que es más o menos seguro usar la versión de desarrollo de nginx ya que no hay exploits conocidos.

3 Prerrequisitos

Dado que nginx está escrito en el lenguaje de programación C, necesitaremos instalar algunos paquetes que nos ayudarán a construir/compilar el código fuente. Soy un gran fan del gestor de paquetes apt, pero también puedes usar aptitude, etc.:

apt-get -y install build-essential zlib1g-dev libpcre3 libpcre3-dev libbz2-dev libssl-dev tar unzip

Esto instalará todos los paquetes requeridos como gcc y make.

4 Descargando la fuente de nginx

La última versión de nginx se puede encontrar en el siguiente sitio web: nginx.org/en/download.html. En el momento de escribir esto es 1.3.12, así que vamos a descargar:

cd /tmp  
wget http://nginx.org/download/nginx-1.3.12.tar.gz

y descomprimir la fuente:

tar -xzvf nginx-1.3.12.tar.gz

Aún no construiremos nuestra versión de nginx, ya que primero vamos a descargar algunos módulos de terceros que incluiremos más adelante.

5 Módulos adicionales de terceros

A diferencia de Apache HTTPd, que admite la carga dinámica de módulos (por eso podemos instalarlos desde repositorios), nginx no incluye tal característica, y por lo que he leído, no es algo que esté en la hoja de ruta a corto plazo.

Por lo tanto, debemos decidir temprano qué módulos queremos incluir en nuestra instalación personalizada. Hay una buena visión general/tabla en el sitio web oficial de nginx que enumera los más populares: wiki.nginx.org/3rdPartyModules.
Dado que no incluye todos los módulos disponibles, te recomiendo que realices una búsqueda en Google como: nginx redis module github si estás buscando un módulo en particular; muchos de ellos están alojados en Github.

5.1 Descargando los módulos

Para este tutorial vamos a descargar algunos módulos realmente geniales como naxsi, SPDY y algunos menos conocidos.

headers_more

Comencemos con headers_more. Puedes usarlo para ocultar completamente la información del servidor web, por ejemplo, para mejorar la seguridad del servidor:

mkdir /tmp/nginx-modules  
cd /tmp/nginx-modules  
wget https://github.com/agentzh/headers-more-nginx-module/archive/v0.19.tar.gz  
tar -xzvf v0.19.tar.gz

Esto descargará la versión más reciente y la descomprimirá. Asegúrate de revisar el repositorio oficial de vez en cuando para ver si hay una nueva versión disponible (esto cuenta para todos los demás módulos también).

Cache Purge

Es posible que no necesites este módulo para tu configuración. Sin embargo, si tienes nginx frente a Apache, actuando como un proxy inverso y almacenando en caché los resultados de proxy_pass, ¡esto podría ser una buena opción! De lo contrario, sáltalo:

wget https://github.com/FRiCKLE/ngx_cache_purge/archive/2.0.tar.gz  
tar -xzvf 2.0.tar.gz

naxsi

Naxsi es un módulo de firewall de aplicaciones web de alto rendimiento, bajo mantenimiento de reglas, de código abierto para nginx, muy similar a mod_security en funcionalidad. Lo utilizaremos para asegurar las aplicaciones web de nuestros clientes:

wget http://naxsi.googlecode.com/files/naxsi-core-0.49.tgz  
tar -xzvf naxsi-core-0.49.tgz

SPDY

SPDY es un módulo que permite a tu servidor web aprovechar las características de SPDY como la multiplexión de flujos y la compresión de encabezados, y muchas personas están hablando de que es un nuevo estándar (lo que parece ser).

Actualizando OpenSSL

Requiere OpenSSL 1.0.1+, algo que no tenemos en nuestra máquina Squeeze por defecto. Usaremos el repositorio de pruebas de Debian en este tutorial para instalarlo. Sin embargo, puedes compilarlo desde la fuente o buscar otros repositorios también.

nano /etc/apt/sources.list

y pega las siguientes líneas:

deb http://ftp.debian.org/debian/ testing main contrib non-free
deb http://security.debian.org/ testing/updates main contrib non-free

Ahora debemos evitar que nuestro servidor actualice otros paquetes a la versión de pruebas. Podemos hacerlo creando/editando el archivo /etc/apt/apt.conf.d/releases: ``` nano /etc/apt/apt.conf.d/releases ``` y pega: ``` APT::Default-Release "squeeze"; ``` Atención: Si te refieres a repositorios estables con stable en tu sources.list, deberías reemplazar squeeze con stable en el texto anterior. Ahora podemos *safely* ejecutar: ``` apt-get update apt-get -t testing install openssl ``` lo que actualizará/installará la versión existente de OpenSSL. #### Aplicando el parche Actualmente no hay forma de incluirlo como otros módulos; en su lugar, se proporciona como un parche para el código fuente de nginx. El readme oficial se puede encontrar aquí: nginx.org/patches/spdy/README.txt ``` cd /tmp/nginx-1.3.12 wget http://nginx.org/patches/spdy/patch.spdy.txt patch -p1 < patch.spdy.txt ``` debería hacer toda la magia por nosotros. ### 6 Construyendo nginx Hasta ahora hemos descargado la fuente de nginx, algunos módulos adicionales de terceros para él y aplicado el parche SPDY. Es hora de construir nuestra instalación de nginx ahora. Es como con todas las aplicaciones en C: un proceso de 3 pasos. Vamos a pasar por el primer paso en más detalle: ``` ./configure --help ``` Esto te mostrará una lista de todas las opciones de configuración disponibles para la construcción, como qué módulos se pueden deshabilitar, habilitar, etc. La mía se ve así (abreviada): ``` --help imprime este mensaje --prefix=PATH establece el prefijo de instalación --sbin-path=PATH establece la ruta del binario de nginx --conf-path=PATH establece la ruta de nginx.conf --error-log-path=PATH establece la ruta del registro de errores --pid-path=PATH establece la ruta de nginx.pid --lock-path=PATH establece la ruta de nginx.lock --user=USER establece el usuario no privilegiado para procesos de trabajo --group=GROUP establece el grupo no privilegiado para procesos de trabajo --builddir=DIR establece el directorio de construcción --with-rtsig_module habilita el módulo rtsig --with-select_module habilita el módulo select --without-select_module deshabilita el módulo select --with-poll_module habilita el módulo poll --without-poll_module deshabilita el módulo poll --with-file-aio habilita el soporte AIO de archivos --with-ipv6 habilita el soporte IPv6 --with-http_ssl_module habilita ngx_http_ssl_module [...] --with-http_stub_status_module habilita ngx_http_stub_status_module --without-http_charset_module deshabilita ngx_http_charset_module [...] --without-http_browser_module deshabilita ngx_http_browser_module --without-http_upstream_ip_hash_module deshabilita ngx_http_upstream_ip_hash_module --without-http_upstream_least_conn_module deshabilita ngx_http_upstream_least_conn_module --without-http_upstream_keepalive_module deshabilita ngx_http_upstream_keepalive_module --with-http_perl_module habilita ngx_http_perl_module --with-perl_modules_path=PATH establece la ruta de los módulos Perl --with-perl=PATH establece la ruta del binario de perl --http-log-path=PATH establece la ruta del registro de acceso http --http-client-body-temp-path=PATH establece la ruta para almacenar archivos temporales del cuerpo de la solicitud http --http-proxy-temp-path=PATH establece la ruta para almacenar archivos temporales del proxy http --http-fastcgi-temp-path=PATH establece la ruta para almacenar archivos temporales de fastcgi http --http-uwsgi-temp-path=PATH establece la ruta para almacenar archivos temporales de uwsgi http --http-scgi-temp-path=PATH establece la ruta para almacenar archivos temporales de scgi http --without-http deshabilita el servidor HTTP --without-http-cache deshabilita la caché HTTP --with-mail habilita el módulo proxy POP3/IMAP4/SMTP [...] --without-mail_smtp_module deshabilita ngx_mail_smtp_module --with-google_perftools_module habilita ngx_google_perftools_module --with-cpp_test_module habilita ngx_cpp_test_module --add-module=PATH habilita un módulo externo --with-cc=PATH establece la ruta del compilador C [...] --with-cpu-opt=CPU construye para la CPU especificada, valores válidos: pentium, pentiumpro, pentium3, pentium4, athlon, opteron, sparc32, sparc64, ppc64 --without-pcre deshabilita el uso de la biblioteca PCRE [...] --with-pcre-jit construye PCRE con soporte de compilación JIT --with-md5=DIR establece la ruta a las fuentes de la biblioteca md5 --with-md5-opt=OPTIONS establece opciones de construcción adicionales para md5 --with-md5-asm utiliza fuentes ensambladoras de md5 --with-sha1=DIR establece la ruta a las fuentes de la biblioteca sha1 --with-sha1-opt=OPTIONS establece opciones de construcción adicionales para sha1 --with-sha1-asm utiliza fuentes ensambladoras de sha1 --with-zlib=DIR establece la ruta a las fuentes de la biblioteca zlib --with-zlib-opt=OPTIONS establece opciones de construcción adicionales para zlib --with-zlib-asm=CPU utiliza fuentes ensambladoras de zlib optimizadas para la CPU especificada, valores válidos: pentium, pentiumpro --with-libatomic fuerza el uso de la biblioteca libatomic_ops --with-libatomic=DIR establece la ruta a las fuentes de la biblioteca libatomic_ops --with-openssl=DIR establece la ruta a las fuentes de la biblioteca OpenSSL --with-openssl-opt=OPTIONS establece opciones de construcción adicionales para OpenSSL --with-debug habilita el registro de depuración ``` Esto te ayudará mucho a decidir qué módulos deseas incluir/excluir, así como qué más se puede definir. Vamos a usar el siguiente comando de configuración: ``` ./configure \ --prefix=/usr/share/nginx \ --sbin-path=/usr/sbin/nginx \ --conf-path=/etc/nginx/nginx.conf \ --pid-path=/var/run/nginx.pid \ --lock-path=/var/lock/nginx.lock \ --error-log-path=/var/log/nginx/error.log \ --http-log-path=/var/log/access.log \ --user=www-data \ --group=www-data \ --without-mail_pop3_module \ --without-mail_imap_module \ --without-mail_smtp_module \ --without-http_fastcgi_module \ --without-http_uwsgi_module \ --without-http_scgi_module \ --without-http_memcached_module \ --with-ipv6 \ --with-http_ssl_module \ --with-http_spdy_module \ --with-http_stub_status_module \ --with-http_gzip_static_module \ --add-module=/tmp/nginx-modules/headers-more-nginx-module-0.19 \ --add-module=/tmp/nginx-modules/naxsi-core-0.49/naxsi_src \ --add-module=/tmp/nginx-modules/ngx_cache_purge-2.0 ``` que excluirá todo lo relacionado con el correo y los controladores que no necesitamos (¡puedes necesitarlos si no estás ejecutando como un proxy inverso!) e incluirá nuestros módulos de terceros descargados y el parche SPDY. He utilizado las rutas estándar de Debian aquí, pero siéntete libre de cambiarlas. A continuación, podemos compilar la fuente: ``` make ``` Atención: Si esto arroja algún error, debes leerlos cuidadosamente para ver dónde está el problema y qué es. Finalmente, instala la fuente compilada: ``` make install ``` Esto copiará todos los archivos a las ubicaciones correctas. ¡Listo! ### 7 Habilitar el inicio automático Debian utiliza scripts de inicio a través de los cuales puedes controlar el comportamiento del servicio. Estoy usando el de el paquete oficial de nginx; todos los créditos pertenecen a su mantenedor: ``` #!/bin/sh ### BEGIN INIT INFO # Provides: nginx # Required-Start: $local_fs $remote_fs $network $syslog # Required-Stop: $local_fs $remote_fs $network $syslog # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: inicia el servidor web nginx # Description: inicia nginx usando start-stop-daemon ### END INIT INFO PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin DAEMON=/usr/sbin/nginx NAME=nginx DESC=nginx # Incluir nginx por defecto si está disponible if [ -f /etc/default/nginx ]; then . /etc/default/nginx fi test -x $DAEMON || exit 0 set -e . /lib/lsb/init-functions test_nginx_config() { if $DAEMON -t $DAEMON_OPTS >/dev/null 2>&1; then return 0 else $DAEMON -t $DAEMON_OPTS return $? fi } case "$1" in start) echo -n "Iniciando $DESC: " test_nginx_config # Verificar si el ULIMIT está configurado en /etc/default/nginx if [ -n "$ULIMIT" ]; then # Establecer los ulimits ulimit $ULIMIT fi start-stop-daemon --start --quiet --pidfile /var/run/$NAME.pid \ --exec $DAEMON -- $DAEMON_OPTS || true echo "$NAME." ;; stop) echo -n "Deteniendo $DESC: " start-stop-daemon --stop --quiet --pidfile /var/run/$NAME.pid \ --exec $DAEMON || true echo "$NAME." ;; restart|force-reload) echo -n "Reiniciando $DESC: " start-stop-daemon --stop --quiet --pidfile \ /var/run/$NAME.pid --exec $DAEMON || true sleep 1 test_nginx_config # Verificar si el ULIMIT está configurado en /etc/default/nginx if [ -n "$ULIMIT" ]; then # Establecer los ulimits ulimit $ULIMIT fi start-stop-daemon --start --quiet --pidfile \ /var/run/$NAME.pid --exec $DAEMON -- $DAEMON_OPTS || true echo "$NAME." ;; reload) echo -n "Recargando la configuración de $DESC: " test_nginx_config start-stop-daemon --stop --signal HUP --quiet --pidfile /var/run/$NAME.pid \ --exec $DAEMON || true echo "$NAME." ;; configtest|testconfig) echo -n "Probando la configuración de $DESC: " if test_nginx_config; then echo "$NAME." else exit $? fi ;; status) status_of_proc -p /var/run/$NAME.pid "$DAEMON" nginx && exit 0 || exit $? ;; *) echo "Uso: $NAME {start|stop|restart|reload|force-reload|status|configtest}" >&2 exit 1 ;; esac exit 0 ``` No olvideschmod`: chmod 755 /etc/init.d/nginx También podemos crear un archivo de configuración por defecto estilo Debian: nano /etc/default/nginx y pegar: # Nota: Puede que desees mirar la siguiente página antes de establecer el ULIMIT. # http://wiki.nginx.org/CoreModule#worker_rlimit_nofile # Establece la variable ulimit si necesitas cambiar los valores por defecto. # Ejemplo: ULIMIT="-n 4096" #ULIMIT="-n 4096" Por último, si deseas que nginx se inicie automáticamente al arrancar, puedes ejecutar: update-rc.d nginx defaults ### 8 Directivas especiales de módulos No vamos a repasar la configuración de nginx y los archivos vhost aquí, pero las siguientes directivas de nuestros módulos son interesantes: # Módulo SPDY (vhost) listen 443 ssl spdy; # módulo more_headers (http) more_clear_headers 'Server'; # elimina la información del servidor #### naxsi naxsi es un poco más complejo. Primero, las reglas de configuración global deben incluirse en la sección http del archivo de configuración de nginx: nano /etc/nginx/nginx.conf y pegar: http { [...] include /etc/nginx/naxsi_core.rules; [...] } Atención: Asegúrate de que este archivo exista. Puedes copiar los archivos de configuración de naxsi del archivo descargado (ver: Módulos adicionales de terceros). A continuación, debes incluir las reglas predeterminadas dentro de tu plantilla de vhost: [...] location / { include /etc/nginx/naxsi.rules; [...] } [...] y una ubicación para las solicitudes bloqueadas: [...] location /blocked { return 403; #proxy_pass http://127.0.0.1:4242; # modo de aprendizaje } [...] Atención: Asegúrate de que la ubicación para las solicitudes bloqueadas coincida con la del archivo de configuración /etc/nginx/naxsi.rules: LearningMode; SecRulesEnabled; #SecRulesDisabled; DeniedUrl "/blocked"; [...] Como puedes ver, naxsi tiene algunas opciones extrañas, pero no son extrañas. Deberías consultar su documentación para leer cómo hacer que funcione mejor. Una pista que busqué durante mucho tiempo: debes ejecutar un script de Python y pasar las solicitudes bloqueadas a él durante el modo de aprendizaje para crear una lista blanca para las falsas alertas. ### 9 Enlaces / Créditos - http://code.google.com/p/naxsi/ - http://nginx.org/ - https://www.rackster.ch/

Share: X/Twitter LinkedIn

Recibe nuevas publicaciones en tu bandeja de entrada.

No spam. Cancela la suscripción en cualquier momento.