Добавление модулей nginx в Linux (Debian/Ubuntu/CentOS/AlmaLinux)

При установке nginx штатными средствами ОС в Linux (apt, aptitude, yum, dnf) нет возможности сконфигурировать его установку, чтобы добавить или убрать какие-либо модули и nginx устанавливается «как есть».

Что же делать, если нам необходимо добавить какой-либо модуль? Правильно, нужно пересобрать nginx вручную. О том, как это правильно сделать в Linux, рассказываем в статье.

Добавление модулей nginx в Linux (Debian/Ubuntu/CentOS/AlmaLinux)

Предположим, для примера, что нам необходимо добавить в nginx модуль http_mp4_module. Вывод команды nginx -V покажет нам, что nginx собран без него.

nginx -V

Результат:

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

 

Сохраним вывод команды nginx -V в какой-нибудь текстовый редактор — эта информация нам пригодится при конфигурировании. Видим, что версия nginx у нас установлена 1.18.0 — скачиваем такую же версию:

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

Распакуем архив и перейдём в папку nginx-1.18.0:

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

Далее для сборки нам потребуется установить в систему дополнительные пакеты.

Для Debian/Ubuntu выполняем:

apt install build-essential 

После предложения продолжить установку — Do you want to continue? [Y/n] — нажимаем Y.

Для CentOS/AlmaLinux выполняем:

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

После предложения продолжить установку — Is this ok [y/d/N] — нажимаем y.

После установки пакетов приступаем к конфигурированию nginx с добавлением модуля http_mp4_module.

Для этого копируем из текстового редактора вывод команды nginx -V, начиная с --prefix= и до первого --add-module= (все присутствующие в выводе --add_module= нам не нужны). После чего пишем в консоли ./configure и вставляем скопированное из редактора. В нашем случае есть вывод:

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

поэтому просто копируем все, кроме этой строки.

В конец строки добавляем --with-http_mp4_module чтобы получилось так:

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

Нажимаем Enter и ждём окончания процесса.

В процессе конфигурирования возможно будут появляться ошибки. Способы их устранения описаны ниже.

Ошибка:

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

Для Debian/Ubuntu исправляется установкой libpcre++-dev:

apt install libpcre++-dev

Для CentOS/AlmaLinux исправляется установкой pcre-devel:

yum install pcre-devel

Ошибка:

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

Для Debian/Ubuntu:

apt install libssl-dev

Для CentOS/AlmaLinux:

yum install openssl-devel 

Ошибка:

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

Для Debian/Ubuntu:

apt install libgeoip-dev

Для CentOS/AlmaLinux:

yum install GeoIP-devel

Ошибка:

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

Для Debian/Ubuntu:

apt install libxslt1-dev

Для CentOS/AlmaLinux:

yum install libxslt-devel

Ошибка:

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

Для Debian/Ubuntu:

apt install zlib1g-dev

Для CentOS/AlmaLinux:

yum install zlib-devel

Ошибка:

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

Для Debian/Ubuntu:

apt install libgd-dev

Для CentOS/AlmaLinux:

yum install gd gd-devel

Каждый раз после apt install или yum install недостающего пакета запускаем заново.

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

После успешного окончания конфигурирования увидим на экране что-то вроде:

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"

Теперь можно собрать бинарник nginx — выполняем 2 команды:

make
make install

По окончании сборки проверяем, что nginx собрался с нужным нам модулем:

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

Результат:

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

Как видим, --with-http_mp4_module в выводе команды присутствует — всё получилось. Осталось заменить текущий бинарник nginx новым, который мы только что собрали.

Останавливаем nginx:

systemctl stop nginx

Переименовываем (на всякий случай) текущий nginx в nginx_back:

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

Перемещаем на его место новый собраный бинарник:

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

Удаляем ненужную больше папку /etc/nginx/sbin:

rm -Rf /usr/share/nginx/sbin

Проверяем ещё раз, что nginx у нас теперь тот, что нужно:

nginx -V

Результат:

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

Запускаем nginx:

systemctl start nginx

Удаляем ненужную больше папку и архив nginx-1.8.1:

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

Этот материал был полезен?