Поиск по сайту:

Как собрать Nginx из исходников на Debian 9


На этой странице

  1. Стабильная и основная версии
  2. Основные модули в сравнении со сторонними модулями
  3. Статические модули и динамические модули
  4. Требования для сборки Nginx из исходного кода
  5. Требования
  6. Начальные шаги
  7. Сборка Nginx из исходного кода

Nginx (произносится \engine x\) – это программное обеспечение веб-сервера с открытым исходным кодом, разработанное с учетом высокой степени параллелизма, которое можно использовать в качестве HTTP/HTTPS-сервераобратный прокси-серверпочтовый прокси-серверпрограммный балансировщик нагрузкитерминатор TLSкэширующий сервер ...

Это чрезвычайно модульная часть программного обеспечения. Даже некоторые из кажущихся «встроенными» частей программного обеспечения, такие как GZIP или SSL, на самом деле построены как модули, которые можно включать и отключать во время сборки.

В нем есть основные (собственныемодули и сторонние (внешние) модули, созданные сообществом. Прямо сейчас мы можем использовать более сотни сторонних модулей.

Написанное на языке C, это очень быстрое и легкое программное обеспечение.

Установка Nginx из исходного кода относительно «проста» — загрузите последнюю версию исходного кода Nginx, настройте, соберите и установите ее.

Вам нужно будет выбрать, загружать ли основную или стабильную версию, но их сборка абсолютно одинакова.

В этом руководстве мы создадим Nginx со всеми доступными модулями в версии Nginx с открытым исходным кодом, и мы будем использовать основную версию, которая на момент написания этой статьи была 1.15.8. Обновите номера версий, когда станут доступны более новые версии.

Стабильная и основная версия

Nginx с открытым исходным кодом доступен в двух версиях:

  • Основная ветка – содержит новейшие функции и исправления ошибок, а также постоянно обновляется. Он надежен, но может включать некоторые экспериментальные модули, а также может иметь некоторое количество новых ошибок.
  • Стабильная – не включает все новейшие функции, но содержит исправления критических ошибок, которые всегда переносятся в основную версию.

Основные модули против сторонних модулей

В Nginx есть два типа модулей, которые вы можете использовать: основные модули и сторонние модули.

Основные модули создаются основными разработчиками Nginx и являются частью самого программного обеспечения.

Сторонние модули создаются сообществом, и вы можете использовать их для расширения функциональности Nginx. Есть много полезных сторонних модулей, самые известные из них: PageSpeed, ModSecurity, RTMP, Lua и т.д...

Статические модули против динамических модулей

Статические модули существуют в Nginx с самой первой версии. Динамические модули были представлены в Nginx 1.9.11+ в феврале 2016 года.

При использовании статических модулей набор модулей, составляющих двоичный файл Nginx, фиксируется во время компиляции с помощью сценария ./configure . Статические модули используют синтаксис --with-foo_bar_module или --add-module=PATH.

Чтобы скомпилировать основной (стандартный) модуль как динамический, мы добавляем =dynamic, например, --with-http_image_filter_module=dynamic.

Чтобы скомпилировать сторонний модуль как динамический, мы используем синтаксис --add-dynamic-module=/path/to/module, а затем загружаем их с помощью директивы load_module в глобальный контекст файла nginx.conf .

Требования для сборки Nginx из исходников

По сравнению с некоторым другим программным обеспечением UNIX/Linux, Nginx довольно легковесен и не имеет большого количества зависимостей от библиотек. Конфигурация сборки по умолчанию зависит от установки только трех библиотек: OpenSSL/LibreSSL/BoringSSL, Zlib и PCRE.

  • Обязательные требования:
    • Коллекция компиляторов GNU (GCC)
    • Библиотека BoringSSL 
    • Версия библиотеки Zlib от 1.1.3 до 1.2.11
    • Версия библиотеки PCRE между 4.4 – 8.42

    • Перл
    • Библиотека GD
    • Библиотека MaxMind GeoIP Legacy C
    • libxml2
    • libxslt

    ПРИМЕЧАНИЕ. Nginx также можно скомпилировать с использованием криптографических библиотек LibreSSL и BoringSSL вместо OpenSSL.

    Требования

    • Сервер под управлением Debian 9 (растянутый).
    • Пользователь без полномочий root с привилегиями sudo.

    Начальные шаги

    Проверьте версию Debian:

    lsb_release -ds 
    # Debian GNU/Linux 9.6 (stretch)

    Установите пакеты wgetcurl и sudo .

    apt install -y wget curl sudo

    Настройте часовой пояс:

    sudo dpkg-reconfigure tzdata

    Обновите пакеты вашей операционной системы:

    apt update && apt upgrade -y

    Собрать Nginx из исходников

    Nginx — это программа, написанная на C, поэтому сначала вам нужно установить инструменты компилятора. Установите пакет build-essential и другие необходимые пакеты:

    sudo apt install -y build-essential git tree software-properties-common dirmngr apt-transport-https ufw

    Загрузите последнюю основную версию исходного кода Nginx и распакуйте ее. Исходный код Nginx распространяется в виде сжатого архива (сжатого архива), как и большинство программ для Unix и Linux:

    wget https://nginx.org/download/nginx-1.15.8.tar.gz && tar zxvf nginx-1.15.8.tar.gz

    Загрузите исходный код обязательных зависимостей Nginx и извлеките их:

    # 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

    Установите дополнительные зависимости Nginx:

    sudo apt install -y perl libperl-dev libgd3 libgd-dev libgeoip1 libgeoip-dev geoip-bin libxml2 libxml2-dev libxslt1.1 libxslt1-dev

    Очистите все файлы .tar.gz . Они нам больше не нужны:

    rm -rf *.tar.gz

    Войдите в исходный каталог Nginx:

    cd ~/nginx-1.15.8

    Чтобы получить хороший список каталогов и файлов, составляющих исходный код Nginx, используйте утилиту tree:

    tree -L 2 .

    Скопируйте страницу руководства Nginx в каталог /usr/share/man/man8/:

    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

    Для справки вы можете увидеть полный список актуальных параметров времени компиляции Nginx, выполнив:

    ./configure --help
    # To see want core modules can be build as dynamic run:
    ./configure --help | grep -F =dynamic

    Настройте, скомпилируйте и установите Nginx:

    ./configure --prefix=/etc/nginx \
                --sbin-path=/usr/sbin/nginx \
                --modules-path=/usr/lib/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=Debian \
                --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/share/perl/5.24.1 \
                --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

    После сборки Nginx перейдите в домашний (~) каталог:

    cd ~

    Симлинк /usr/lib/nginx/modules в каталог /etc/nginx/modules. etc/nginx/modules – стандартное место для модулей Nginx:

    sudo ln -s /usr/lib/nginx/modules /etc/nginx/modules

    Распечатайте версию Nginx, версию компилятора и настройте параметры скрипта:

    sudo nginx -V
    # nginx version: nginx/1.15.8 (Debian)
    # built by gcc 6.3.0 (Debian 6.3.0-18+deb9u1)
    # 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/lib/nginx/modules
    # . . .
    # . . .

    Создайте системную группу и пользователя Nginx:

    sudo adduser --system --home /nonexistent --shell /bin/false --no-create-home --disabled-login --disabled-password --gecos "nginx user" --group nginx

    Проверьте синтаксис Nginx и возможные ошибки:

    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

    Создайте файл системного модуля Nginx:

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

    Скопируйте/вставьте приведенный ниже контент в файл /etc/systemd/system/nginx.service :

    [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

    Включите Nginx для запуска при загрузке и сразу же запустите Nginx:

    sudo systemctl enable nginx.service
    sudo systemctl start nginx.service

    Проверьте, запустится ли Nginx автоматически после перезагрузки:

    sudo systemctl is-enabled nginx.service
    # enabled

    Проверьте, запущен ли Nginx, выполнив одну из следующих команд:

    sudo systemctl status nginx.service
    # or
    ps aux | grep nginx
    # or
    curl -I 127.0.0.1

    Вы также можете открыть браузер и перейти к своему домену/IP-адресу, чтобы увидеть страницу Nginx по умолчанию. Это показатель того, что Nginx запущен и работает.

    Создайте профиль приложения Uncomplicated Firewall (UFW) Nginx:

    sudo vim /etc/ufw/applications.d/nginx

    Скопируйте/вставьте приведенный ниже контент в файл /etc/ufw/applications.d/nginx :

    [nginx HTTP]
    title=Web Server (nginx, HTTP)
    description=Small, but very powerful and efficient web server
    ports=80/tcp
    
    [nginx HTTPS]
    title=Web Server (nginx, HTTPS)
    description=Small, but very powerful and efficient web server
    ports=443/tcp
    
    [nginx Full]
    title=Web Server (nginx, HTTP + HTTPS)
    description=Small, but very powerful and efficient web server
    ports=80,443/tcp

    Убедитесь, что профили приложений UFW созданы и распознаны:

    sudo ufw app list

    # Available applications:
     # nginx Full
     # nginx HTTP
     # nginx HTTPS

    nginx по умолчанию создает резервные файлы .default в /etc/nginx. Удалите файлы .default из каталога /etc/nginx:

    sudo rm /etc/nginx/*.default

    Поместите подсветку синтаксиса конфигурации nginx для редактора Vim в ~/.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/

    ПРИМЕЧАНИЕ. Выполнив описанный выше шаг, вы получите хорошую подсветку синтаксиса при редактировании файлов конфигурации Nginx в редакторе Vim.

    Создайте каталоги conf.dsnippetssites-available и sites-enabled в /etc/ каталог nginx:

    sudo mkdir /etc/nginx/{conf.d,snippets,sites-available,sites-enabled}

    Изменить разрешения и групповое владение файлами журнала nginx:

    sudo chmod 640 /var/log/nginx/*
    sudo chown nginx:adm /var/log/nginx/access.log /var/log/nginx/error.log

    Создайте конфигурацию logrotation для Nginx.

    sudo vim /etc/logrotate.d/nginx

    Заполните файл приведенным ниже текстом, затем сохраните и выйдите:

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

    Удалите все загруженные файлы из домашнего каталога:

    cd ~
    rm -rf nginx-1.15.8/ openssl-1.1.1a/ pcre-8.42/ zlib-1.2.11/

    Вот и все. Теперь у вас установлена последняя версия Nginx, собранная из исходного кода. Он скомпилирован статически с некоторыми важными библиотеками, такими как OpenSSL. Часто системная версия OpenSSL устарела. Используя этот метод установки с более новой версией OpenSSL, вы можете воспользоваться преимуществами новых шифров, таких как CHACHA20_POLY1305 и протоколов, таких как TLS 1.3, доступных в OpenSSL 1.1.1. Кроме того, скомпилировав свой собственный двоичный файл, вы можете настроить функциональность, которую будет предоставлять ваш Nginx, что намного более гибко, чем установка предварительно созданного двоичного файла.