Cómo construir Nginx desde el código fuente en CentOS 7

Nginx (pronunciado«motor x») es un software de servidor web de código abierto diseñado pensando en la alta concurrencia, que puede utilizarse como servidor 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.

Tiene módulos centrales (nativos ) y módulos de terceros (externos)creados por la comunidad. Ahora mismo, hay más de cien módulos de terceros que podemos utilizar.

Escrito en lenguaje C , 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ónmainline o la 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 utilizaremosmainlineque está en1.15.7en 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ódulos centrales y mó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 o --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 utilizando la directivaload_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, Zlib y PCRE.

NOTA: Nginx también puede compilarse con LibreSSL y BoringSSLen lugar de las bibliotecas criptográficasOpenSSL.

Requisitos

  • Un servidor con sistema CentOS 7.
  • Un usuario no root con privilegios sudo.

Pasos iniciales

Comprueba la versión de CentOS:

cat /etc/centos-release
# CentOS Linux release 7.6.1810 (Core)

Configura la zona horaria:

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

Actualiza los paquetes de tu sistema operativo CentOS:

sudo yum update -y

Instala los paquetes vim, curl, wget y tree:

sudo yum install -y vim curl wget tree

Construye Nginx desde el código fuente

Nginx es un programa escrito en Cpor lo que primero tendrás que instalar un compilador de herramientas:

sudo yum groupinstall -y 'Development Tools'

Descarga la última versión mainline 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 de los programas de Unix y Linux:

wget https://nginx.org/download/nginx-1.15.7.tar.gz && tar zxvf nginx-1.15.7.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 yum install -y perl perl-devel perl-ExtUtils-Embed libxslt libxslt-devel libxml2 libxml2-devel gd gd-devel GeoIP GeoIP-devel

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

rm -rf *.tar.gz

Entra en el directorio fuente de Nginx:

cd ~/nginx-1.15.7

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

tree -L 2 .

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

sudo cp ~/nginx-1.15.7/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

Como ayuda, puedes ver la lista completa de opciones actualizadas de Nginx en tiempo de compilación 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/lib64/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=CentOS \
            --builddir=nginx-1.15.7 \
            --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/lib64/perl5 \
            --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 ~

Symlin k /usr/lib64/nginx/modules a /etc/nginx/modulesdirectorio. etc/nginx/moduleses un lugar estándar para los módulos de Nginx:

sudo ln -s /usr/lib64/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.7 (CentOS)
# built by gcc 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC)
# 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/lib64/nginx/modules
# . . .
# . . .

Crea el grupo y el usuario del sistema Nginx:

sudo useradd --system --home /var/cache/nginx --shell /sbin/nologin --comment "nginx user" --user-group nginx

Comprueba la sintaxis de Nginx y los posibles errores:

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:

NOTA: La ubicación del archivoPIDy del binario de Nginx puede ser diferente dependiendo de cómo se haya compilado Nginx.

[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 iniciará 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á en funcionamiento.

Página de bienvenida de Nginx

Nginx, por defecto, genera copias de seguridad .defaultde archivos en /etc/nginx. Elimin a .defaultarchivos de /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.7/contrib/vim/* ~/.vim/
# For root user
sudo mkdir /root/.vim/
sudo cp -r ~/nginx-1.15.7/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

Cre a conf.d, snippets, sites-available y sites-enabled en el directorio/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.7/ 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 como CHACHA20_POLY1305y los protocolos como TLS 1.3 que se soportan en OpenSSL 1. 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...