Мы продолжаем цикл статей о настройке VDS с операционной системой Ubuntu 14.04. В сегодняшней части мы приступим к установке необходимого программного обеспечения на сервер после аренды VPS сервера. Конкретные приложения, о которых сегодня пойдет речь, рассматривались нами в предыдущей статье, где мы рассказали об основном программном обеспечении, которое требуется на сервере, а также описали его основной функционал.
Сегодня мы не только установим и настроим данное программное обеспечение, но и приведем основные команды, необходимые для управления им.
В первую очередь речь пойдет о веб-сервере. На данный момент существует несколько разных веб-серверов, но мы остановимся на наиболее популярных и эффективных веб-серверах: NGINX и Apache. Их описание было также приведено в прошлой статье, напомним, что их можно использовать как раздельно, так и в различных связках. Существуют различные схемы их использования, например:
- NGINX + PHP-FPM - для работы PHP приложений;
- NGINX + UWSGI/GUNICORN - для работы Django;
- NGINX + APACHE + mod_php/mod_python - производительная связка с использованием сильных сторон обоих серверов;
- APACHE + mod_php/mod_python - классическая схема.
Рекомендуем Вам выбрать нужную для работы Вашего сайта схему. Если Вы затрудняетесь, используйте универсальные схемы с учетом языка программирования сайта: NGINX + PHP-FPM (UWSGI/GUNICORN) и APACHE + mod_php(mod_python). Теперь, когда Вы определились c тем, какой или какие веб-серверы Вы будете использовать, мы перейдем напрямую к процессу установки веб-сервера NGINX.
В данной статье мы рассмотрим лишь основные, общие параметры NGINX; полную и более детальную документацию Вы найдете на официальном сайте NGINX: http://nginx.org/ru/docs/
NGINX является одним из самых популярных веб-серверов и имеет широкое применение в различных областях. Он позволяет не только обрабатывать запросы, но и качественно фильтровать их, а также балансировать нагрузку.
Установка NGINX
Установка сервера может быть выполнена либо из стандартного репозитория операционной системы (в данном случае Ubuntu 14.04), либо из отдельного репозитория разработчиков NGINX: http://nginx.org/ru/linux_packages.html.
Вариант 1: установка NGINX из репозитория операционной системы
Для установки из репозитория достаточно выполнить команду apt-get. Если Вы затрудняетесь в выборе количества включенных в программу библиотек, Вы можете установить полный пакет:
$ sudo apt-get install nginx-full
Если же требуется обычный пакет, то введите следующую команду:
$ sudo apt-get install nginx
Вариант 2: установка NGINX из репозитория разработчика
Для начала нам необходимо добавить ключ репозитория:
$ sudo wget http://nginx.org/keys/nginx_signing.key $ sudo apt-key add nginx_signing.key
Далее откройте список репозиториев:
$ sudo vi /etc/apt/sources.list
И добавьте в конец файла следующие строки:
deb http://nginx.org/packages/mainline/ubuntu/ trusty nginx deb-src http://nginx.org/packages/mainline/ubuntu/ trusty nginx
Теперь необходимо сохранить изменения в файле и выполнить следующие команды:
$ sudo apt-get update $ sudo apt-get install nginx
После выполнения всех команд необходимо проверить корректность установки. Для этого наберите в адресной строке браузера IP-адрес Вашего сервера, Вы должны увидеть страницу приветствия сервера Nginx:
Если страница открывается корректно, без возникновения ошибок, значит, установка завершена, и можно переходить к настройке.
Общая настройка NGINX
Настройка NGINX состоит из нескольких блоков. Если Вы используете последние версии NGINX, то для получения актуальной информации мы рекомендуем Вам использовать официальные справочные данные, так как в зависимости от версий настройки могут отличаться.
Модули, из которых состоит NGINX, можно настроить при помощи директив, которые, в свою очередь, подразделяются на простые и блочные. Блочная директива отличается от простой тем, что в ней содержатся дополнительные инструкции. Контекст – это блочная директива, внутри которой можно задавать другие директивы. Что касается блоков, то для настройки NGINX необходимо остановиться на следующих разновидностях: блок server отвечает за конфигурацию для виртуального сервера, в блоке http (в котором находится блок server) прописываются директивы HTTP-сервера, а блоки location определяют конфигурацию в зависимости от URI-запроса.
Теперь перейдем к самому процессу настройки NGINX.
Для начала необходимо настроить файл nginx.conf:
$ sudo nano /etc/nginx/nginx.conf
В этом файле Вы можете посмотреть все основные параметры. Рассмотрим, что обозначает каждая из директив:
- User – пользователь и группа, права которых будут использоваться для запуска рабочего процесса;
- worker_processes – число рабочих процессов (воркеров). Рекомендуется поставить значение “auto”, т.к. число будет равно числу процессорных ядер;
- error_log – конфигурирует запись в лог;
- pid - определяет, в каком файле будет храниться номер основного процесса;
блок events:
- worker_connections – определяет максимальное количество соединений, которые одновременно может открыть рабочий процесс;
- use - метод, который будет использоваться для обработки соединений;
- multi_accept - определяет, какое количество соединений будет принимать рабочий процесс за один раз (on – все новые соединения; off – только одно новое соединение);
блок http:
- include – включение файла или файлов, которые подходят под заданную маску;
- default_type - тип данных по умолчанию;
- server_tokens – позволяет включить (on) или отключить (off) вывод версии NGINX в заголовках ответа или ошибках;
- sendfile – позволяет включить (on) или отключить (off) метод отправки данных sendfile();
- sendfile_max_chunk - определяет объем данных, который может передаваться за один вызов sendfile. Если установить на ноль, то одно быстрое соединение может полностью захватить рабочий процесс;
- tcp_nopush – при включении позволяет передавать заголовок ответа и начало файла одним пакетом, а также передавать файл целым пакетом;
- reset_timedout_connection - позволяет включить (on) или отключить (off) сброс соединений по таймауту;
- client_header_timeout – определяет время, за которое клиент должен успеть передать полностью заголовок;
- client_body_timeout – определяет таймаут при чтении тела запроса клиента;
- send_timeout – задается время, по истечении которого соединение закрывается, если клиент ничего не принимает;
- client_header_buffer_size – определяет буфер для чтения заголовка запроса клиента (по умолчанию равняется 1K);
- client_body_buffer_size – определяет буфер для чтения тела запроса клиента;
- client_max_body_size – определяет максимально допустимый размер тела запроса клиента;
- access_log - позволяет включить (on) или отключить (off) лог доступа;
- include – подключение дополнительных конфигураций.
Поэтапная настройка NGINX
Рекомендуем Вам сначала проверить и скорректировать настройки по умолчанию в файле /etc/nginx/nginx.conf.
Начните настройку с проверки или указания пользователя, от имени которого Вы будете работать:
user admin;
Затем укажите число рабочих процессов. Мы советуем исходить из количества процессорных ядер в Вашем сервере, то есть число рабочих процессов будет равняться числу процессорных ядер (но Вы можете поставить и какое-либо другое значение). Это число задается следующей командой:
worker_processes 2;
Далее Вы можете указать место, куда будут записываться файлы с логами ошибок:
error_log /spool/logs/nginx/nginx.error_log notice;
Всего существует 7 уровней уведомлений: info, notice, warn, error, crit, alert и emerg. Уровни перечислены в порядке от наименее важных сообщений к наиболее важным. Выставляя уровень, учитывайте, что в файл логов будут попадать все сообщения этого и более высоких по важности уровней.
Затем Вам нужно будет выбрать метод обработки соединений. Если Вы затрудняетесь в выборе, тогда NGINX самостоятельно выбирает метод, который является наиболее эффективным. Ознакомиться со всеми поддерживаемыми методами Вы можете по этой ссылке: http://nginx.org/ru/docs/events.html
Теперь Вы должны определиться с максимальным числом соединений, которое одновременно будет обрабатывать рабочий процесс. Высчитывая это число, держите в уме, что максимальное количество обслуживаемых клиентов будет равно произведению worker_connections и worker_processes.
У Вас должен получиться похожий код:
events { worker_connections 2048; }
В следующем блоке настроек первым делом необходимо включить sendfile(), так как это позволяет улучшить производительность сервера:
sendfile on;
Далее выставите параметр, касающийся времени поддержания соединения, если по нему нет запросов:
keepalive_timeout 15;
Теперь Вам необходимо включить файл, отвечающий за поддержку MIME-типов, используя директиву include:
include /etc/nginx/mime.types;
Данная настройка определяет соответствие между MIME-типами и расширениями имен файлов, и, как правило, этот файл содержит большинство соответствий. В данном случае соответствие будет задаваться директивой types. Полный список соответствий Вы можете найти в файле conf/mime.types.
Далее Вам нужно указать тип данных по умолчанию:
default_type application/octet-stream;
Теперь перейдем к настройке, которая касается сжатия; за нее отвечает модуль gzip. Благодаря ему размер данных, которые передаются, может быть уменьшен в два раза и более. Строка со включенным gzip выглядит следующим образом:
gzip on;
Поэтому если Вы хотите выключить сжатие ответа данным методом, вместо “on” Вам нужно написать “off”.
Следующее, с чем необходимо определиться, - это размер и количество буферов, в которые будет сжиматься ответ:
gzip_buffers 16 8k;
При этом размер одного буфера, как правило, соответствует размеру страницы.
Теперь укажите, на каком уровне компрессии будет происходить сжатие (выбирайте значение от 1 до 9):
gzip_comp_level 7;
Еще одна из возможных настроек - минимальная длина ответа, для которого будет использовано сжатие:
gzip_min_length 512;
Вы можете также определить, к каким MIME-типам будет применено сжатие ответа при помощи gzip. По умолчанию эта строка выглядит так:
gzip_types text/html
Но Вы можете добавить и какие-либо еще типы. Если Вы хотите, чтобы сжатие применялось ко всем MIME-типам, тогда введите знак звездочки “*”.
Сжатие ответа для проксированных запросов определяется отдельным параметром:
gzip_proxied any;
По умолчанию эта возможность выключена (off), но Вы можете установить там один или несколько других параметров, к примеру, “auth” разрешит использование gzip, если заголовок вопроса содержит поле “Authorization”. Параметр “Any” делает возможным сжатие для всех проксированных запросов.
Теперь давайте перейдем к настройке файлов логирования.
За запись логов в NGINX отвечает модуль ngx_http_log_module. Он записывает логи в том формате, который указан; по умолчанию (если Вы не укажите какой-либо другой) выбирается “combined”:
access_log logs/access.log combined
Обычно логи сохраняются в директории location, при этом Вы можете сделать перенаправление, и тогда location будет отличным от изначального.
Сама конфигурация логов может выглядеть следующим образом:
log_format compression '$remote_addr - $remote_user [$time_local] ' '"$request" $status $bytes_sent ' '"$http_referer" "$http_user_agent" "$gzip_ratio"'; access_log /spool/logs/nginx-access.log compression buffer=32k;
Давайте рассмотрим каждую из директив данной конфигурации:
- log_format – определяет формат логов; Вы можете использовать как общие переменные, так и переменные, которые существуют только в тот момент, когда происходит запись в лог. К примеру, в данной директиве:
- $remote_addr – адрес клиента;
- $remote_user – имя пользователя;
- $time_local - локальное время;
- $request - первоначальная строка запроса целиком;
- $status – статус ответа;
- $bytes_sent – размер байт, которые были переданы клиенту;
- $http_referer и $http_user_agent - поля заголовка запроса клиента;
- $gzip_ratio - достигнутый коэффициента сжатия будет записан в лог.
Следующая директива access_log указывает путь, формат (будет сжат файл или нет) и настройки записей. Также существует директива open_log_file_cache, которая определяет кэш, где будут храниться файловые дескрипторы тех логов, которые часто используются.
При желании Вы можете сделать запись буферизированной. Есть два способа сделать это: можно использовать параметр buffer, определив размер буфера (размер по умолчанию равняется 64 Кбайт), либо укажите параметр gzip (этот параметр также отвечает за сжатие файла: Вы можете выбрать значение от 1 до 9, при этом 1 равняется быстрому, но не очень хорошему сжатию, а 9 равняется хорошему, но медленному сжатию). Для чтения подобных сжатых логов файл необходимо распаковывать, либо Вы можете использовать утилиту “zcat”.
Заключительным этапом настройки веб-сервера является включение необходимого сайта (или сайтов), а также SSL при помощи директивы include:
include /etc/nginx/sites-enabled/*; include /etc/nginx/ssl-enabled/*;
Настройки блоков server
NGINX использует блоки server для обслуживания на одном сервере сразу нескольких доменов.
Изначально NGINX имеет лишь один стандартный блок server, который используется для обслуживания документов из каталога /usr/share/nginx/html. Однако наиболее безопасно и правильно хранить настройки каждого Вашего сайта отдельно (в разных файлах).
Поэтому первым делом нам необходимо создать структуру каталогов. Для этого Вам необходимо создать новый каталог, и уже в нем создать файлы конфигурации сайтов:
$ sudo mkdir -p /var/www/primer.ru/html $ sudo mkdir -p /var/www/primer2.ru/html
Следующая команда передаст права на них постоянному пользователю ($USER):
$ sudo chown -R $USER:$USER /var/www/primer.ru/html $ sudo chown -R $USER:$USER /var/www/primer2.ru/html
Теперь перейдем к созданию страниц для сайтов:
$ nano /var/www/primer.ru/html/index.html $ nano /var/www/primer2.ru/html/index.html
Мы рекомендуем Вам скопировать в созданные файлы пример страницы сайта, который Вы видите ниже:
<html> <head> <title>Добро пожаловать на primer.ru!</title> </head> <body> <h1>Все отлично! Блок server сайта primer.ru работает корректно.</h1> </body> </html>
Следующим шагом будет создание блоков server. Для этого выполните следующую команду:
$ sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/primer.ru
И затем откройте этот файл, используя root-права, и добавьте следующий текст:
server { listen 80; listen [::]:80; root /usr/share/nginx/html; index index.html index.htm; server_name localhost; location / { try_files $uri $uri/ =404; } }
Настройки, которые Вы здесь видите, имеют следующие функции:
- listen - определяет IP-адрес и порт, а также может указывать путь для UNIX-сокета;
- root - определяет, какой каталог будет использоваться для запросов;
- index - задает, какие файлы будут использоваться в качестве индекса;
- server_name - имя виртуального сервера;
- location - задает конфигурацию в зависимости от URI-запроса. Этот параметр может быть задан как префиксной строкой, так и регулярным выражением. В данном случае try_files обозначает, что для обработки запроса будет использоваться первый найденный файл ($uri); обозначить каталог Вы можете при помощи косой черты ($uri/); если же ни один из данных файлов не будет найден, то идет перенаправление на последний параметр.
В данном файле Вам нужно отредактировать следующие настройки.
В root запишите путь к каталогу с Вашим сайтом:
root /var/www/primer.ru/html;
Также Вы меняете server_name, при этом нужно обязательно указать доменное имя своего сайта:
server_name primer.ru www.primer.ru;
Теперь мы можем перейти к запуску блока server, используя следующую команду:
$ sudo ln -s /etc/nginx/sites-available/primer.ru /etc/nginx/sites-enabled/
Для того, чтобы предотвратить конфликт нового блока с блоком по умолчанию (default), его необходимо отключить:
$ sudo rm /etc/nginx/sites-enabled/default
А затем раскомментировать строку (убрать спецсимвол) server_names_hash_bucket_size 64; в файле /etc/nginx/nginx.conf.
Далее давайте перейдем к настройкам проксирования. Размер буфера для проксируемых запросов должен быть не меньше, чем ожидаемый размер ответа от сервера:
proxy_buffers 8 64k; proxy_intercept_errors on; proxy_connect_timeout 1s; proxy_read_timeout 3s; proxy_send_timeout 3s;
Следующим шагом необходимо установить кодировку отдачи:
charset utf-8;
Включите SSI и установите, чтобы SSI-переменные резервировали не более 1 Кбайта:
ssi on; ssi_value_length 1024;
Наконец, нам необходимо перейти к блоку location, который отвечает за конфигурацию в зависимости от URI-запроса. Вы можете добавить не один, а несколько блоков location, к примеру, два:
server { location / { root /data/www; } location /images/ { root /data; } }
В данном случае первый блок location имеет путь для запросов (root) - конечный путь к запрашиваемому файлу будет формироваться путем добавления URI из запроса к пути из директивы root. При совпадении этого пути в нескольких блоках location будет выбран путь, имеющий самый длинный префикс (он задается косой чертой “/”).
Второй блок, который мы настроили, дает совпадение с запросами, начинающимися с /images/.
Также блок location используется при настройке прокси-сервера. Для этого в первом блоке нужно прописать параметры директивы proxy_pass, а именно протокол и адрес проксируемого сервера:
location / { proxy_pass http://localhost:8080; }
Вы можете использовать этот параметр для задания пути к веб-серверу Apache на порту 9999:
location / { proxy_pass 127.0.0.1:9999; }
При этом при использовании NGINX как прокси-сервера Вы можете задать множество разных параметров, к примеру, proxy_read_timeout, который определяет таймаут при чтении ответа прокси-сервера, или proxy_send_timeout, который определяет таймаут при передаче запроса.
Вы также можете настроить NGINX так, чтобы он перенаправлял запросы на FastCGI-серверы. Для этого вместо директивы proxy_pass Вам нужно использовать директиву fastcgi_pass, а также директиву fastcgi_param, в которой задается параметр, который затем будет передаваться FastCGI-серверу:
server { location / { fastcgi_pass localhost:9000; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param QUERY_STRING $query_string; }
В этом случае файл SCRIPT_FILENAME определяет имя скрипта, а QUERY_STRING - параметры запроса.
Теперь, после того, как мы назначили все необходимые параметры, нам нужно перейти к завершающему шагу - перезагрузить сервер, чтобы все настройки, которые Вы изменили, вступили в силу:
$ sudo service nginx restart
Создание настроек для нескольких сайтов
После настройки основного сайта рекомендуем Вам составить список сайтов и определить, какой сайт должен открываться по IP-адресу сервера (если он один). Затем в директории /etc/nginx/sites-available создать файлы с сайтами, заполнить их настройками и сохранить их. Так как сервер учитывает только настройки из директории /etc/nginx/sites-enabled, то необходимо создать символическую ссылку на файл:
$ ln -s /etc/nginx/sites-available/имя_сайта /etc/nginx/sites-enabled/имя_сайта
Это позволит Вам отключать сайт на время без удаления его конфигурационного файла. Проверить конфигурацию NGINXпосле работ можно командой:
$ sudo nginx -t
Если вывод содержит "syntax is ok" и "test is successful", то можно применить настройки, написав команду:
$ sudo service nginx reload
Команды для управления сервером NGINX
Рассмотрим основные команды, которые можно использовать для управления сервером NGINX.
Остановить веб-сервер NGINX:
$ sudo service nginx stop
Запустить NGINX после остановки:
$ sudo service nginx start
Перезапустить (остановить и запустить снова) одной строкой:
$ sudo service nginx restart
Автоматически перезапускать NGINX после перезагрузки сервера:
$ sudo update-rc.d nginx defaults
Если эта опция включена по умолчанию, Вы увидите примерно следующее сообщение в консоли:
System start/stop links for /etc/init.d/nginx already exist.
Мы надеемся, что информация в этой статье оказалась для Вас полезной и помогла справиться с установкой и настройкой веб-сервера NGINX. В следующей статье мы расскажем о том, как правильно установить и настроить веб-сервер Apache.
Если у Вас возникли вопросы, спрашивайте в комментариях, мы будем рады Вам помочь.
Комментарии
Сейчас рекомендуем вам прочитать недавно опубликованную статью, касающуюся установки и настройки веб-сервера Apache: https://timeweb.com/ru/community/articles/nastroyka-vds-na-ubuntu-14-04-chast-6-ustanovka-i-nastroyka-apache-1
https://timeweb.com/ru/community/articles/kak-ustanovit-nginx-na-ubuntu-16-04-1
Напишите, пожалуйста, какие действия вы конкретно выполняете и при помощи каких команд? Крайне важно понять порядок ваших действий, чтобы можно было дать максимально полезный ответ.
sudo wget http://nginx.org/keys/nginx_signing.key
sudo apt-key add nginx_signing.key
sudo nano /etc/apt/sources.list
Добавляю в конце две строки:
deb http://nginx.org/packages/mainline/ubuntu/ trusty nginx
deb-src http://nginx.org/packages/mainline/ubuntu/ trusty nginx
Затем:
sudo apt-get update
sudo apt-get install nginx
Испробованы варианты с отключением ufw, файл с правилами ufw для nginx всё равно отсутствует или пустой.
80 ALLOW IN Anywhere
22 (v6) ALLOW IN Anywhere (v6)
80 (v6) ALLOW IN Anywhere (v6)
Порт открыл командой sudo ufw allow 80. Но я пытаюсь сделать так, чтобы порт был открыт для nginx.
sudo ufw app list
У меня он следующий:
Available applications:
Nginx Full
Nginx HTTP
Nginx HTTPS
OpenSSH
2. Командой добавляем приложение:
sudo ufw allow 'Nginx Full'
Порты для работы данного приложения заработают.
3. Проверяем:
sudo ufw status verbose
У меня вышло так:
80,443/tcp (Nginx Full) ALLOW IN Anywhere
80,443/tcp (Nginx Full (v6)) ALLOW IN Anywhere (v6)
Проверь, если не так будет(не поможет) - дальше посмотрим.
Available applications:
OpenSSH
sudo ufw allow 'Nginx Full'
ERROR: Could not find a profile matching 'Nginx Full'
Дело в том, что всё по статьям сделано. Возможно, что в данном случае лучше не включать ufw и установить nginx и тогда добавятся эти правила? В иных версиях все списки были как у вас, а ufw включался перед установкой 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
Если файла нет - советую вручную добавить с данным текстом и после перезагрузки проверить все ли в sudo ufw app list выводит.
Или командой: sudo ufw allow http для открытия порта. Так как что application, что просто открытие порта - они по факту равнозначны, ufw не может только 1 программе все дать а другим нет. Плюс открывать порт 80 при запущенном nginx никто не сможет как факт.
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
Nginx HTTP ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
Nginx HTTP (v6) ALLOW Anywhere (v6)
И всё работало, включая доступ ssh, а сейчас выдаёт:
Status: active
To Action From
-- ------ ----
22 ALLOW Anywhere
Nginx HTTP ALLOW Anywhere
22 (v6) ALLOW Anywhere (v6)
Nginx HTTP (v6)
Эти строки из вывода команды говорят, что 22 порт открыт как по IPv4, так и по IPv6(вторая запись) для всех IP адресов:
22 ALLOW Anywhere
22 (v6) ALLOW Anywhere (v6)
PS Timeweb, добавьте, пожалуйста наконец ubuntu 16 в установки на VDS!