В этой небольшой заметке я кратко опишу что нужно делать, если необходимо пересобрать nginx вместе с кастомными модулями. Для примера возьмем nginx-rtmp-module, т.к. он мне потребовался для моего проекта. Процесс описан для ubuntu
, но скорее всего также будет работать на любой Debian
и производной от неё системе.
- Ставим 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
- Теперь чекаем версию и параметры сборки.
$ 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
- Качаем такую же версию 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
- Конфигурируем и собираем. Для конфигурации необходимо сохранить флаги используемые в дефолтном пакете, в конец добавляем ссылку на скаченный ранее модуль или на какой-то встроенный, примерно так
--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