Cómo construir Nginx desde el código fuente en Debian 9

Nginx (pronunciado«motor x») es un software de servidor web de código abierto diseñado pensando en la alta concurrencia, que puede utilizarse comoservidor HTTP/HTTPS,servidor proxy inverso,servidor proxy de correo,equilibrador de carga de software,terminador TLS,servidor de caché

Es un software extremadamente modular. Incluso algunas de las piezas aparentemente «integradas» en el software, como GZIP o SSL, se construyen en realidad como módulos que pueden activarse y desactivarse durante la construcción.

Tienemóduloscentrales(nativos) ymódulos de terceros (externos)creados por la comunidad. En este momento, hay más de cien módulos de terceros que podemos utilizar.

Escrito en lenguajeC, es un software muy rápido y ligero.

Instalar Nginx desde el código fuente es relativamente «fácil»: descarga la última versión del código fuente de Nginx, configúralo, constrúyelo e instálalo.

Tendrás que elegir si quieres descargar la versiónmainlineo laestable, pero construirlas es exactamente lo mismo.

En este tutorial, construiremos Nginx con todos los módulos disponibles en la versión de código abierto de Nginx y utilizaremosmainlineque está en1.15.8en el momento de escribir este artículo. Actualiza los números de versión cuando haya versiones más nuevas disponibles.

Versión estable vs. versión principal

Nginx Open Source está disponible en dos versiones:

  • Mainline– Incluye las últimas características y correcciones de errores y está siempre actualizada. Es fiable, pero puede incluir algunos módulos experimentales, y también puede tener algún número de errores nuevos.
  • Estable– No incluye todas las funciones más recientes, pero tiene correcciones de errores críticos que siempre se retroalimentan a la versión mainline.

Módulos principales vs. módulos de terceros

Nginx tiene dos tipos de módulos que puedes utilizar:móduloscentrales ymódulos de terceros.

Los módulos principales son creados por los desarrolladores del núcleo de Nginx y forman parte del propio software.

Los módulos de terceros son construidos por la comunidad y puedes utilizarlos para ampliar la funcionalidad de Nginx. Hay muchos módulos de terceros útiles, los más famosos son PageSpeed, ModSecurity, RTMP, Lua, etc.

Módulos estáticos vs. módulos dinámicos

Los módulos estáticos existen en Nginx desde la primera versión. Los módulos dinámicos se introdujeron con Nginx 1.9.11+ en febrero de 2016.

Con los módulos estáticos, el conjunto de módulos que constituyen un binario de Nginx es fijado en tiempo de compilación por el script./configure. Los módulos estáticos utilizan la sintaxis--with-foo_bar_moduleo--add-module=PATH.

Para compilar el módulo principal (estándar) como dinámico añadimos=dynamic, por ejemplo--with-http_image_filter_module=dynamic.

Para compilar módulos de terceros como dinámicos utilizamos la sintaxis--add-dynamic-module=/path/to/moduley luego los cargamos utilizandola directivaload_moduleen el contexto global del archivonginx.conf.

Requisitos para construir Nginx desde el código fuente

En comparación con otros programas de UNIX/Linux, Nginx es bastante ligero y no tiene muchas dependencias de bibliotecas. La configuración de compilación por defecto sólo depende de la instalación de 3 bibliotecas:OpenSSL/LibreSSL/BoringSSL,ZlibyPCRE.

NOTA: Nginx también puede compilarse conLibreSSLyBoringSSLen lugar de las bibliotecas criptográficasOpenSSL.

Requisitos

  • Un servidor con Debian 9 (stretch).
  • Un usuario no root con privilegios sudo.

Pasos iniciales

Comprueba la versión de Debian:

lsb_release -ds 
# Debian GNU/Linux 9.6 (stretch)

Instalawget,curlysudopaquetes.

apt install -y wget curl sudo

Configura la zona horaria:

sudo dpkg-reconfigure tzdata

Actualiza los paquetes de tu sistema operativo:

apt update && apt upgrade -y

Construye Nginx desde el código fuente

Nginx es un programa escrito enC, por lo que primero tendrás que instalar un compilador de herramientas. Instalael paquetebuild-essential, y otros paquetes necesariospaquetes:

sudo apt install -y build-essential git tree software-properties-common dirmngr apt-transport-https ufw

Descarga la última versión de la línea principal del código fuente de Nginx y extráelo. El código fuente de Nginx se distribuye como un archivo comprimido (tarball gzipped), como la mayoría del software de Unix y Linux:

wget https://nginx.org/download/nginx-1.15.8.tar.gz && tar zxvf nginx-1.15.8.tar.gz

Descarga el código fuente de las dependencias obligatorias de Nginx y extráelas:

# PCRE version 8.42
wget https://ftp.pcre.org/pub/pcre/pcre-8.42.tar.gz && tar xzvf pcre-8.42.tar.gz

# zlib version 1.2.11
wget https://www.zlib.net/zlib-1.2.11.tar.gz && tar xzvf zlib-1.2.11.tar.gz

# OpenSSL version 1.1.1a
wget https://www.openssl.org/source/openssl-1.1.1a.tar.gz && tar xzvf openssl-1.1.1a.tar.gz

Instala las dependencias opcionales de Nginx:

sudo apt install -y perl libperl-dev libgd3 libgd-dev libgeoip1 libgeoip-dev geoip-bin libxml2 libxml2-dev libxslt1.1 libxslt1-dev

Limpia todos los.tar.gzarchivos. Ya no los necesitamos:

rm -rf *.tar.gz

Entra en el directorio fuente de Nginx:

cd ~/nginx-1.15.8

Por si acaso, enumera los directorios y archivos que componen el código fuente de Nginx contreeutilidad:

tree -L 2 .

Copia la página del manual de Nginx al/usr/share/man/man8/directorio:

sudo cp ~/nginx-1.15.8/man/nginx.8 /usr/share/man/man8
sudo gzip /usr/share/man/man8/nginx.8
ls /usr/share/man/man8/ | grep nginx.8.gz
# Check that Man page for nginx is working:
man nginx

Página de manual de Nginx

Para obtener ayuda, puedes ver la lista completa de opciones actualizadas en tiempo de compilación de Nginx ejecutando

./configure --help
# To see want core modules can be build as dynamic run:
./configure --help | grep -F =dynamic

Configurar, compilar e instalar Nginx:

./configure --prefix=/etc/nginx \
            --sbin-path=/usr/sbin/nginx \
            --modules-path=/usr/lib/nginx/modules \
            --conf-path=/etc/nginx/nginx.conf \
            --error-log-path=/var/log/nginx/error.log \
            --pid-path=/var/run/nginx.pid \
            --lock-path=/var/run/nginx.lock \
            --user=nginx \
            --group=nginx \
            --build=Debian \
            --builddir=nginx-1.15.8 \
            --with-select_module \
            --with-poll_module \
            --with-threads \
            --with-file-aio \
            --with-http_ssl_module \
            --with-http_v2_module \
            --with-http_realip_module \
            --with-http_addition_module \
            --with-http_xslt_module=dynamic \
            --with-http_image_filter_module=dynamic \
            --with-http_geoip_module=dynamic \
            --with-http_sub_module \
            --with-http_dav_module \
            --with-http_flv_module \
            --with-http_mp4_module \
            --with-http_gunzip_module \
            --with-http_gzip_static_module \
            --with-http_auth_request_module \
            --with-http_random_index_module \
            --with-http_secure_link_module \
            --with-http_degradation_module \
            --with-http_slice_module \
            --with-http_stub_status_module \
            --with-http_perl_module=dynamic \
            --with-perl_modules_path=/usr/share/perl/5.24.1 \
            --with-perl=/usr/bin/perl \
            --http-log-path=/var/log/nginx/access.log \
            --http-client-body-temp-path=/var/cache/nginx/client_temp \
            --http-proxy-temp-path=/var/cache/nginx/proxy_temp \
            --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp \
            --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp \
            --http-scgi-temp-path=/var/cache/nginx/scgi_temp \
            --with-mail=dynamic \
            --with-mail_ssl_module \
            --with-stream=dynamic \
            --with-stream_ssl_module \
            --with-stream_realip_module \
            --with-stream_geoip_module=dynamic \
            --with-stream_ssl_preread_module \
            --with-compat \
            --with-pcre=../pcre-8.42 \
            --with-pcre-jit \
            --with-zlib=../zlib-1.2.11 \
            --with-openssl=../openssl-1.1.1a \
            --with-openssl-opt=no-nextprotoneg \
            --with-debug


make
sudo make install

Después de construir Nginx, navega al directorio home (~):

cd ~

Symlink/usr/lib/nginx/modulesa/etc/nginx/modulesdirectorio.etc/nginx/moduleses un lugar estándar para los módulos de Nginx:

sudo ln -s /usr/lib/nginx/modules /etc/nginx/modules

Imprime la versión de Nginx, la versión del compilador y los parámetros del script de configuración:

sudo nginx -V
# nginx version: nginx/1.15.8 (Debian)
# built by gcc 6.3.0 (Debian 6.3.0-18+deb9u1)
# built with OpenSSL 1.1.1a  20 Nov 2018
# TLS SNI support enabled
# configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib/nginx/modules
# . . .
# . . .

Crea el grupo y el usuario del sistema Nginx:

sudo adduser --system --home /nonexistent --shell /bin/false --no-create-home --disabled-login --disabled-password --gecos "nginx user" --group nginx

Comprueba la sintaxis de Nginx y los posibles errores:

sudo nginx -t
# Will throw this error -> nginx: [emerg] mkdir() "/var/cache/nginx/client_temp" failed (2: No such file or directory)

# Create nginx cache directories and set proper permissions
sudo mkdir -p /var/cache/nginx/client_temp /var/cache/nginx/fastcgi_temp /var/cache/nginx/proxy_temp /var/cache/nginx/scgi_temp /var/cache/nginx/uwsgi_temp
sudo chmod 700 /var/cache/nginx/*
sudo chown nginx:root /var/cache/nginx/*

#
Re-check syntax and potential errors.
sudo nginx -t

Crea el archivo de unidad Nginx systemd:

sudo vim /etc/systemd/system/nginx.service

Copia/pega el siguiente contenido en/etc/systemd/system/nginx.servicearchivo:

[Unit]
Description=nginx - high performance web server
Documentation=https://nginx.org/en/docs/
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target

[Service]
Type=forking
PIDFile=/var/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t -c /etc/nginx/nginx.conf
ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID

[Install]
WantedBy=multi-user.target

Activa que Nginx se inicie al arrancar y arranca Nginx inmediatamente:

sudo systemctl enable nginx.service
sudo systemctl start nginx.service

Comprueba si Nginx se inicia automáticamente después de un reinicio:

sudo systemctl is-enabled nginx.service
# enabled

Comprueba si Nginx se está ejecutando ejecutando uno de los siguientes comandos:

sudo systemctl status nginx.service
# or
ps aux | grep nginx
# or
curl -I 127.0.0.1

También puedes abrir tu navegador y navegar hasta tu dominio/dirección IP para ver la página por defecto de Nginx. Esto es un indicador de que Nginx está funcionando.

Página de bienvenida de Nginx

Crea un cortafuegos sin complicaciones (UFW) el perfil de la aplicación Nginx:

sudo vim /etc/ufw/applications.d/nginx

Copia/pega el siguiente contenido en/etc/ufw/applications.d/nginxarchivo:

[nginx HTTP]
title=Web Server (nginx, HTTP)
description=Small, but very powerful and efficient web server
ports=80/tcp

[nginx HTTPS]
title=Web Server (nginx, HTTPS)
description=Small, but very powerful and efficient web server
ports=443/tcp

[nginx Full]
title=Web Server (nginx, HTTP + HTTPS)
description=Small, but very powerful and efficient web server
ports=80,443/tcp

Comprueba que los perfiles de aplicación UFW están creados y reconocidos:

sudo ufw app list

# Available applications:
 # nginx Full
 # nginx HTTP
 # nginx HTTPS

nginx, por defecto, genera copias de seguridad.defaultarchivos en/etc/nginx. Elimina.defaultarchivos del/etc/nginxdirectorio:

sudo rm /etc/nginx/*.default

Colocar el resaltado sintáctico de la configuración de nginx para el editor Vim en~/.vim:

# For regular non-root user
mkdir ~/.vim/
cp -r ~/nginx-1.15.8/contrib/vim/* ~/.vim/
# For root user
sudo mkdir /root/.vim/
sudo cp -r ~/nginx-1.15.8/contrib/vim/* /root/.vim/

NOTA: Haciendo el paso anterior, obtendrás un bonito resaltado de sintaxis al editar los archivos de configuración de Nginx en el editor Vim.

Resaltar la sintaxis de Nginx en Vim

Creaconf.d,snippets,sites-availableysites-enableddirectorios en/etc/nginxdirectorio:

sudo mkdir /etc/nginx/{conf.d,snippets,sites-available,sites-enabled}

Cambiar los permisos y la propiedad del grupo de los archivos de registro de nginx:

sudo chmod 640 /var/log/nginx/*
sudo chown nginx:adm /var/log/nginx/access.log /var/log/nginx/error.log

Crea la configuración de logrotation para Nginx.

sudo vim /etc/logrotate.d/nginx

Rellena el archivo con el texto que aparece a continuación, luego guarda y sale:

/var/log/nginx/*.log {
    daily
    missingok
    rotate 52
    compress
    delaycompress
    notifempty
    create 640 nginx adm
    sharedscripts
    postrotate
            if [ -f /var/run/nginx.pid ]; then
                    kill -USR1 `cat /var/run/nginx.pid`
            fi
    endscript
}

Elimina todos los archivos descargados del directorio principal:

cd ~
rm -rf nginx-1.15.8/ openssl-1.1.1a/ pcre-8.42/ zlib-1.2.11/

Eso es todo. Ahora tienes la última versión de Nginx instalada al construirla desde el código fuente. Se compila estáticamente con algunas bibliotecas importantes como OpenSSL. A menudo, la versión de OpenSSL suministrada por el sistema está obsoleta. Al utilizar este método de instalación con una versión más reciente de OpenSSL, puedes aprovechar los nuevos cifrados comoCHACHA20_POLY1305y protocolos comoTLS 1.3que está disponible en OpenSSL1.1.1.Además, al compilar tu propio binario, puedes adaptar la funcionalidad que proporcionará tu Nginx, lo que es mucho más flexible que instalar un binario precompilado.

También te podría gustar...