Nginx: базовая конфигурация

Учебный материал для пары: как устроен Nginx, где лежат конфиги, как поднять простой сайт, настроить server block и проверить ошибки.

После занятия студент должен уметь:

1. Что такое Nginx

Nginx — это веб-сервер. Он принимает HTTP-запросы от браузера и отдаёт ответ: HTML-страницу, картинку, CSS, JavaScript или перенаправляет запрос к другому приложению.

Пример: пользователь открывает http://example.com. Браузер отправляет запрос на сервер. Nginx принимает запрос, ищет нужный файл и отдаёт его браузеру.

Где используется Nginx

Простая схема работы

Браузер пользователя
        ↓ HTTP-запрос
      Nginx
        ↓ ищет файл или передаёт запрос дальше
HTML / CSS / JS / backend-приложение
        ↓ HTTP-ответ
Браузер показывает страницу

2. Где находятся конфиги Nginx

На Linux-серверах основная конфигурация обычно находится в папке /etc/nginx/.

Путь Назначение
/etc/nginx/nginx.conf Главный конфигурационный файл Nginx.
/etc/nginx/sites-available/ Папка с доступными конфигурациями сайтов.
/etc/nginx/sites-enabled/ Папка с включёнными сайтами. Обычно здесь лежат символические ссылки.
/var/www/ Частое место для файлов сайтов.
/var/log/nginx/ Папка с логами доступа и ошибок.
В разных дистрибутивах структура может немного отличаться. Например, в Ubuntu часто используются sites-available и sites-enabled, а в некоторых системах конфиги сайтов кладут в conf.d.

3. Базовая структура конфигурации

Конфигурация Nginx состоит из директив. Директива — это команда внутри конфига. Простые директивы заканчиваются точкой с запятой. Блочные директивы содержат другие директивы внутри фигурных скобок.

директива значение;

блок {
    директива значение;
}

Пример базового server block

server {
    listen 80;
    server_name example.com;

    root /var/www/example;
    index index.html;

    location / {
        try_files $uri $uri/ =404;
    }
}
Директива Что делает
server Описывает один сайт или виртуальный хост.
listen 80; Говорит Nginx слушать порт 80, стандартный порт HTTP.
server_name Указывает домен, для которого работает этот блок.
root Указывает папку, где лежат файлы сайта.
index Указывает файл, который открывается по умолчанию.
location Настраивает поведение для конкретного пути URL.
try_files Проверяет наличие файла или папки. Если ничего не найдено — возвращает ошибку.

4. Создание первого сайта

Разберём минимальный пример: нужно создать HTML-страницу и настроить Nginx так, чтобы он её отдавал.

Шаг 1. Создать папку сайта

sudo mkdir -p /var/www/student-site

Шаг 2. Создать HTML-файл

sudo nano /var/www/student-site/index.html

Содержимое файла:

<!DOCTYPE html>
<html lang="ru">
<head>
    <meta charset="UTF-8">
    <title>Мой первый сайт на Nginx</title>
</head>
<body>
    <h1>Nginx работает!</h1>
    <p>Это моя первая страница, которую отдаёт Nginx.</p>
</body>
</html>

Шаг 3. Создать конфиг сайта

sudo nano /etc/nginx/sites-available/student-site

Содержимое конфига:

server {
    listen 80;
    server_name _;

    root /var/www/student-site;
    index index.html;

    location / {
        try_files $uri $uri/ =404;
    }
}
server_name _; часто используют как условное значение, когда нет домена и сайт открывается по IP-адресу сервера.

Шаг 4. Включить сайт

sudo ln -s /etc/nginx/sites-available/student-site /etc/nginx/sites-enabled/

Шаг 5. Проверить конфигурацию

sudo nginx -t

Если всё хорошо, появится примерно такой результат:

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Шаг 6. Перечитать конфиг

sudo systemctl reload nginx
Теперь можно открыть IP-адрес сервера в браузере. Если всё настроено правильно, появится страница «Nginx работает!».

5. Директива location

location позволяет настроить разные правила для разных URL-путей.

Пример: разные ответы для разных путей

server {
    listen 80;
    server_name _;

    root /var/www/student-site;
    index index.html;

    location / {
        try_files $uri $uri/ =404;
    }

    location /images/ {
        root /var/www/student-site;
    }

    location /status {
        return 200 "Server is working\n";
    }
}
URL Что произойдёт
/ Откроется главная страница сайта.
/images/logo.png Nginx попробует найти файл картинки.
/status Nginx вернёт простой текст Server is working.
Важно не путать root и alias. Для базового занятия достаточно использовать root. alias удобен, но требует аккуратности с путями.

6. Логи и диагностика

Когда сайт не открывается, нужно смотреть не только браузер, но и логи сервера.

Команда Назначение
sudo nginx -t Проверить синтаксис конфигурации.
sudo systemctl status nginx Проверить состояние службы Nginx.
sudo systemctl reload nginx Перечитать конфигурацию без полного перезапуска.
sudo systemctl restart nginx Полностью перезапустить Nginx.
sudo tail -f /var/log/nginx/error.log Смотреть ошибки в реальном времени.
sudo tail -f /var/log/nginx/access.log Смотреть входящие запросы.

Типичные ошибки

7. Мини-проверка

Вопросы

  1. Что делает Nginx?
  2. Для чего нужна директива listen?
  3. Что указывает директива root?
  4. Зачем нужен server_name?
  5. Что делает location?
  6. Как проверить конфигурацию Nginx?
  7. Чем отличается reload от restart?
  8. Где обычно лежат логи Nginx?

Ответы для самопроверки

  1. Принимает HTTP-запросы и отдаёт ответы.
  2. Указывает порт, который слушает сервер.
  3. Папку с файлами сайта.
  4. Домен или имя сайта для server block.
  5. Настраивает правила для конкретного URL-пути.
  6. Командой sudo nginx -t.
  7. reload перечитывает конфиг мягко, restart полностью перезапускает службу.
  8. Обычно в /var/log/nginx/.

8. Итоговый шаблон конфига

Этот шаблон можно использовать как основу для простого статического сайта:

server {
    listen 80;
    server_name example.com www.example.com;

    root /var/www/example;
    index index.html index.htm;

    access_log /var/log/nginx/example_access.log;
    error_log /var/log/nginx/example_error.log;

    location / {
        try_files $uri $uri/ =404;
    }
}
Главный принцип: после любого изменения конфига сначала выполняем sudo nginx -t, и только потом — sudo systemctl reload nginx.