Portfolio Обо мне Блог
10 October 2020
LINUX NGINX

В этой небольшой заметке я кратко опишу что нужно делать, если необходимо пересобрать nginx вместе с кастомными модулями. Для примера возьмем nginx-rtmp-module, т.к. он мне потребовался для моего проекта. Процесс описан для ubuntu, но скорее всего также будет работать на любой Debian и производной от неё системе.

  1. Ставим nginx и доп. софт.
sudo apt install nginx libpcre++-dev libssl-dev libxslt1-dev libgeoip-dev build-essential libpcre3 libgd-dev libgeoip-dev libxslt-dev libpcre3-dev openssl libssl-dev zlib1g zlib1g-dev 
  1. Теперь чекаем версию и параметры сборки.
$ nginx -V
nginx version: nginx/1.14.0
built by gcc 7.5.0 (Ubuntu 7.5.0-3ubuntu1~18.04) 
built with OpenSSL 1.1.1  11 Sep 2018
TLS SNI support enabled
configure arguments: --with-cc-opt='-g -O2 -fdebug-prefix-map=/build/nginx-GkiujU/nginx-1.14.0=. -fstack-protector-strong -Wformat -Werror=format-security -fPIC -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-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_geoip_module=dynamic --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
  1. Качаем такую же версию nginx и распаковываем, клоним с гита доп. модули в одну папку.
cd /tmp
wget http://nginx.org/download/nginx-1.14.0.tar.gz
tar -xf nginx-1.14.0.tar.gz
git clone git://github.com/arut/nginx-rtmp-module.git
cd nginx-1.14.0
  1. Конфигурируем и собираем. Для конфигурации необходимо сохранить флаги используемые в дефолтном пакете, в конец добавляем ссылку на скаченный ранее модуль или на какой-то встроенный, примерно так --add-module=../nginx-rtmp-module.
./configure --with-cc-opt='-g -O2 -fdebug-prefix-map=/build/nginx-GkiujU/nginx-1.14.0=. -fstack-protector-strong -Wformat -Werror=format-security -fPIC -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-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_geoip_module=dynamic --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 --add-module=../nginx-rtmp-module
make
sudo make install

Тут возможны проблемы из-за нехватки каких-то библиотек.

  • PCRE - sudo apt install libpcre3 libpcre3-dev
  • OpenSSL - sudo apt install openssl libssl-dev
  • Gzip - sudo apt install zlib1g zlib1g-dev
  • XSLT - sudo apt install libxslt-dev
  • GD - sudo apt install libgd-dev
  • GeoIP - sudo apt install libgeoip-dev

В случае ошибок macro "DATE"... и macro "TIME"... нужно удалить флаг -Wdate-time .

В случае error: this statement may fall through [-Werror=implicit-fallthrough=] (Свойственно RTMP модулю, описанному в этой инструкции) - необходимо добавить флаг --with-cc-opt="-Werror=implicit-fallthrough=0". Это частично отключает проверку ошибок и в целом плохой способ, но лучше нет.

Далее проверим что все установилось и наш флаг добавлен.

/usr/share/nginx/sbin/nginx -V
nginx version: nginx/1.14.0
built by gcc 7.5.0 (Ubuntu 7.5.0-3ubuntu1~18.04) 
built with OpenSSL 1.1.1  11 Sep 2018
TLS SNI support enabled
configure arguments: --with-cc-opt='-g -O2 -fdebug-prefix-map=/build/nginx-GkiujU/nginx-1.14.0=. -fstack-protector-strong -Wformat -Werror=format-security -fPIC -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-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_geoip_module=dynamic --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 --add-module=../nginx-rtmp-module

5) Останавливаем nginx, бекапим текущий бинарь, и подменяем его собранным. Проверяем, что в системе все работает и запускаем.

sudo service nginx stop
sudo mv /usr/sbin/nginx /usr/sbin/nginx_back
sudo mv /usr/share/nginx/sbin/nginx /usr/sbin/nginx
nginx -V
sudo service nginx start

Тут же можно протестировать новый модуль. В нашем случае это rtmp-module. Для его работы нужно добавить описание модуля в /etc/nginx/nginx.conf.

rtmp {
    server {
        listen 1935;
        chunk_size 4096;
        application live {
            live on;
            record off;
        }
    }
}

Еще раз перезапускаем.

sudo systemctl restart nginx

Если возникают какие-то ошибки, проверим статус:

systemctl status nginx.service

Проверим, не занят ли порт:

sudo netstat -ltnp | grep ':1935'

Если порт ничем не занят, а ошибка не связана с добавлением rtmp в конфиг, то решаем радикально - все удаляем. И начинаем с самого начала.

sudo apt remove nginx nginx-common
sudo apt purge nginx nginx-common
sudo apt autoremove

Если вдруг все работает, то можем удалить временные файлы:

sudo rm -rf /usr/share/nginx/sbin
cd ..
sudo rm -rf ./nginx-1.14.0