Установка веб-сервера Nginx на Debian 11 Печать
Добавил(а) microsin   

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)

[Шаг 3: проверка вашего web-сервера]

# 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 для создания необходимых дочерних директорий:

$ sudo mkdir -p /var/www/your_domain/html
$ sudo chown webuser /var/www/your_domain/html
$ sudo chgrp webuser /var/www/your_domain/html

Первая команда в этом примере создает каталог /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:

# sudo nano /etc/nginx/sites-available/your_domain

Введите в файле следующее и сохраните его:

server {
        listen 80;
        listen [::]:80;
 
        root /var/www/your_domain/html;
        index index.html index.htm index.nginx-debian.html;
 
        server_name your_domain www.your_domain;
 
        location / {
                try_files $uri $uri/ =404;
        }
}

Обратите внимание, что вы обновляете 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, и удалите в её начале символ #, после чего сохраните файл и закройте редактор:

...http {
    ...
    server_names_hash_bucket_size 64;
    ...
} ...

Проверьте, что в конфигурации 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:

nginx index.nginx debian.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.