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

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


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

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

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

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

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

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

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

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

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

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

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.

    Требования

    • Сервер с системой CentOS 7.
    • Пользователь без полномочий root с привилегиями sudo.

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

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

    cat /etc/centos-release
    # CentOS Linux release 7.6.1810 (Core)

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

    timedatectl list-timezones
    sudo timedatectl set-timezone 'Region/City'

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

    sudo yum update -y

    Установите пакеты vim, curl, wget и tree:

    sudo yum install -y vim curl wget tree

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

    Nginx — это программа, написанная на C, поэтому вам сначала нужно установить инструменты компилятора:

    sudo yum groupinstall -y 'Development Tools'

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

    wget https://nginx.org/download/nginx-1.15.7.tar.gz && tar zxvf nginx-1.15.7.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 yum install -y perl perl-devel perl-ExtUtils-Embed libxslt libxslt-devel libxml2 libxml2-devel gd gd-devel GeoIP GeoIP-devel

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

    rm -rf *.tar.gz

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

    cd ~/nginx-1.15.7

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

    tree -L 2 .

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

    sudo cp ~/nginx-1.15.7/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/lib64/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=CentOS \
                --builddir=nginx-1.15.7 \
                --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/lib64/perl5 \
                --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/lib64/nginx/modules в каталог /etc/nginx/modules . etc/nginx/modules – стандартное место для модулей Nginx:

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

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

    sudo nginx -V
    # nginx version: nginx/1.15.7 (CentOS)
    # built by gcc 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC)
    # 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/lib64/nginx/modules
    # . . .
    # . . .

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

    sudo useradd --system --home /var/cache/nginx --shell /sbin/nologin --comment "nginx user" --user-group nginx

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

    sudo nginx -t

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

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

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

    ПРИМЕЧАНИЕ. Расположение файла PID и двоичного файла Nginx может различаться в зависимости от того, как был скомпилирован Nginx.

    [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 запущен и работает.

    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.7/contrib/vim/* ~/.vim/
    # For root user
    sudo mkdir /root/.vim/
    sudo cp -r ~/nginx-1.15.7/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.7/ 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, что намного более гибко, чем установка предварительно созданного двоичного файла.