Боль, которую мы лечим, простая. Новичок открывает любой "боевой" nginx.conf и видит сорок include, десяток map, зоны лимитов, проксирование, TLS, кэш - и сразу тонет. Кажется, что nginx это что-то необъятное. На самом деле минимально рабочий веб-сервер на nginx - это примерно десять строк. Когда ты их напишешь сам и поймёшь каждую, дальше будет легко наращивать сложность. Так устроен и официальный beginners guide на nginx.org - сначала запусти, потом разбирайся.
nginx минимальный конфиг: из чего он состоит
Запомни одну вещь: главный конфиг nginx обязан содержать два блока верхнего уровня. Первый -
Код: Выделить всё
events { }Код: Выделить всё
http { }Внутри http мы кладём блок
Код: Выделить всё
server { }Код: Выделить всё
listenКод: Выделить всё
server_nameКод: Выделить всё
location { }Давай напишем самый честный nginx простой конфиг, который только отдаёт текст, без всяких файлов и папок:
Код: Выделить всё
events { }
http {
server {
listen 80;
server_name localhost;
location / {
return 200 "Hello from nginx!\n";
}
}
}
Код: Выделить всё
listen 80;Код: Выделить всё
server_name localhost;Код: Выделить всё
location / { ... }Код: Выделить всё
return 200 "...";
nginx настройка с нуля для начинающих: запуск и проверка через curl
Конфиг написан, теперь его надо скормить nginx. Перед любым запуском есть золотое правило: сначала проверь синтаксис командой
Код: Выделить всё
nginx -tКод: Выделить всё
# проверка синтаксиса конфигурации
nginx -t
Код: Выделить всё
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
Код: Выделить всё
nginxКод: Выделить всё
systemctl start nginxКод: Выделить всё
-iКод: Выделить всё
curl -i http://localhost/
Код: Выделить всё
HTTP/1.1 200 OK
Server: nginx/1.30.2
Date: Wed, 17 Jun 2026 10:00:00 GMT
Content-Type: text/plain
Content-Length: 18
Connection: keep-alive
Hello from nginx!
Код: Выделить всё
HTTP/1.1 200 OKКод: Выделить всё
Server: nginx/1.30.2Код: Выделить всё
Content-Length: 18Отдаём свою страницу: root, index и второй location
Возвращать строку - забавно, но настоящий веб-сервер отдаёт файлы. Сделаем так, чтобы nginx брал HTML с диска. Создадим папку и страницу:
Код: Выделить всё
mkdir -p /var/www
printf '<h1>Моя первая страница на nginx</h1>\n' > /var/www/index.html
Код: Выделить всё
rootКод: Выделить всё
indexКод: Выделить всё
events { }
http {
server {
listen 80;
server_name localhost;
location / {
root /var/www;
index index.html;
}
location /ping {
return 200 "pong\n";
}
}
}
Код: Выделить всё
/Второй блок
Код: Выделить всё
location /pingnginx -s reload: применяем правки без простоя
Конфиг изменился - надо применить. Здесь новички совершают типичную ошибку: убивают процесс и запускают заново, ловя секунду недоступности. Правильно - перечитать конфиг на лету командой reload. Но сначала, как всегда,
Код: Выделить всё
nginx -tКод: Выделить всё
nginx -t && nginx -s reload
Код: Выделить всё
&&Как reload работает под капотом (на пальцах, без глубин): мастер-процесс читает новый конфиг, поднимает новых воркеров с новыми правилами, а старым воркерам говорит доработать текущие запросы и завершиться. Поэтому ни одно соединение не рвётся - это graceful reload, плавная перезагрузка. Проверим, что правка применилась:
Код: Выделить всё
curl http://localhost/
curl http://localhost/ping
Читаем ошибки при старте: что говорит nginx, когда что-то не так
Самое полезное умение новичка - не паниковать от красного текста, а читать его. nginx -t почти всегда точно показывает строку и причину. Разберём три классические грабли, на которые натыкаются все.
Грабля 1 - забыл точку с запятой. Каждая простая директива в nginx заканчивается на
Код: Выделить всё
;Код: Выделить всё
nginx: [emerg] directive "listen" is not terminated by ";" in /etc/nginx/nginx.conf:5
nginx: configuration file /etc/nginx/nginx.conf test failed
Код: Выделить всё
:5Грабля 2 - порт уже занят. Если на 80-м порту уже сидит другой процесс (например, Apache или ещё один nginx), при старте увидишь:
Код: Выделить всё
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
Код: Выделить всё
ss -ltnp | grep :80Грабля 3 - права на root-папку или нет файла. Конфиг при этом валиден (nginx -t скажет successful), но в браузере прилетит 403 Forbidden или 404 Not Found. Тогда смотрим не в nginx -t, а в лог ошибок:
Код: Выделить всё
tail -n 20 /var/log/nginx/error.log
Мини-лаба: собери свой сервер руками за пять минут
Повтори всё сам по шагам, не подглядывая в готовое выше. Это и есть та самая nginx настройка с нуля для начинающих, после которой страх перед конфигом пропадает.
- Открой /etc/nginx/nginx.conf (сделай бэкап: ) и замени его содержимое монолитным конфигом с events, http, server и одним location, который возвращает
Код: Выделить всё
cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak.Код: Выделить всё
return 200 "step one\n"; - Проверь синтаксис: . Добейся слова successful. Если ошибка - читай номер строки и чини.
Код: Выделить всё
nginx -t - Запусти (или
Код: Выделить всё
nginx) и проверь:Код: Выделить всё
systemctl start nginx. Убедись, что видишь 200 OK и step one.Код: Выделить всё
curl -i http://localhost/ - Создай /var/www/index.html со своим текстом. Перепиши location на .
Код: Выделить всё
root /var/www; index index.html; - Добавь второй location /ping с .
Код: Выделить всё
return 200 "pong\n"; - Примени правки правильно: .
Код: Выделить всё
nginx -t && nginx -s reload - Проверь оба адреса: (твой HTML) и
Код: Выделить всё
curl http://localhost/(pong).Код: Выделить всё
curl http://localhost/ping - Сломай конфиг специально - убери одну точку с запятой, прогони nginx -t и прочитай ошибку. Затем верни на место. Так ты научишься читать emerg-сообщения без страха.
Контрольные вопросы
- Почему даже самый минимальный nginx.conf обязан содержать пустой блок , и что произойдёт, если его убрать?
Код: Выделить всё
events { } - Чем отличается от связки
Код: Выделить всё
return 200 "text";плюсКод: Выделить всё
root- в каком случае nginx лезет на диск, а в каком нет?Код: Выделить всё
index - Зачем перед всегда запускают
Код: Выделить всё
nginx -s reload, и почему их соединяют черезКод: Выделить всё
nginx -t?Код: Выделить всё
&& - Конфиг прошёл nginx -t с результатом successful, но в браузере 403 - где искать причину и почему nginx -t её не поймал?
Ты собрала рабочий веб-сервер из десяти строк: events и http задают каркас, server слушает порт и имя, location решает, что отдавать - строку через return или файл через root и index. Ты проверяешь конфиг через nginx -t, применяешь правки через nginx -s reload, и читаешь ошибки по слову emerg и номеру строки, а проблемы времени работы - в error.log. Это и есть твой nginx первый конфиг, написанный с нуля и понятый до буквы. На этом фундаменте дальше мы спокойно разберём контексты, наследование директив и модульную структуру больших боевых конфигов - но теперь они тебя уже не напугают.