В данной статье я хочу рассмотреть установку веб-сервера Nginx самой последней версии, на примере операционной системы Ubuntu Server 16.04. В качестве основы будущего сервера эта операционная система была выбрана не случайно, выбор системы основывался на определенной версии встроенных библиотек OpenSSL.
Дело в том, что изначально было задумано постепенно перевести сайт на HTTPS шифрование, дополнительно прикрутив поддержку нового протокола HTTP/2, а для этого необходимо наличие библиотек OpenSSL не ниже 1.0.2 версии. На данный момент нужная версия библиотек OpenSSL присутствует лишь в Ubuntu Server 16.04, которая поставляется с ними "из коробки".
Конечно версию библиотек можно и обновить, можно собрать 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.