Как собрать Nginx из исходников на CentOS 7
На этой странице
- Стабильная и основная версии
- Основные модули в сравнении со сторонними модулями
- Статические модули и динамические модули
- Требования для сборки Nginx из исходного кода
- Требования
- Сборка 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.d
,snippets
,sites-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, что намного более гибко, чем установка предварительно созданного двоичного файла.