Установка Nginx 1.11.10 из исходников в Ubuntu Server 16.04 LTS.

В данной статье я хочу рассмотреть установку веб-сервера Nginx самой последней версии, на примере операционной системы Ubuntu Server 16.04. В качестве основы будущего сервера эта операционная система была выбрана не случайно, выбор системы основывался на определенной версии встроенных библиотек OpenSSL.

Дело в том, что изначально было задумано постепенно перевести сайт на HTTPS шифрование, дополнительно прикрутив поддержку нового протокола HTTP/2, а для этого необходимо наличие библиотек OpenSSL не ниже 1.0.2 версии. На данный момент нужная версия библиотек OpenSSL присутствует лишь в Ubuntu Server 16.04, которая поставляется с ними "из коробки".

openssl ubuntuКонечно версию библиотек можно и обновить, можно собрать Nginx с нужными библиотеками, но зачем совершать лишние движения, тем более что все делается с нуля? Поэтому выбор был очевиден, но что-то я отвлекся, продолжаем ближе к теме.

В системных репозиториях любой ОС всегда присутствует устаревшая версия сервера Nginx. На момент написания статьи в системных репозиториях Ubuntu Server 16.04 была доступна 1.10.0 версия, вышедшая 26 апреля 2016 года, в то время как на оф. сайте Nginx была доступна версия 1.11.10. Временной промежуток между выходом версий составляет около года.

Естественно, я решил собрать сервер из исходников, хотя можно добавить nginx-репозитории в систему и установить Nginx непосредственно из них, но в силу своей природной лени я отвергаю лишние действия, пусть даже из-за этого и придется идти более сложным путем. Хотя в данном случае, процесс сборки софта из исходников я не нахожу особо сложным в сравнении с обычной установкой.

Помимо последних версий ПО, сборка из исходников подразумевает возможность более тонкой настройки сервера, путем добавления нужных или удаления ненужных модулей, тем более что в дальнейшем сервер всегда может быть пересобран с целью добавления чего-то необходимого.

Для сборки софта из исходников должны присутствовать необходимые пакеты.

apt-get install build-essential libpcre++-dev libssl-dev -y

Все дальнейшие действия будут происходить внутри определенной директории, по умолчанию для подобных целей я привык использовать каталог /usr/local/src.

cd /usr/local/src

Необходимо узнать последнюю версию сервера. Сделать это можно на оф. сайте Nginx, версии основной (mainline) ветки публикуются на главной странице.

После того как определились с версией сервера, скачиваем архив с исходниками.

wget http://nginx.org/download/nginx-1.11.10.tar.gz

Распаковываем архив, после чего сразу переходим в каталог с исходниками.

tar -zxvf nginx-1.11.10.tar.gz && cd nginx-1.11.10

Теперь необходимо задать конфигурацию сервера, добавить нужные и убрать ненужные модули. Со списком модулей и их описанием можно ознакомиться в документации Nginx, в справочнике по модулям. Привожу свой список опций с которыми будет собран сервер.

Все только самое необходимое, если что-то понадобится впоследствии, то лучше собрать сервер повторно и добавить нужные модули или опции.

# Задаем директории и конфигурационные файлы сервера
--prefix=/etc/nginx
--sbin-path=/usr/sbin/nginx
--conf-path=/etc/nginx/nginx.conf
--error-log-path=/var/log/nginx/error.log
--http-log-path=/var/log/nginx/access.log
--pid-path=/var/run/nginx.pid
--lock-path=/var/run/nginx.lock
--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

# Задаем пользователя и группу для управления сервером
--user=nginx
--group=nginx

# Убираем ненужные модули
--without-http_autoindex_module / Убираем вывод содержимого каталогов
--without-http_ssi_module / Убираем обработку SSI команд
--without-http_scgi_module / Убираем модуль запросов к SCGI-серверу
--without-http_uwsgi_module / Убираем модуль запросов к UWSGI-серверу
--without-http_geo_module / Убираем модуль переменных в зависимости от IP-адреса клиента
--without-http_split_clients_module / Убираем модуль переменных для "split-тестирования"
--without-http_memcached_module / Убираем memcached модуль
--without-http_empty_gif_module / Убираем модуль позволяющий выдавать однопиксельный прозрачный GIF
--without-http_browser_module / Убираем модуль переменных зависящих от значения "User-Agent" в заголовке запроса

# Добавляем нужные модули
--with-http_ssl_module / Обеспечение работы по протоколу HTTPS
--with-http_v2_module / Обеспечение поддержки HTTP/2 протокола
--with-http_realip_module / Замена адреса клиента на адрес переданный в заголовке
--with-http_mp4_module / Поддержка стриминга MP4 файлов
--with-http_auth_request_module / Авторизация клиента на результате подзапроса
--with-http_stub_status_module / Предоставление доступа к базовой информации о сервере
--with-http_random_index_module / Обслуживание запросов оканчивающихся "/"
--with-http_gunzip_module / Распаковка ответов для тех клиентов, кто не поддерживает метод сжатия "gzip"

# Добавляем нужные опции
--with-threads / для настройки пула потоков

Вся вышеописанная конфигурация задается одной командой.

./configure --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --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 --user=nginx --group=nginx --without-http_autoindex_module --without-http_ssi_module --without-http_scgi_module --without-http_uwsgi_module --without-http_geo_module --without-http_split_clients_module --without-http_memcached_module --without-http_empty_gif_module --without-http_browser_module --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_mp4_module --with-http_auth_request_module --with-http_stub_status_module --with-http_random_index_module --with-http_gunzip_module --with-threads

Если при конфигурации сервера у вас возникли какие либо ошибки, то это означает, что вы что-то забыли установить из списка необходимых пакетов в начале статьи. Найдите свою ошибку в списке и установите нужные пакеты, после чего выполните команду ./configure заново.

# Ошибки могущие возникнуть в процессе сборки.

--------------------------------------------------------------------------------
./configure: error: the HTTP rewrite module requires the PCRE library.

apt-get install -y libpcre++-dev
--------------------------------------------------------------------------------
./configure: error: SSL modules require the OpenSSL library.

apt-get install -y libssl-dev

Если по завершению не было никаких ошибок, а в конце создан Makefile и указана суммарная конфигурация, то можно переходить непосредственно к установке Nginx.

creating objs/Makefile

Configuration summary
  + using threads
  + using system PCRE library
  + using system OpenSSL library
  + using system zlib library

  nginx path prefix: "/etc/nginx"
  nginx binary file: "/usr/sbin/nginx"
  nginx modules path: "/etc/nginx/modules"
  nginx configuration prefix: "/etc/nginx"
  nginx configuration file: "/etc/nginx/nginx.conf"
  nginx pid file: "/var/run/nginx.pid"
  nginx error log file: "/var/log/nginx/error.log"
  nginx http access log file: "/var/log/nginx/access.log"
  nginx http client request body temporary files: "/var/cache/nginx/client_temp"
  nginx http proxy temporary files: "/var/cache/nginx/proxy_temp"
  nginx http fastcgi temporary files: "/var/cache/nginx/fastcgi_temp"

Выполняем компиляцию и последующую установку сервера.

make && make install

После того как установка будет завершена, можно посмотреть версию установленного сервера, выполнив команду nginx -V.

nginx -V
nginx version: nginx/1.11.10
built by gcc 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.4) 
built with OpenSSL 1.0.2g  1 Mar 2016
TLS SNI support enabled
configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --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 --user=nginx --group=nginx --without-http_autoindex_module --without-http_ssi_module --without-http_scgi_module --without-http_uwsgi_module --without-http_geo_module --without-http_split_clients_module --without-http_memcached_module --without-http_empty_gif_module --without-http_browser_module --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_mp4_module --with-http_auth_request_module --with-http_stub_status_module --with-http_random_index_module --with-http_gunzip_module --with-threads

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

Следующим шагом будет создание пользователя, системной службы и директорий необходимых для работы Nginx.

Создадим пользователя nginx, зададим командную оболочку /usr/sbin/nologin, запрещающую удаленный доступ и обозначающую пользователя как системного.

useradd -s /usr/sbin/nologin nginx

Создаем каталоги необходимые для работы сервера.

# Обязательно, а то не запустится служба:
mkdir /var/cache/nginx

# Могут быть кастомными, я делаю по привычке следующий набор:
mkdir /etc/nginx/conf/
mkdir /etc/nginx/sites-enabled/
mkdir /etc/nginx/sites-available/
mkdir /etc/nginx/common/

# Можно создать все одной командой:
mkdir /var/cache/nginx && mkdir /etc/nginx/conf/ && mkdir /etc/nginx/sites-enabled/ && mkdir /etc/nginx/sites-available/ && mkdir /etc/nginx/common/

Создадим символическую ссылку.

ln -s /usr/sbin/nginx /bin/nginx

Создаем службу nginx.service.

# Создаем конфигурационный файл nginx.service
nano /lib/systemd/system/nginx.service

# Содержание файла nginx.service:

[Unit]
Description=A high performance web server and a reverse proxy server
After=network.target

[Service]
Type=forking
PIDFile=/var/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t -q -g 'daemon on; master_process on;'
ExecStart=/usr/sbin/nginx -g 'daemon on; master_process on;'
ExecReload=/usr/sbin/nginx -g 'daemon on; master_process on;' -s reload
ExecStop=-/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /var/run/nginx.pid
TimeoutStopSec=5
KillMode=mixed

[Install]
WantedBy=multi-user.target

Добавляем службу nginx.service в автозагрузку и запускаем.

# Запуск и добавление в автозагрузку.
systemctl enable nginx.service
systemctl start nginx.service

Проверяем как работает командой status.

systemctl status nginx.service
● nginx.service - A high performance web server and a reverse proxy server
   Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
   Active: active (running) since Пт 2017-03-17 03:51:20 MSK; 6s ago
  Process: 4777 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
  Process: 4771 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
 Main PID: 4781 (nginx)
    Tasks: 2
   Memory: 1.2M
      CPU: 17ms
   CGroup: /system.slice/nginx.service
           ├─4781 nginx: master process /usr/sbin/nginx -g daemon on; master_process on
           └─4782 nginx: worker process                           

мар 17 03:51:20 test1 systemd[1]: Starting A high performance web server and a reverse proxy server...
мар 17 03:51:20 test1 systemd[1]: nginx.service: Failed to read PID from file /var/run/nginx.pid: Invalid argument
мар 17 03:51:20 test1 systemd[1]: Started A high performance web server and a reverse proxy server.

Если сейчас обратиться к серверу по его IP-адресу, должна отобразиться страница "Welcome to nginx!". Если страница отображается, значит все в порядке, сервер запущен и работает.

nginx ubuntuВ следующей статье можно узнать как настраивать Nginx.

Ответить:

Please enter your comment!
Please enter your name here