Nginx это бесплатный и открытый (open-source) web-сервер, который предназначен для хостинга сайтов и приложений на его основе. Этот сервер популярен из-за своей низких требований к используемой памяти, высокой масштабируемости, с модульной архитектурой с безопасным функционалом и предсказуемой производительностью. Nginx это не просто web-сервер, он также работает как баланс нагрузки, кэш HTTP и промежуточный обратный прокси (reverse proxy, работающий вместе с сервером apache2).
В этом руководстве (перевод документации [1]) мы установим Nginx на сервер под операционной системой Debian 11, настроим права сетевого экрана (firewall) и научимся управлять некоторыми процессами Nginx.
[Предварительные требования]
Перед тем, как начать установку, вы должны получить доступ к серверу Debian под обычным пользователем без прав root, но с разрешенными привилегиями sudo. Также на сервере должен быть запущен firewall. Как это настраивается, вы можете посмотреть в руководстве по первоначальной настройке Debian 11 [2].
Примечание: я проводил настройку Nginx на VPS хостинга reg.ru [3]. После покупки хостинга вам будет доступен IP-адрес сервера, к которому можно подключиться по протоколу SSH, а также логин и пароль root.
Если вы хотите выполнить последние шаги из этого руководства, то понадобится зарегистрированное доменное имя.
[Шаг 1: установка Nginx]
Nginx доступен по умолчанию из репозиториев Debian, и поэтому устанавливается стандартными командами управления пакетами. Сначала нужно обновить локальный индекс пакетов на предмет получения последних, самых свежих изменений:
$ sudo apt update
После этого установите пакет nginx:
$ sudo apt install nginx
Подтвердите запрос на закачку пакетов для установки вводом Y+Enter. Менеджер пакетов apt установит Nginx и любые необходимые зависимости для него. После этого сервер сразу заработает, и будет доступен по IP-адресу вашего сервера (если открыт доступ к его портам, см. далее).
[Шаг 2: настройка сетевого экрана]
Если у вас установлен firewall, то перед его проверкой (см. далее врезку "Проверка работы сервера") необходимо разрешить доступ к серверу со стороны внешних подключений по публичному IP-адресу. Для этого необходимо настроить разрешения для открытых портов сервера. Предположим, что вы выполнили инструкции по предварительной настройке Debian 11 [2], тогда у вас уже установлен UFW firewall, сконфигурированный на ограничение доступа к вашему серверу.
Примечание: для своего сервера в качестве сетевого экрана я использовал iptables, поскольку он интегрируется с fail2ban [4].
Во время установки Nginx регистрирует себя для UFW, чтобы предоставить несколько профилей приложения (application profiles), которые можно использовать для разрешения или запрета доступа к Nginx через сетевой экран UFW.
Получить список профилей приложения можно командой:
$ sudo ufw app list
Должен быть выведен примерно такой список профилей:
Available applications: ... Nginx Full Nginx HTTP Nginx HTTPs OpenSSH ...
Из этого сообщения мы видим, что для Nginx доступно 3 профиля:
Nginx Full: этот профиль открывает порты 80 (обычный, незашифрованный web-трафик) и порт 443 (шифрованный трафик TLS/SSL). Nginx HTTP: этот профиль откроет только порт 80 (обычный, незашифрованный web-трафик). Nginx HTTPS: этот профиль откроет только порт 443 (шифрованный трафик TLS/SSL).
Рекомендуется разрешить наиболее ограничивающий профиль, пропускающий тот трафик, который вы сконфигурировали. Поскольку в этом руководстве мы не сконфигурировали еще TLS/SSL, то понадобится только лишь разрешить трафик HTTP на порту 80.
Вы можете разрешить это командой:
$ sudo ufw allow 'Nginx HTTP'
Результат выполнения можно проверить следующей командой:
$ sudo ufw status Status: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere Nginx HTTP ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6) Nginx HTTP (v6) ALLOW Anywhere (v6)
# 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 Sat 2023-10-28 09:08:10 MSK; 17s ago Docs: man:nginx(8) Process: 486 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUCCESS) Process: 506 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCESS) Main PID: 511 (nginx) Tasks: 2 (limit: 1140) Memory: 12.3M CPU: 72ms CGroup: /system.slice/nginx.service ├─511 nginx: master process /usr/sbin/nginx -g daemon on; master_process on; └─512 nginx: worker process
Oct 28 09:08:10 5-63-155-210.cloudvps.regruhosting.ru systemd[1]: Starting A high performance web server and a reverse proxy server... Oct 28 09:08:10 5-63-155-210.cloudvps.regruhosting.ru systemd[1]: Started A high performance web server and a reverse proxy server. # ss -tl State Recv-Q Send-Q Local Address:Port Peer Address:Port Process LISTEN 0 4096 0.0.0.0:5355 0.0.0.0:* LISTEN 0 511 0.0.0.0:http 0.0.0.0:* LISTEN 0 4096 127.0.0.53%lo:domain 0.0.0.0:* LISTEN 0 128 0.0.0.0:ssh 0.0.0.0:* LISTEN 0 4096 [::]:5355 [::]:* LISTEN 0 511 [::]:http [::]:* LISTEN 0 128 [::]:ssh [::]:*
Если запустить в браузере ссылку http://aa.bb.cc.dd, где aa.bb.cc.dd это IP-адрес вашего сервера, то вы увидите базовую страничку по умолчанию, которая будет автоматически создана в файле /var/www/html/index.nginx-debian.html:
Welcome to nginx!
If you see this page, the nginx web server is successfully installed and working. Further configuration is required.
For online documentation and support please refer to nginx.org. Commercial support is available at nginx.com.
Thank you for using nginx.
[]
[Шаг 4: управление процессом Nginx]
Теперь, когда ваш web-сервер запущен и отвечает на запросы, можно рассмотреть некоторые базовые команды для его управления.
Чтобы остановить web-сервер:
$ sudo systemctl stop nginx
Чтобы запустить остановленный web-сервер:
$ sudo systemctl start nginx
Чтобы перезапустить службу web-сервера (это может потребоваться при значительных изменениях конфигурации):
$ sudo systemctl restart nginx
Если вы сделали изменения в конфигурации, можно перезагрузить Nginx без сбрасывания существующих соединений. Для этого выполните команду:
$ sudo systemctl reload nginx
По умолчанию Nginx сконфигурирован для автоматического запуска, когда сервер загружается. Если это не то, что вы хотите, то такое поведение можно запретить командой (тогда Nginx после перезапуска сервера надо будет запускать вручную командой systemctl start nginx):
$ sudo systemctl disable nginx
Чтобы снова разрешить автозапуск Nginx при загрузке сервера, выполните команду:
$ sudo systemctl enable nginx
[Шаг 5: настройка блоков сервера (не обязательно)]
При настройке web-серверов на основе Nginx можно использовать server blocks (это работает наподобие virtual hosts на Apache), чтобы инкапсулировать подробности конфигурации каждого домена (или субдомена), которые обслуживаются одним сервером. В следующем примере в качестве имени домена условно используется your_domain, но вместо этого вы должны заменить его на реальное имя вашего зарегистрированного домена.
По умолчанию Nginx на Debian 11 конфигурирует и разрешает один server block, настроенный на обслуживание документов в директории /var/www/html. Это нормально работает, если на сервере находится только 1 сайт, однако такая конфигурация не подходит, если нужно поддерживать несколько сайтов с разными доменными именами на одном IP-адресе. Вместо модификации /var/www/html создайте структуру директорий в папке /var/www для вашего web-сайта your_domain, оставляя /var/www/html в качестве директории по умолчанию, если запрос клиента не соответствует ни одному из других сконфигурированных на сервере сайтов.
Создайте директорию для your_domain следующим образом, используя флаг -p для создания необходимых дочерних директорий:
Первая команда в этом примере создает каталог /var/www/your_domain/html, вторая назначает владельцем этой директории пользователя webuser, а третья команда меняет группу этой директории на группу webuser (здесь webuser это пользователь, от имени которого работает web-сервер):
Права доступа для вашей корневой web-директории должны быть корректными, если вы не модифицировали ваше значение umask. Однако в этом нужно убедиться командой:
# chmod -R 755 /var/www/your_domain # ls -l /var/www drwxr-xr-x 2 webuser webuser 4096 Oct 27 20:23 webuser
Далее создайте простую страничку index.html, используя текстовый редактор nano или mcedit:
$ nano /var/www/your_domain/html/index.html
Введите для этого файла текст:
< html>< head>< title>Welcome to your_domain< /title>< /head>< body>< h1>Success! Your Nginx server is successfully configured for < em>your_domain< /em>. < /h1> < p>This is a sample page.< /p> < /body> < /html>
Сохраните этот файл и выйдите из редактора (nano для сохранения использует комбинацию клавиш Ctrl+X, для выхода Ctrl+O, с подтверждением клавишей Enter).
Чтобы Nginx мог обслуживать эту страничку, также нужно создать server block с правильными директивами, чтобы указать на корневую папку для домена your_domain. Вместо того, чтобы напрямую изменять файл конфигурации по умолчанию (файл /etc/nginx/sites-available/default), создайте новый файл конфигурации /etc/nginx/sites-available/your_domain:
Обратите внимание, что вы обновляете root-конфигурацию для вашей новой созданной директории /var/www/your_domain/html, и имя домена в строке server_name необходимо заменить на корректное имя реального домена.
Далее разрешить этот server block путем создания символической ссылки на ваш пользовательский конфигурационный файл внутри директории sites-enabled, который Nginx прочитает во время своего запуска:
$ sudo ln -s /etc/nginx/sites-available/your_domain /etc/nginx/sites-enabled/ $ sudo ls -l /etc/nginx/sites-enabled/ total 0 lrwxrwxrwx 1 root root 34 Oct 27 19:25 default -> /etc/nginx/sites-available/default lrwxrwxrwx 1 root root 37 Oct 28 10:43 microsinru -> /etc/nginx/sites-available/available
Теперь на у вас есть два разрешенных server block-а, сконфигурированных для ответа на запросы, базируясь на директивах listen и server_name (более подробно про то, как Nginx обрабатывает эти директивы, см. [5]):
• your_domain: отвечает на запросы браузера к доменам your_domain и www.your_domain. • default: будет отвечать на любые запросы к порт 80, которые не соответствуют ни одному из других блоков.
Чтобы избежать возможной проблемы с памятью хеширования (hash bucket memory), которая может возникнуть при добавлении дополнительных имен серверов в конфигурацию, необходимо настроить одно значение в файле/etc/nginx/nginx.conf. Для этого отройте его в редакторе:
$ sudo nano /etc/nginx/nginx.conf
Найдите строку server_names_hash_bucket_size, и удалите в её начале символ #, после чего сохраните файл и закройте редактор:
Проверьте, что в конфигурации Nginx нет ошибок следующей командой:
$ sudo nginx -t nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful
После того, как вы удостоверились в отсутствии ошибок в конфигурации, перезапустите Nginx, чтобы изменения вступили в силу:
$ sudo systemctl restart nginx
После этого Nginx должен теперь обслуживать ваше настроенное доменное имя. Вы можете проверить это путем ввода в строке браузера ссылки http://your_domain. После запуска просмотра этой странички будет отображаться HTML, который вы создали в файле /var/www/your_domain/html/index.html:
[Шаг 6: знакомство с важными каталогами и файлами Nginx]
Содержимое сайта
/var/www/html: актуальный web-контент, который по умолчанию (сразу после установки Nginx) состоит только из странички по умолчанию Nginx, находящейся в директории /var/www/html. Это можно поменять путем редактирования файлов конфигурации Nginx (см. выше "Шаг 5: настройка блоков сервера").
Конфигурация сервера
/etc/nginx: директория конфигурации Nginx. Здесь находятся все конфигурационные файлы.
/etc/nginx/nginx.conf: главный конфигурационный файл Nginx. Он может быть изменен для правки глобальной конфигурации Nginx, влияющей на все обслуживаемые сайты.
/etc/nginx/sites-available/: директория, где находятся сервер-блоки для каждого обслуживаемого сайта. Nginx не будет использовать никакие конфигурационные файлы, найденные в этой директории, если для них не созданы символические ссылки, находящиеся в директории sites-enabled. Обычно здесь создаются все блоки конфигурации сервера, и затем они разрешаются путем создания символических ссылок.
/etc/nginx/sites-enabled/: здесь сохраняются разрешенные блоки конфигурации для каждого сайта. Обычно это делается путем создания символических ссылок на файлы из директории sites-available.
/etc/nginx/snippets: в этой директории хранятся фрагменты конфигурации, которые подключаются где-нибудь в других местах конфигурации Nginx. Повторяемые сегменты конфигурации потенциально являются хорошими кандидатами для рефакторинга и повторного использования.
Логи сервера
/var/log/nginx/access.log: каждый запрос к вашему серверу записывается в этот файл лога, если Nginx специально не сконфигурирован как-то иначе.
/var/log/nginx/error.log: в этот лог будут записаны любые ошибки Nginx.
[Ссылки]
1. How To Install Nginx on Debian 11 site:digitalocean.com. 2. Initial Server Setup with Debian 11 site:digitalocean.com. 3. Облачный сервер для хостинга и разработки Base-1 site:reg.ru. 4. Защита от DDoS с помощью Fail2Ban. 5. Understanding Nginx Server and Location Block Selection Algorithms site:digitalocean.com. 6. Установка ftp-сервера ProFTPD на Debian 11.