Cómo compilar NGINX desde la fuente en Ubuntu 18.04 LTS

Cómo compilar NGINX desde la fuente en Ubuntu 18.04 LTS

NGINX (pronunciado ¬ęmotor x¬Ľ) es un software de servidor web de c√≥digo abierto dise√Īado teniendo en cuenta una alta concurrencia, que se puede utilizar como servidor HTTP/HTTPS, servidor proxy inverso, servidor proxy de correo, equilibrador de carga de software, terminador TLS, servidor de almacenamiento en cach√©… .

Es una pieza de software extremadamente modular. Incluso algunas de las piezas aparentemente ¬ęincorporadas¬Ľ del software, como GZIP o SSL, en realidad est√°n construidas como m√≥dulos que se pueden habilitar y deshabilitar durante el tiempo de compilaci√≥n.

Tiene módulos centrales (nativos) y módulos de terceros (externos) creado por la comunidad. En este momento, hay más de cien módulos de terceros que podemos utilizar.

Escrito en C lenguaje, es una pieza de software muy r√°pida y ligera.

Instalar NGINX desde el c√≥digo fuente es relativamente ¬ęf√°cil¬Ľ: descargue la √ļltima versi√≥n del c√≥digo fuente de NGINX, config√ļrelo, comp√≠lelo e inst√°lelo.

Deberá elegir si desea descargar la versión principal o la versión estable, 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 usaremos la versi√≥n principal que se encuentra en 1.15.0 en el momento de escribir este art√≠culo. Actualice los n√ļmeros de versi√≥n cuando haya versiones m√°s nuevas disponibles.

Versión estable vs. principal

NGINX Open Source est√° disponible en dos versiones:

  • Mainline: incluye las √ļltimas funciones y correcciones de errores y siempre est√° actualizado. Es confiable, pero puede incluir algunos m√≥dulos experimentales y tambi√©n puede tener algunos errores nuevos.
  • Estable: no incluye todas las funciones m√°s recientes, pero tiene correcciones de errores cr√≠ticos que siempre se adaptan a la versi√≥n principal.

Módulos principales frente a módulos de terceros

NGINX tiene dos tipos de módulos que puede utilizar: módulos principales y módulos de terceros.

Los módulos principales están construidos por los desarrolladores principales de NGINX y son parte del software en sí.

Los m√≥dulos de terceros son creados por la comunidad y puede usarlos para ampliar la funcionalidad de NGINX. Hay muchos m√≥dulos √ļtiles de terceros, los m√°s famosos son: PageSpeed, ModSecurity, RTMP, Lua, etc.

Módulos estáticos frente a 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 m√≥dulos est√°ticos, el conjunto de m√≥dulos que constituyen un binario NGINX se corrige en tiempo de compilaci√≥n mediante el script ./configure. Los m√≥dulos est√°ticos utilizan la sintaxis –with-foo_bar_module o –add-module=PATH.

Para compilar el m√≥dulo central (est√°ndar) como din√°mico, agregamos =dynamic, por ejemplo –with-http_image_filter_module=dynamic.

Para compilar m√≥dulos de terceros como din√°micos, usamos la sintaxis –add-dynamic-module=/path/to/module y luego los cargamos usando la directiva load_module en el contexto global del archivo nginx.conf.

Requisitos para compilar NGINX desde el origen

En comparación con otro software de UNIX/Linux, NGINX es bastante liviano y no tiene muchas dependencias de biblioteca. La configuración de compilación predeterminada depende de que solo se instalen 3 bibliotecas: OpenSSL/LibreSSL/AburridoSSL, Zlib y PCRE.

  • Requisitos obligatorios:
  • Requisitos opcionales:

NOTA: NGINX también se puede compilar contra LibreSSL y AburridoSSL bibliotecas criptográficas en lugar de OpenSSL.

Requisitos

  • Un servidor con Ubuntu 18.04 LTS.
  • Un usuario no root con privilegios sudo.

Pasos iniciales

Compruebe la versión de Ubuntu:

lsb_release -ds 
# Ubuntu 18.04 LTS

Configurar la zona horaria:

timedatectl list-timezones
sudo timedatectl set-timezone 'Region/City'

Actualice los paquetes de su sistema operativo:

sudo apt update && sudo apt upgrade -y

Construya NGINX desde la fuente

NGINX es un programa escrito en C, por lo que primero deberá instalar una herramienta de compilación. Instale los paquetes build-essential, git y tree:

sudo apt install -y build-essential git tree

Descargue la √ļltima versi√≥n principal del c√≥digo fuente de NGINX y extr√°igalo. El c√≥digo fuente de NGINX se distribuye como archivo comprimido (tarball comprimido con gzip), como la mayor√≠a del software de Unix y Linux:

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

Descargue el código fuente de las dependencias NGINX obligatorias y extráigalas:

# 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.0h
wget https://www.openssl.org/source/openssl-1.1.0h.tar.gz && tar xzvf openssl-1.1.0h.tar.gz

Instale dependencias NGINX opcionales:

sudo add-apt-repository -y ppa:maxmind/ppa
sudo apt update && sudo apt upgrade -y
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 archivos .tar.gz. Ya no los necesitamos:

rm -rf *.tar.gz

Ingrese al directorio fuente de NGINX:

cd ~/nginx-1.15.0

Para una buena lista de directorios y archivos de medida que componen el código fuente de NGINX con la utilidad de árbol:

tree -L 2 .

Copie la p√°gina del manual de NGINX en el directorio /usr/share/man/man8/:

sudo cp ~/nginx-1.15.0/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, puede ver la lista completa de opciones de tiempo de compilación de NGINX actualizadas 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=Ubuntu \
            --builddir=nginx-1.15.0 \
            --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.26.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.0h \
            --with-openssl-opt=no-nextprotoneg \
            --with-debug

make
sudo make install

Después de compilar NGINX, vaya al directorio de inicio (~):

cd ~

Symlink /usr/lib/nginx/modules al directorio /etc/nginx/modules. etc/nginx/modules es un lugar estándar para los módulos NGINX:

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

Imprima la versión de NGINX, la versión del compilador y configure los parámetros del script: Publicidad

sudo nginx -V
# nginx version: nginx/1.15.0 (Ubuntu)
# built by gcc 7.3.0 (Ubuntu 7.3.0-16ubuntu3)
# built with OpenSSL 1.1.0h  27 Mar 2018
# TLS SNI support enabled
# configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib/nginx/modules
# . . .
# . . .

Crear grupo y usuario del sistema NGINX:

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

Verifique 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

Crear archivo de unidad systemd NGINX:

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

Copie y pegue el siguiente contenido en el archivo /etc/systemd/system/nginx.service:

[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

Habilite NGINX para que se inicie en el arranque e inicie NGINX inmediatamente:

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

Compruebe si NGINX se iniciará automáticamente después de reiniciar:

sudo systemctl is-enabled nginx.service
# enabled

Compruebe 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 puede abrir su navegador y navegar a su dominio/dirección IP para ver la página NGINX predeterminada. Ese es un indicador de que NGINX está funcionando.

P√°gina de bienvenida de Nginx

Crear un cortafuegos sin complicaciones (UFW) Perfil de aplicación NGINX:

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

Copie y pegue el siguiente contenido en el archivo /etc/ufw/applications.d/nginx:

[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

Verifique que los perfiles de aplicación de UFW se creen y reconozcan:

sudo ufw app list

# Available applications:
 # Nginx Full
 # Nginx HTTP
 # Nginx HTTPS
 # OpenSSH

NGINX de forma predeterminada genera archivos de copia de seguridad .default en /etc/nginx. Elimine los archivos .default del directorio /etc/nginx:

sudo rm /etc/nginx/*.default

Coloque el resaltado de sintaxis de la configuración de NGINX para el editor de Vim en ~/.vim:

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

NOTA: Al realizar el paso anterior, obtendrá un buen resaltado de sintaxis al editar archivos de configuración NGINX en el editor Vim.

Resaltado de sintaxis de Nginx en Vim

Cree directorios conf.d, fragmentos, sitios disponibles y sitios habilitados en el directorio /etc/nginx:

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

Cambie 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

Crear configuración de logrotation para NGINX.

sudo vim /etc/logrotate.d/nginx

Complete el archivo con el siguiente texto, luego guarde y salga:

/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
}

Eliminar todos los archivos descargados del directorio de inicio:

cd ~
rm -rf nginx-1.15.0/ openssl-1.1.0h/ pcre-8.42/ zlib-1.2.11/

Eso es todo. Ahora, tiene instalada la √ļltima versi√≥n de NGINX construy√©ndola a partir del c√≥digo fuente. Se compila est√°ticamente contra algunas bibliotecas importantes como OpenSSL. A menudo, la versi√≥n de OpenSSL proporcionada por el sistema est√° desactualizada. Al usar este m√©todo de instalaci√≥n con una versi√≥n m√°s nueva de OpenSSL, puede aprovechar los nuevos cifrados como CHACHA20_POLY1305 y protocolos como TLS 1.3 que estar√° disponible en OpenSSL 1.1.1. Adem√°s, al compilar su propio binario, puede personalizar la funcionalidad que proporcionar√° su NGINX, que es mucho m√°s flexible que instalar un binario preconstruido.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *