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_module
--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/module
y luego los cargamos utilizandoload_module
en 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.
- Requisitos obligatorios:
- Requisitos opcionales:
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
,curl
ysudo
paquetes.
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.gz
archivos. 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 contree
utilidad:
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
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/modules
/etc/nginx/modules
etc/nginx/modules
es 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.service
archivo:
[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.
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/nginx
archivo:
[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.default
archivos en/etc/nginx
. Elimina.default
archivos del/etc/nginx
directorio:
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.
Creaconf.d
snippets
,sites-available
ysites-enabled
directorios en/etc/nginx
directorio:
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_POLY1305
y 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.