Cómo construir Nginx desde el código fuente en Fedora 29

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 lasintaxis--add-dynamic-module=/path/to/moduley luego los cargamos utilizando la 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.

Requisitos

  • Un servidor con sistema Fedora 29.
  • Un usuario no root con privilegios sudo.

Pasos iniciales

Comprueba tu versión de Fedora:

cat /etc/fedora-release
# Fedora release 29 (Twenty Nine)

Configura la zona horaria:

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

Actualiza los paquetes de tu sistema operativo Fedora:

sudo dnf upgrade -y

Instala los paquetes vim, curl, wget y tree:

sudo dnf install -y vim curl wget tree

Construye Nginx desde el código fuente

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

sudo dnf 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 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 dnf install -y perl perl-devel perl-ExtUtils-Embed libxslt libxslt-devel libxml2 libxml2-devel gd gd-devel GeoIP GeoIP-devel

Limpia todos los archivos.tar.gzarchivos, ya que no son necesarios:

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

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=Fedora \
            --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/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 ~

Enlaza con/usr/lib64/nginx/modulesa/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.8 (Fedora)
# built by gcc 8.2.1 20150623 (Red Hat 8.2.1-6) (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
# 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 systemd de Nginx:

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

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

NOTA:La ubicación delarchivoPIDy 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. Elimina.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.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-enableden 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 una configuración de rotación de registros para Nginx.

sudo vim /etc/logrotate.d/nginx

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

/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 inicial:

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 los protocolos comoTLS 1.3que 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...