Как отдавать статику через Nginx: пошаговая инструкция
Настроим Nginx так, чтобы он отдавал HTML, CSS, JavaScript и изображения напрямую с диска. Инструкция рассчитана на Debian и Ubuntu с установленным Nginx 1.24 или новее; проверка конфигурации и прав доступа поможет не получить 403 или 404 после запуска.

Что получится и что подготовить
За 15–30 минут вы настроите Nginx на раздачу файлов из каталога сайта: браузер сможет получить HTML, стили, скрипты и изображения без приложения-посредника. Шаги приведены для Debian и Ubuntu с Nginx 1.24 или новее. Для других дистрибутивов пути к конфигурации и имя системного пользователя могут отличаться.
До начала подготовьте доменное имя, если сайт должен открываться по нему, и доступ к серверу с правами на изменение конфигурации и перезапуск Nginx. Нужны установленные Nginx и SSH-доступ. Проверьте версию командой nginx -v: в ответе будет строка вида nginx version: nginx/1.24.0. Каталог сайта в примере — /var/www/example.com/html; замените example.com своим доменом.
Важно: эта настройка отдаёт обычные файлы. Если сайт использует PHP, проксирование запросов к приложению или SPA с маршрутизацией на стороне браузера, конфигурацию нужно дополнить: здесь эти случаи не рассматриваются.
Настройка по шагам
- Создайте каталог и тестовую страницу. Выполните команды от имени пользователя с правами sudo:
Проверьте результат: командаsudo mkdir -p /var/www/example.com/html printf '%s\n' '<!doctype html>' '<html lang="ru">' '<meta charset="utf-8">' '<title>Тест Nginx</title>' '<h1>Статика работает</h1>' '</html>' | sudo tee /var/www/example.com/html/index.htmlls -l /var/www/example.com/html/index.htmlдолжна показать файл. Для теста не обязательно менять владельца каталога: процесс Nginx должен иметь право читать файл и проходить по каталогам пути. - Узнайте, от какого пользователя работает Nginx. В Debian и Ubuntu это часто
www-data, но не полагайтесь на предположение. Посмотрите директивуuserв основном файле/etc/nginx/nginx.conf. Если она закомментирована или отсутствует, выясните пользователя по настройкам конкретного дистрибутива. Проверка на этом шаге — вы знаете, какой учётной записи нужны права чтения. - Создайте конфигурацию виртуального хоста. Сохраните блок ниже в
/etc/nginx/sites-available/example.com, заменив домен и путь при необходимости:
Директиваserver { listen 80; listen [::]:80; server_name example.com www.example.com; root /var/www/example.com/html; index index.html; include /etc/nginx/mime.types; default_type application/octet-stream; location / { try_files $uri $uri/ =404; } }rootзадаёт каталог, откуда Nginx ищет запрошенные файлы.try_filesпроверяет, существует ли путь, и возвращает 404, если файла нет. Проверка: файл сохранён, а домены вserver_nameзаменены на ваши; для теста по IP можно временно использоватьserver_name _;. - Включите сайт. В Debian и Ubuntu конфигурацию обычно подключают символической ссылкой:
Если ссылка уже существует, команда сообщит об этом: не удаляйте её, пока не проверите, куда она ведёт. Проверка:sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/example.comls -l /etc/nginx/sites-enabled/example.comпоказывает ссылку на файл изsites-available. Если ваш дистрибутив не использует эти каталоги, подключите файл способом, предусмотренным его основной конфигурацией Nginx. - Проверьте конфигурацию и примените её. Сначала выполните тест, затем перезагрузите конфигурацию:
Продолжайте только еслиsudo nginx -t sudo systemctl reload nginxnginx -tзаканчивается сообщениемtest is successful. Проверка результата: откройте домен в браузере или выполнитеcurl -I http://example.com/. Для теста на самом сервере, пока DNS ещё не настроен, выполнитеcurl -I -H 'Host: example.com' http://127.0.0.1/. Ожидайте статус200.
Что именно делает конфигурация
index index.html задаёт файл, который Nginx ищет при запросе каталога, например корня сайта. Блок location / обрабатывает запросы по пути, начинающемуся с /. Для запроса /styles/main.css сервер ищет файл относительно root.
Файл mime.types связывает расширения с типами содержимого: например, браузер получает от сервера тип для CSS или изображения. default_type задаёт тип для расширений, которых нет в этой таблице. На стандартных установках Nginx Debian и Ubuntu файл обычно находится в указанном пути. Если проверка конфигурации сообщает, что его не существует, найдите расположение файла в конфигурации вашей системы и исправьте путь.
Права на проход по каталогам — разрешение открыть каждый каталог в пути к файлу, а не только прочитать сам файл. В Linux Nginx может вернуть 403, если у процесса нет доступа хотя бы к одному родительскому каталогу.
Если Nginx отвечает 403, не начинайте с выдачи прав на запись. Для раздачи статики процессу обычно достаточно читать файлы и проходить по каталогам; права на изменение содержимого сайту выдавать не нужно.
Если не получилось
nginx: [emerg] open() ... failed (2: No such file or directory). Nginx не нашёл конфигурационный файл, путь изrootилиmime.types. Проверьте каждый путь командойls -l, исправьте конфигурацию и повторитеsudo nginx -t.nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use). Порт 80 уже занят другим процессом или сервером. Посмотрите, что слушает порт, например командойsudo ss -ltnp, и решите, какой сервис должен принимать HTTP-запросы. Не меняйте порт Nginx наугад: тогда сайт может перестать открываться по обычному адресу.- Браузер показывает 403 Forbidden. Проверьте права чтения файла и прохода по всем каталогам от корня файловой системы до
html. В Debian и Ubuntu имя пользователя частоwww-data, но сверяйте его с настройками. Также проверьте, что запрашиваемый каталог содержит файл из директивыindex. - Браузер показывает 404 Not Found. Убедитесь, что файл есть именно по пути, который получается из
rootи URL. Например, запрос/logo.pngпри указанном корне ищет/var/www/example.com/html/logo.png. Имена файлов в Linux чувствительны к регистру. - В
nginx -tуказана ошибка синтаксиса. Проверьте строку, названную в сообщении, и не пропустили ли вы точку с запятой. Не выполняйте reload, пока тест не пройдёт: тогда Nginx продолжит использовать прежнюю конфигурацию.
Границы этой настройки
Такой виртуальный хост рассчитан на HTTP и прямую раздачу файлов. Он не настраивает HTTPS, автоматическое получение сертификата, сжатие, кэширование в браузере и специальные заголовки безопасности. Не добавляйте долгий срок кэширования, пока не продумали, как менять URL файлов при обновлении: иначе браузер может продолжать использовать старую версию.
Если сайт представляет собой SPA, запрос к адресу вроде /account/settings может вернуть 404: физического файла по этому пути нет. Для такого приложения обычно настраивают возврат к стартовому HTML-файлу, но это поведение не подходит для обычного сайта с файлами и может скрыть реальные ошибки 404. Инвалидация браузерного кэша и HTTPS — отдельные настройки.
Что делать дальше
Сначала проверьте сайт и с сервера, и из внешней сети: это помогает отличить ошибку Nginx от проблемы DNS или сетевого экрана. Затем настройте HTTPS по официальной документации выбранного способа выпуска сертификата. После включения HTTPS проверьте HTTP-статус, тип содержимого CSS и изображений, а также журнал ошибок Nginx, если часть файлов не загружается.
Редактор изображений: Убрать лишнее, заменить фон, добавить объект, расширить кадр — на вашем изображении.
Спросить за 20 ₽Источники: Документация Nginx: модуль ngx_http_core_module, Документация Nginx: настройка простого HTTP-сервера
Частые вопросы
Можно ли использовать эту инструкцию на Debian или Ubuntu с другой версией Nginx?
Что делать, если у меня не домен, а только IP-адрес?
Почему Nginx отвечает 403, хотя файл существует?
Нужно ли менять владельца файлов на www-data?
Будет ли работать эта конфигурация для WordPress или PHP-сайта?
Почему после изменения файла браузер показывает старую страницу?
Материал носит информационный характер и подготовлен редакцией «Агентуры». Он не является офертой, рекламой или индивидуальной консультацией. Упомянутые продукты, компании и торговые знаки принадлежат их правообладателям. Перед принятием решений, влекущих юридические или финансовые последствия, обратитесь к профильному специалисту.