Al instalar nginx usando herramientas estándar del sistema operativo en Linux (apt, aptitude, yum, dnf), no es posible configurar su instalación para agregar o quitar ningún módulo y nginx se instala «tal cual».

Supongamos, por ejemplo, que necesitamos agregar el módulo http_mp4_module a nginx. La salida del comando nginx-V nos mostrará que nginx se compiló sin él.

nginx -V

Resultado:

nginx version: nginx/1.18.0 (Ubuntu)
built with OpenSSL 1.1.1f  31 Mar 2020
TLS SNI support enabled
configure arguments: --with-cc-opt='-g -O2 -fdebug-prefix-map=/build/nginx-lUTckl/nginx-1.18.0=. 
-fstack-protector-strong -Wformat -Werror=format-security -fPIC -Wdate-time 
-D_FORTIFY_SOURCE=2' --with-ld-opt='-Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -fPIC' 
--prefix=/usr/share/nginx --conf-path=/etc/nginx/nginx.conf --http-log-path=/var/log/nginx/access.log 
--error-log-path=/var/log/nginx/error.log --lock-path=/var/lock/nginx.lock --pid-path=/run/nginx.pid 
--modules-path=/usr/lib/nginx/modules --http-client-body-temp-path=/var/lib/nginx/body 
--http-fastcgi-temp-path=/var/lib/nginx/fastcgi --http-proxy-temp-path=/var/lib/nginx/proxy 
--http-scgi-temp-path=/var/lib/nginx/scgi --http-uwsgi-temp-path=/var/lib/nginx/uwsgi --with-debug 
--with-compat --with-pcre-jit --with-http_ssl_module --with-http_stub_status_module 
--with-http_realip_module --with-http_auth_request_module --with-http_v2_module 
--with-http_dav_module --with-http_slice_module --with-threads --with-http_addition_module 
--with-http_gunzip_module --with-http_gzip_static_module --with-http_image_filter_module=dynamic 
--with-http_sub_module --with-http_xslt_module=dynamic --with-stream=dynamic 
--with-stream_ssl_module --with-mail=dynamic --with-mail_ssl_module

Guardemos la salida del comando nginx-V en algún editor de texto; esta información nos será útil durante la configuración. Vemos que la versión de nginx está instalada 1.18.0-descargamos la misma versión.:

wget http://nginx.org/download/nginx-1.18.0.tar.gz

Descomprima el archivo y vaya a la carpeta nginx-1.18.0.:

tar -xvf nginx-1.18.0.tar.gz
cd nginx-1.18.0

A continuación, necesitaremos instalar paquetes adicionales en el sistema para compilarlo.

Para Debian / Ubuntu, realizamos:

apt install build-essential

Después de la sugerencia de continuar con la instalación, ¿quieres continuar? [Y/n] — presione Y.

Para CentOS / AlmaLinux, realizamos

yum install gcc gcc-c++ kernel-devel
yum groupinstall 'Development Tools'

Después de la sugerencia de continuar con la instalación, ¿está bien [y/d/N] — presione y.

Luego de instalar los paquetes, procedemos a configurar nginx con la adición del módulo http_mp4_module.

Para hacer esto, copie la salida del comando nginx-V desde el editor de texto, comenzando con-prefix = y hasta el primer-add-module= (no necesitamos todos los-add_module= presentes en la salida). Después de eso, escribimos en la consola ./configure y pegue la imagen copiada desde el editor. En nuestro caso, hay una conclusión:

--add-dynamic-module=/build/nginx-d8gVax/nginx-1.18.0/debian/modules/http-geoip2

por lo tanto, simplemente copiamos todo excepto esta línea.

Agregue-with-http_mp4_module al final de la línea para que se vea así:

./configure --prefix=/usr/share/nginx --conf-path=/etc/nginx/nginx.conf 
--http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log 
--lock-path=/var/lock/nginx.lock --pid-path=/run/nginx.pid --modules-path=/usr/lib/nginx/modules 
--http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fastcgi 
--http-proxy-temp-path=/var/lib/nginx/proxy --http-scgi-temp-path=/var/lib/nginx/scgi 
--http-uwsgi-temp-path=/var/lib/nginx/uwsgi --with-debug --with-compat --with-pcre-jit 
--with-http_ssl_module --with-http_stub_status_module --with-http_realip_module 
--with-http_auth_request_module --with-http_v2_module --with-http_dav_module 
--with-http_slice_module --with-threads --with-http_addition_module --with-http_gunzip_module 
--with-http_gzip_static_module --with-http_image_filter_module=dynamic --with-http_sub_module 
--with-http_xslt_module=dynamic --with-stream=dynamic --with-stream_ssl_module 
--with-mail=dynamic --with-mail_ssl_module --with-http_mp4_module

Presione Entrar y espere a que finalice el proceso.

Pueden producirse errores durante el proceso de configuración. Las formas de eliminarlos se describen a continuación.

Error:

./configure: error: the HTTP rewrite module requires the PCRE library.
You can either disable the module by using --without-http_rewrite_module
option, or install the PCRE library into the system, or build the PCRE library
statically from the source with nginx by using --with-pcre=<path> option.

Para Debian / Ubuntu, se soluciona instalando libpcre++ – dev:

apt install libpcre++-dev

Para CentOS / AlmaLinux, se soluciona instalando pcre-devel:

yum install pcre-devel

Error:

./configure: error: SSL modules require the OpenSSL library.
You can either do not enable the modules, or install the OpenSSL library
into the system, or build the OpenSSL library statically from the source
with nginx by using --with-openssl=<path> option.

Para Debian / Ubuntu:

apt install libssl-dev

Para CentOS / AlmaLinux:

yum install openssl-devel

Error:

./configure: error: the GeoIP module requires the GeoIP library.
You can either do not enable the module or install the library

Para Debian / Ubuntu:

apt install libgeoip-dev

Para CentOS / AlmaLinux:

yum install GeoIP-devel

Error:

./configure: error: the HTTP XSLT module requires the libxml2/libxslt
libraries. You can either do not enable the module or install the libraries.

Para Debian / Ubuntu:

apt install libxslt1-dev

Para CentOS / AlmaLinux:

yum install libxslt-devel

Error:

./configure: error: the HTTP gzip module requires the zlib library
You can either do not enable the module or install the libraries.

Para Debian / Ubuntu:

apt install zlib1g-dev

Para CentOS / AlmaLinux:

yum install zlib-devel

Error:

./configure: error: the HTTP image filter module requires the GD library.
You can either do not enable the module or install the libraries.

Para Debian/Ubuntu:

apt install libgd-dev

Para CentOS / AlmaLinux:

yum install gd gd-devel

Cada vez después de apt install o yum install, reiniciamos el paquete faltante.

./configure --prefix=/usr/share/nginx --conf-path=/etc/nginx/nginx.conf 
--http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log 
--lock-path=/var/lock/nginx.lock --pid-path=/run/nginx.pid --modules-path=/usr/lib/nginx/modules 
--http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fastcgi 
--http-proxy-temp-path=/var/lib/nginx/proxy --http-scgi-temp-path=/var/lib/nginx/scgi 
--http-uwsgi-temp-path=/var/lib/nginx/uwsgi --with-compat --with-debug --with-pcre-jit 
--with-http_ssl_module --with-http_stub_status_module --with-http_realip_module 
--with-http_auth_request_module --with-http_v2_module --with-http_dav_module 
--with-http_slice_module --with-threads --with-http_addition_module --with-http_gunzip_module 
--with-http_gzip_static_module --with-http_sub_module --with-http_mp4_module

Después de completar con éxito la configuración, veremos en la pantalla algo como:

Configuration summary
  + using threads
  + using system PCRE library
  + using system OpenSSL library
  + using system zlib library

  nginx path prefix: "/usr/share/nginx"
  nginx binary file: "/usr/share/nginx/sbin/nginx"
  nginx modules path: "/usr/lib/nginx/modules"
  nginx configuration prefix: "/etc/nginx"
  nginx configuration file: "/etc/nginx/nginx.conf"
  nginx pid file: "/run/nginx.pid"
  nginx error log file: "/var/log/nginx/error.log"
  nginx http access log file: "/var/log/nginx/access.log"
  nginx http client request body temporary files: "/var/lib/nginx/body"
  nginx http proxy temporary files: "/var/lib/nginx/proxy"
  nginx http fastcgi temporary files: "/var/lib/nginx/fastcgi"
  nginx http uwsgi temporary files: "/var/lib/nginx/uwsgi"
  nginx http scgi temporary files: "/var/lib/nginx/scgi"

Ahora puede compilar el binario nginx: ejecute 2 comandos:

make
make install

Al final de la compilación, verificamos que nginx esté ensamblado con el módulo que necesitamos.:

/usr/share/nginx/sbin/nginx -V

Resultado:

nginx version: nginx/1.18.0
built by gcc 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04.1)
built with OpenSSL 1.1.1f  31 Mar 2020
TLS SNI support enabled
configure arguments: --prefix=/usr/share/nginx --conf-path=/etc/nginx/nginx.conf 
--http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log 
--lock-path=/var/lock/nginx.lock --pid-path=/run/nginx.pid --modules-path=/usr/lib/nginx/modules 
--http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fastcgi 
--http-proxy-temp-path=/var/lib/nginx/proxy --http-scgi-temp-path=/var/lib/nginx/scgi 
--http-uwsgi-temp-path=/var/lib/nginx/uwsgi --with-debug --with-compat --with-pcre-jit 
--with-http_ssl_module --with-http_stub_status_module --with-http_realip_module 
--with-http_auth_request_module --with-http_v2_module --with-http_dav_module 
--with-http_slice_module --with-threads --with-http_addition_module --with-http_gunzip_module 
--with-http_gzip_static_module --with-http_image_filter_module=dynamic --with-http_sub_module 
--with-http_xslt_module=dynamic --with-stream=dynamic --with-stream_ssl_module 
--with-mail=dynamic --with-mail_ssl_module --with-http_mp4_module

Como puede ver – – with-http_mp4_module está presente en la salida del comando, todo salió bien. Queda por reemplazar el binario nginx actual por el nuevo que acabamos de compilar.

Detener nginx:

systemctl stop nginx

Cambie el nombre (por si acaso) del nginx actual a nginx_back:

mv /usr/sbin/nginx /usr/sbin/nginx_back

Mover el binario recién ensamblado a su lugar:

mv /usr/share/nginx/sbin/nginx /usr/sbin/nginx

Eliminando la carpeta innecesaria /etc/nginx/sbin:

rm -Rf /usr/share/nginx/sbin

Comprobamos nuevamente que nginx es ahora el adecuado para nosotros.:

nginx -V

Resultado:

nginx version: nginx/1.18.0
built by gcc 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04.1)
built with OpenSSL 1.1.1f  31 Mar 2020
TLS SNI support enabled
configure arguments: --prefix=/usr/share/nginx --conf-path=/etc/nginx/nginx.conf 
--http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log 
--lock-path=/var/lock/nginx.lock --pid-path=/run/nginx.pid --modules-path=/usr/lib/nginx/modules 
--http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fastcgi 
--http-proxy-temp-path=/var/lib/nginx/proxy --http-scgi-temp-path=/var/lib/nginx/scgi 
--http-uwsgi-temp-path=/var/lib/nginx/uwsgi --with-debug --with-compat --with-pcre-jit 
--with-http_ssl_module --with-http_stub_status_module --with-http_realip_module 
--with-http_auth_request_module --with-http_v2_module --with-http_dav_module 
--with-http_slice_module --with-threads --with-http_addition_module --with-http_gunzip_module 
--with-http_gzip_static_module --with-http_image_filter_module=dynamic --with-http_sub_module 
--with-http_xslt_module=dynamic --with-stream=dynamic --with-stream_ssl_module 
--with-mail=dynamic --with-mail_ssl_module --with-http_mp4_module

Lanzamiento de nginx:

systemctl start nginx

Eliminando la carpeta innecesaria y el archivo nginx-1.8.1:

cd ../
rm -Rf nginx-1.18.0/
rm -Rf nginx-1.18.0.tar.gz