Настройка виртуальных хостов Nginx
В одной из прошлых статей мы говорили о том, как выполняется установка и первоначальная настройка веб-сервера Nginx в CentOS 7. Этот веб-сервер завоевал огромную популярность благодаря высокой производительности и удачной архитектуре самой программы, из-за которой такая производительность и стала возможной.
Настройка виртуального хоста Nginx
Для этого уже существует папка /etc/nginx/sites-available/ и /etc/nginx/sites-enabled. Первая просто содержит файлы конфигурации, в каждом из которых находится отдельный виртуальный хост. Вторая папка содержит ссылки на файлы из /etc/nginx/sites-available и подключена к основному конфигурационному файлу. Даже если в вашей системе пока такая структура не используется, я рекомендую её создать, чтобы в конфигурации всегда был порядок.
1. Синтаксис виртуального хоста
Каждый виртуальный хост представляет из себя такой блок кода:
server <
listen ip_адрес:порт;
server_name доменные_имена;
root /путь/к/файлам/сайта/;
index index.php index.html;
.
location / <>
.
>
Кроме того, здесь могут использоваться и другие инструкции, но эти основные и обязательные.
2. Виртуальный хост по умолчанию
Теперь разберём создание виртуальных хостов nginx на примере. Давайте создадим виртуальный хост, который будет обрабатывать все необработанные запросы:
sudo vi /etc/nginx/sites-available/000-default.conf
server <
listen *:80 default_server;
server_name _;
root /usr/share/nginx/html;
index index.html index.htm;
location / <>
Все директивы, которые используются в блоке server, могут использоваться и в блоках location. Но нам не обязательно указывать root и index в каждом location. Если их опустить, то будут наследоваться те, которые были указаны в родительском блоке. Блоки server ведут себя аналогичным образом, поэтому, если мы не укажем другой путь к access.log, то будет использоваться путь, указанный в /etc/nginx/nginx.conf и так далее.
Теперь нам нужно активировать созданный виртуальный хост nginx. Для этого создайте символическую ссылку:
Затем убедитесь, что файлы из этого каталога подключены в основном конфигурационном файле:
sudo vi /etc/nginx/nginx.conf
Затем выполните эту команду, чтобы убедится, что вы не допустили ошибок:
Далее перечитайте конфигурацию nginx:
Теперь, если вы откроете IP-адрес сервера, то откроется созданный нами виртуальный хост.
2. Виртуальный хост с доменом
Аналогичным образом можно создать виртуальный хост для домена. Например example.ru:
sudo vi /etc/nginx/sites-available/example.conf
server <
listen *:80;
server_name example.ru;
root /usr/share/nginx/html;
index index.html index.htm;
location / <>
>
Если вы работаете на локальной машине и доступа к DNS выбранного домена у вас нет, то надо добавить его IP в файл /etc/hosts:
Повторите процедуру активации домена, и затем в браузере при запросе к домену example.ru откроется стартовая страница Nginx. Если по каким-либо причинам виртуальный хост Nginx не работает, вы можете посмотреть полный скомпилированный файл nginx.conf:
Также можно проверить, есть ли в нём конфигурация нужного хоста, например, ищем упоминания example.ru:
3. Отключение виртуального хоста
Благодаря структуре директорий, которую мы использовали, будет довольно просто отключить ненужный хост. Все наши виртуальные хосты Nginx находятся в папке /etc/nginx/sites-available, а в активной папке только ссылки на эти файлы. Поэтому для удаления достаточно удалить на него ссылку из папки /etc/nginx/sites-enabled/:
А затем, при необходимости, мы можем активировать его обратно, просто создав ссылку.
Выводы
В этой статье была рассмотрена настройка виртуальных хостов Nginx. Как видите, всё довольно просто и очень удобно, особенно, если вам нужно иметь несколько сайтов на одной машине. Конечно, у Nginx нет таких удобных утилит для активации сайтов, как в Apache, но работать вполне можно.
Русские Блоги
Подробные инструкции по настройке корневого каталога и псевдонима статической службы Nginx
Статический файл
Nginx известен своей высокой производительностью и обычно используется в качестве интерфейсного обратного прокси-сервера. В то же время nginx также является высокопроизводительным статическим файловым сервером. Обычно статические файлы приложения обрабатываются nginx.
Есть две инструкции по настройке статического файла nginx, корня и псевдонима. Для этих двух инструкций вопрос о том, нужно ли добавлять косую черту после пути, часто сбивает с толку.Эта статья резюмирует более общий метод настройки, пробуя разные правила сопоставления.
базовая конфигурация
противКраткие примечания к настройке URL-адреса местоположения NginxКак и в эксперименте с настройкой URL-адреса местоположения в этой статье, в этой статье также используется nginx на бродячей виртуальной машине. Базовая конфигурация следующая:
Каталог проекта выглядит следующим образом:
Есть две статические папки, одна статическая, а другая загружаемая.
Знакомство с root
доступ http://192.168.33.10/static/stc.jpg Вы обнаружите, что изображение было возвращено. Мы еще не настроили расположение, почему файл будет найден правильно? Учиться root или же alias При инструктировании лучше всего добавить символ к расширению файла, чтобы файл не существовал на жестком диске, тогда вы можете nginx из error.log Посмотрите, как nginx ищет файлы.
Можно догадаться, что адрес корневой инструкции в nginx на самом деле замененПосле сопоставленияХост в URL-адресе.
корневая команда
Чтобы проверить вышеприведенное предположение, вам нужно написать еще несколько мест для экспериментов. Добавьте конфигурацию местоположения следующим образом:
Посещение http://192.168.33.10/static/stc.jpg Получил ошибку:
Поскольку URL-адрес изменился, посетите http://192.168.33.10/stc/stc.jpg Чтобы можно было найти картинку. Теперь измените папку stc обратно на статическую.
корень и косая черта
Многие удивятся, косая черта в конце пути / Вы хотите его добавить? Косая черта после статики в местоположении связана с совпавшим URL-адресом, поэтому я не буду повторять его. косая черта для пути в корне / Это можно определить экспериментально. Настройте расположение следующим образом:
Если следовать правилам замены хоста на root, процесс замены
Таким образом, косая черта после корневого пути имеет тот же эффект, с ним или без него. В таком случае кто-то определенно подумал бы об этой конфигурации:
Если вы понимаете правила сопоставления URL-адресов для местоположения nginx из предыдущей статьи, вы должны это увидеть. ^
static/ И не может совпадать. Изменить местоположение
доступ http://192.168.33.10/static/stc.jpg Картинку еще можно получить, перенаправления в гугл нет, что говорит о том, что совпадения нет ^
На самом деле принцип тоже очень простой.Я еще помню наш первый эксперимент.В то время местоположение не было настроено, и картинку тоже можно вернуть. Да хотя ^
static/stc.jpgs? Тогда его можно будет нажать. В настоящее время доступ к картинке все еще может быть проанализирован правильно, поэтому нет /vagrant/pro + static/stc.jpg Эта ситуация. Ключ к пониманию здесь заключается в том, что корень заменяет хост и добавляет совпадающий URL-адрес. Соответствующий URL-адрес, безусловно, включает предыдущую косую черту, но совпадающая часть URL-адреса не будет.
static/stc.jpgs? Режим, URL-адрес посещения http://192.168.33.10/static/stc.jpg
Освоение этого очень важно и напрямую связано со следующим: alias Связь между инструкциями и косой чертой.
Для инструкции root мы можем обобщить.
директива псевдонима
Для root операция очень проста, пока корневой адрес заменен на host, файл находится в пути на жестком диске (реальный адрес). Например, это не замена совпавшего URL-адреса, а замена совпавшей части URL-адреса. Также может быть несколько инструкций псевдонима.
Добавление местоположения почти аналогично добавлению root:
доступ http://192.168.33.10/upload/up.png Нет картинки, проверьте ошибку и получите:
Слово псевдоним очень часто используется в компьютерах. Оно буквально означает «псевдоним». Как следует из названия, оно означает изменение имени. Фактическое правило замены заключается в замене совпадающего URL-адреса на путь в псевдониме. Например, процесс замены в приведенном выше примере можно смоделировать следующим образом:
| процесс | Режим или URL |
|---|---|
| режим URL | ^ /upload |
| псевдоним путь | /vagrant/pro |
| адрес | http://192.168.33.10/upload/up.png |
| Соответствующая часть адреса | /upload + /up.png |
| заменять | /upload == /vagrant/pro |
| результат | /vagrant/pro + /up.png |
Чтобы изменить доступ к изображению, измените местоположение следующим образом:
Посетить в это время http://192.168.33.10/upload/up.png Правильную картину можно получить, имитируя описанный выше процесс расчета следующим образом:
| процесс | Режим или URL |
|---|---|
| режим URL | ^ /upload |
| псевдоним путь | /vagrant/pro/upload |
| адрес | http://192.168.33.10/upload/up.png |
| Соответствующая часть адреса | /upload + /up.png |
| заменять | /upload == /vagrant/pro/upload |
| результат | /vagrant/pro/upload + /up.png |
Из результатов видно, что путь к файлу найден правильно.Если путь к псевдониму инструкции добавлен с косой чертой, то путь к файлу для обработки вычислений будет:
Допускаются множественные косые черты. Это эквивалентно косой черте.
Измените местоположение следующим образом:
Решение тоже очень простое, ставим /vagrant/pro/upload Изменить на /vagrant/pro/upload/ Вот и все. Видно, что косая черта в конце псевдонима не так обязательна, как корневая инструкция. Нужна она или нет, зависит от режима сопоставления URL, соответствующего ссуде.
В предыдущем корневом режиме косая черта без рута (
static/stc.jpgs? ) В этом случае сложно отловить ошибки в случае псевдонима. Если местоположение настроено следующим образом:
В качестве псевдонима большое преимущество alise по сравнению с root заключается в том, что путь в URL-адресе не обязательно должен совпадать с путем к файлу, потому что alise не заменяет хост, а заменяет совпадающую часть хоста. Измените конфигурацию следующим образом:
Посещение http://192.168.33.10/upload/stc.jpg Или же http://192.168.33.10/upload/flask/m.png Доступ к файлам в статическом каталоге возможен, даже если URL-адрес загружен.
Правило замены тоже очень простое, /upload/ == /vagrant/pro/static/ Получать /vagrant/pro/static/ + stc.jpg Или же /vagrant/pro/static/ + flask/m.png 。
подводить итоги
В статической файловой конфигурации nginx могут быть реализованы как команды root, так и псевдонимы. Во избежание путаницы старайтесь не писать шаблоны URL без корневых путей, то есть избегайте static/ Такое начало,Корневой путьизСлэшЕго нужно сохранить, и на самом деле очень странно, что нет корневого пути.
Основное различие между корнем и псевдонимом заключается в заменяющей части. В корневом режиме путь, настроенный пользователем root, заменит хост в совпадающем URL. Псевдоним заменяет совпадающую часть в URL указанным им путем. Косая черта в инструкции не влияет на корневую инструкцию, для alise она может быть сопоставлена в соответствии с правилом замены.
После понимания корня и псевдонима обычно лучше всего настроить корневой каталог проекта и использовать псевдоним для других папок.В конце концов, псевдоним более гибкий.
Частые ошибки в настройках Nginx, из-за которых веб-сервер становится уязвимым
Nginx — это веб-сервер, на котором работает треть всех сайтов в мире. Но если забыть или проигнорировать некоторые ошибки в настройках, можно стать отличной мишенью для злоумышленников. Detectify Crowdsource подготовил список наиболее часто встречающихся ошибок, делающих сайт уязвимым для атак.
Nginx — один из наиболее часто используемых веб-серверов в Интернете, поскольку он модульный, отзывчивый под нагрузкой и может масштабироваться на минимальном железе. Компания Detectify регулярно сканирует Nginx на предмет неправильных настроек и уязвимостей, из-за которых могут пострадать пользователи. Найденные уязвимости потом внедряются в качестве теста безопасности в сканер веб-приложений.
Мы проанализировали почти 50 000 уникальных файлов конфигурации Nginx, загруженных с GitHub с помощью Google BigQuery. С помощью собранных данных удалось выяснить, какие ошибки в конфигурациях встречаются чаще всего. Эта статья прольёт свет на следующие неправильные настройки Nginx:
Отсутствует корневой каталог
Небезопасное использование переменных
Чтение необработанного ответа сервера
Отсутствует корневой каталог
Из почти 50 000 файлов конфигурации Nginx, которые мы проанализировали, наиболее распространёнными корневыми путями были следующие:
Потерявшийся слеш
Одним из признаков того, что сервер Nginx имеет неправильную конфигурацию, является возврат сервером одинакового же ответа при удалении косой черты в URL-адресе. То есть, если http://server/api/user и http://server/apiuser возвращают один и тот же ответ, сервер может быть уязвимым. Он позволяет отправлять следующие запросы:
Небезопасное использование переменных
Некоторые фреймворки, скрипты и конфигурации Nginx небезопасно используют переменные, хранящиеся в Nginx. Это может привести к таким проблемам, как XSS, обход HttpOnly-защиты, раскрытие информации и в некоторых случаях даже RCE.
SCRIPT_NAME
С такой конфигурацией, как эта:
XSS возможен, если PHP-скрипт попытается определить базовый URL на основе SCRIPT_NAME ;
Пример уязвимой конфигурации Nginx:
Произвольные переменные
В некоторых случаях данные, предоставленные пользователем, можно рассматривать как переменную Nginx. Непонятно, почему это происходит, но это встречается не так уж редко, а проверяется довольно-таки сложным путём, как видно из этого отчёта. Если мы поищем сообщение об ошибке, то увидим, что оно находится в модуле фильтра SSI, то есть это связано с SSI.
Одним из способов проверки является установка значения заголовка referer:
Мы просканировали эту неправильную конфигурацию и обнаружили несколько случаев, когда пользователь мог получить значение переменных Nginx. Количество обнаруженных уязвимых экземпляров уменьшилось, что может указывать на то, что уязвимость исправлена.
Чтение необработанного ответа сервера
С proxy_pass Nginx есть возможность перехватывать ошибки и заголовки HTTP, созданные бэкендом (серверной частью). Это очень полезно, если вы хотите скрыть внутренние сообщения об ошибках и заголовки, чтобы они обрабатывались Nginx. Nginx автоматически предоставит страницу пользовательской ошибки, если серверная часть ответит ей. А что происходит, когда Nginx не понимает, что это HTTP-ответ?
Если клиент отправляет недопустимый HTTP-запрос в Nginx, этот запрос будет перенаправлен на серверную часть как есть, и она ответит своим необработанным содержимым. Тогда Nginx не распознает недопустимый HTTP-ответ и просто отправит его клиенту. Представьте себе приложение uWSGI, подобное этому:
И со следующими директивами в Nginx:
proxy_intercept_errors будет обслуживать пользовательский ответ, если бэкенд имеет код ответа больше 300. В нашем приложении uWSGI выше мы отправим ошибку 500, которая будет перехвачена Nginx.
proxy_hide_header почти не требует пояснений; он скроет любой указанный HTTP-заголовок от клиента.
Если мы отправим обычный GET-запрос, Nginx вернёт:
Но если мы отправим неверный HTTP-запрос, например:
То получим такой ответ:
merge_slashes отключены
Мы нашли 33 Nginx-файла, в которых для параметра merge_slashes установлено значение «off».
Попробуйте сами
Мы создали репозиторий GitHub, где вы можете использовать Docker для настройки своего собственного уязвимого тестового сервера Nginx с некоторыми ошибками конфигурации, обсуждаемыми в этой статье, и попробуйте найти их самостоятельно!
Вывод
Nginx — это очень мощная платформа веб-серверов, и легко понять, почему она широко используется. Но с помощью гибкой настройки вы даёте возможность совершать ошибки, которые могут повлиять на безопасность. Не позволяйте злоумышленнику взломать ваш сайт слишком легко, не проверяя эти распространённые ошибки конфигурации.
Вторая часть будет позднее.
Что ещё интересного есть в блоге Cloud4Y
Подписывайтесь на наш Telegram-канал, чтобы не пропустить очередную статью. Пишем не чаще двух раз в неделю и только по делу.
Модуль ngx_http_core_module
Директивы
Эта директива появилась в версии 1.11.8.
Если запрещено, то перенаправления, выдаваемые nginx’ом, будут относительными.
Эта директива появилась в версии 0.8.11.
Разрешает или запрещает использование файлового асинхронного ввода-вывода (AIO) во FreeBSD и Linux:
Во FreeBSD AIO можно использовать, начиная с FreeBSD 4.3. До FreeBSD 11.0 AIO можно либо собрать в ядре статически:
либо загрузить динамически через загружаемый модуль ядра:
В Linux AIO можно использовать только начиная с версии ядра 2.6.22. Кроме того, необходимо также дополнительно включить directio, иначе чтение будет блокирующимся:
В Linux directio можно использовать только для чтения блоков, выравненных на границу 512 байт (или 4К для XFS). Невыравненный конец файла будет читаться блокированно. То же относится к запросам с указанием диапазона запрашиваемых байт (byte-range requests) и к запросам FLV не с начала файла: чтение невыравненных начала и конца ответа будет блокирующимся.
При одновременном включении AIO и sendfile в Linux для файлов, размер которых больше либо равен указанному в директиве directio, будет использоваться AIO, а для файлов меньшего размера или при выключенном directio — sendfile:
Кроме того, читать и отправлять файлы можно в многопоточном режиме (1.7.11), не блокируя при этом рабочий процесс:
Операции чтения или отправки файлов будут обрабатываться потоками из указанного пула. Если пул потоков не задан явно, используется пул с именем “ default ”. Имя пула может быть задано при помощи переменных:
См. также директиву sendfile.
Эта директива появилась в версии 1.9.13.
При включённом aio разрешает его использование для записи файлов. В настоящий момент это работает только при использовании aio threads и ограничено записью временных файлов с данными, полученными от проксируемых серверов.
| Синтаксис: | alias путь ; |
|---|---|
| Умолчание: | — |
| Контекст: | location |
Задаёт замену для указанного location’а. Например, при такой конфигурации
Если alias используется внутри location’а, заданного регулярным выражением, то регулярное выражение должно содержать выделения, а сам alias — ссылки на эти выделения (0.7.40), например:
Если location и последняя часть значения директивы совпадают:
то лучше воспользоваться директивой root:
Эта директива появилась в версии 1.17.10.
Задерживает обработку неавторизованных запросов с кодом ответа 401 для предотвращения атак по времени в случае ограничения доступа по паролю, по результату подзапроса или по JWT.
Позволяет запретить формат передачи данных частями (chunked transfer encoding) в HTTP/1.1. Это может понадобиться при использовании программ, не поддерживающих chunked encoding, несмотря на требования стандарта.
Задаёт размер буфера для чтения тела запроса клиента. Если тело запроса больше заданного буфера, то всё тело запроса или только его часть записывается во временный файл. По умолчанию размер одного буфера равен двум размерам страницы. На x86, других 32-битных платформах и x86-64 это 8K. На других 64-битных платформах это обычно 16K.
При установке значения on временные файлы по окончании обработки запроса не удаляются.
Значение clean разрешает удалять временные файлы, оставшиеся по окончании обработки запроса.
Задаёт каталог для хранения временных файлов с телами запросов клиентов. В каталоге может использоваться иерархия подкаталогов до трёх уровней. Например, при такой конфигурации
путь к временному файлу будет следующего вида:
Задаёт таймаут при чтении тела запроса клиента. Таймаут устанавливается не на всю передачу тела запроса, а только между двумя последовательными операциями чтения. Если по истечении этого времени клиент ничего не передаст, обработка запроса прекращается с ошибкой 408 (Request Time-out).
Задаёт размер буфера для чтения заголовка запроса клиента. Для большинства запросов достаточно буфера размером в 1K байт. Однако если в запросе есть длинные cookies, или же запрос пришёл от WAP-клиента, то он может не поместиться в 1K. Поэтому, если строка запроса или поле заголовка запроса не помещаются полностью в этот буфер, то выделяются буферы большего размера, задаваемые директивой large_client_header_buffers.
Если директива указана на уровне server, то может использоваться значение из сервера по умолчанию. Подробнее см. в разделе “Выбор виртуального сервера”.
Задаёт таймаут при чтении заголовка запроса клиента. Если по истечении этого времени клиент не передаст полностью заголовок, обработка запроса прекращается с ошибкой 408 (Request Time-out).
Задаёт максимально допустимый размер тела запроса клиента. Если размер больше заданного, то клиенту возвращается ошибка 413 (Request Entity Too Large). Следует иметь в виду, что браузеры не умеют корректно показывать эту ошибку. Установка параметра размер в 0 отключает проверку размера тела запроса клиента.
Позволяет производить точную настройку выделения памяти под конкретные соединения. Эта директива не оказывает существенного влияния на производительность, и её не следует использовать. По умолчанию размер равен 256 байт на 32-битных платформах и 512 байт на 64-битных платформах.
До версии 1.9.8 по умолчанию использовалось значение 256 на всех платформах.
Задаёт MIME-тип ответов по умолчанию. Соответствие расширений имён файлов MIME-типу ответов задаётся с помощью директивы types.
Эта директива появилась в версии 0.7.7.
Разрешает использовать флаги O_DIRECT (FreeBSD, Linux), F_NOCACHE (macOS) или функцию directio() (Solaris) при чтении файлов, размер которых больше либо равен указанному. Директива автоматически запрещает (0.7.15) использование sendfile для данного запроса. Рекомендуется использовать для больших файлов:
или при использовании aio в Linux.
Эта директива появилась в версии 0.8.11.
Устанавливает выравнивание для directio. В большинстве случаев достаточно 512-байтового выравнивания, однако при использовании XFS под Linux его нужно увеличить до 4K.
Эта директива появилась в версии 1.1.15.
Определяет, как следует поступать с символическими ссылками при открытии файлов:
Параметры on и if_not_owner требуют дополнительных затрат на обработку.
На системах, не поддерживающих операцию открытия каталогов только для поиска, для использования этих параметров требуется, чтобы рабочие процессы имели право читать все проверяемые каталоги.
Задаёт URI, который будет показываться для указанных ошибок. В значении uri можно использовать переменные.
Кроме того, можно поменять код ответа на другой, используя синтаксис вида “ = ответ ”, например:
Если ошибочный ответ обрабатывается проксированным сервером или FastCGI/uwsgi/SCGI/gRPC-сервером, и этот сервер может вернуть разные коды ответов, например, 200, 302, 401 или 404, то можно выдавать возвращаемый им код:
Если при внутреннем перенаправлении не нужно менять URI и метод, то можно передать обработку ошибки в именованный location:
Если при обработке uri происходит ошибка, клиенту возвращается ответ с кодом последней случившейся ошибки.
Также существует возможность использовать перенаправления URL для обработки ошибок:
В этом случае по умолчанию клиенту возвращается код ответа 302. Его можно изменить только на один из кодов ответа, относящихся к перенаправлениям (301, 302, 303, 307 и 308).
До версий 1.1.16 и 1.0.13 код 307 не обрабатывался как перенаправление.
До версии 1.13.0 код 308 не обрабатывался как перенаправление.
Эта директива появилась в версии 1.3.3.
Разрешает или запрещает автоматическую генерацию поля “ETag” заголовка ответа для статических ресурсов.
Предоставляет контекст конфигурационного файла, в котором указываются директивы HTTP-сервера.
Эта директива появилась в версии 0.7.24.
Определяет, как сравнивать время модификации ответа с временем в поле “If-Modified-Since” заголовка запроса:
off не проверять поле “If-Modified-Since” заголовка запроса (0.7.34); exact точное совпадение; before время модификации ответа меньше или равно времени, заданному в поле “If-Modified-Since” заголовка запроса.
Если включено, nginx игнорирует поля заголовка с недопустимыми именами. Допустимыми считаются имена, состоящие из английских букв, цифр, дефисов и возможно знаков подчёркивания (последнее контролируется директивой underscores_in_headers).
Если директива указана на уровне server, то может использоваться значение из сервера по умолчанию. Подробнее см. в разделе “Выбор виртуального сервера”.
Указывает, что location может использоваться только для внутренних запросов. Для внешних запросов клиенту будет возвращаться ошибка 404 (Not Found). Внутренними запросами являются:
Для предотвращения зацикливания, которое может возникнуть при использовании некорректных конфигураций, количество внутренних перенаправлений ограничено десятью. По достижении этого ограничения будет возвращена ошибка 500 (Internal Server Error). В таком случае в лог-файле ошибок можно увидеть сообщение “rewrite or internal redirection cycle”.
Запрещает keep-alive соединения с некорректно ведущими себя браузерами. Параметры браузер указывают, на какие браузеры это распространяется. Значение msie6 запрещает keep-alive соединения со старыми версиями MSIE после получения запроса POST. Значение safari запрещает keep-alive соединения с Safari и подобными им браузерами на macOS и подобных ей ОС. Значение none разрешает keep-alive соединения со всеми браузерами.
До версии 1.1.18 под значение safari подпадали все Safari и подобные им браузеры на всех ОС, и keep-alive соединения с ними были по умолчанию запрещены.
Эта директива появилась в версии 0.8.0.
Задаёт максимальное число запросов, которые можно сделать по одному keep-alive соединению. После того, как сделано максимальное число запросов, соединение закрывается.
Периодическое закрытие соединений необходимо для освобождения памяти, выделенной под конкретные соединения. Поэтому использование слишком большого максимального числа запросов может приводить к чрезмерному потреблению памяти и не рекомендуется.
До версии 1.19.10 по умолчанию использовалось значение 100.
Эта директива появилась в версии 1.19.10.
Ограничивает максимальное время, в течение которого могут обрабатываться запросы в рамках keep-alive соединения. По достижении заданного времени соединение закрывается после обработки очередного запроса.
Первый параметр задаёт таймаут, в течение которого keep-alive соединение с клиентом не будет закрыто со стороны сервера. Значение 0 запрещает keep-alive соединения с клиентами. Второй необязательный параметр задаёт значение в поле “Keep-Alive: timeout= время ” заголовка ответа. Два параметра могут отличаться друг от друга.
Поле “Keep-Alive: timeout= время ” заголовка понимают Mozilla и Konqueror. MSIE сам закрывает keep-alive соединение примерно через 60 секунд.
Задаёт максимальное число и размер буферов для чтения большого заголовка запроса клиента. Строка запроса не должна превышать размера одного буфера, иначе клиенту возвращается ошибка 414 (Request-URI Too Large). Поле заголовка запроса также не должно превышать размера одного буфера, иначе клиенту возвращается ошибка 400 (Bad Request). Буферы выделяются только по мере необходимости. По умолчанию размер одного буфера равен 8K байт. Если по окончании обработки запроса соединение переходит в состояние keep-alive, эти буферы освобождаются.
Если директива указана на уровне server, то может использоваться значение из сервера по умолчанию. Подробнее см. в разделе “Выбор виртуального сервера”.
Обратите внимание, что данное ограничение действует для всех методов, кроме GET и HEAD.
Ограничивает скорость передачи ответа клиенту. Скорость задаётся в байтах в секунду. Значение 0 отключает ограничение скорости. Ограничение устанавливается на запрос, поэтому, если клиент одновременно откроет два соединения, суммарная скорость будет вдвое выше заданного ограничения.
В значении параметра можно использовать переменные (1.17.0). Это может быть полезно в случаях, когда скорость нужно ограничивать в зависимости от какого-либо условия:
Кроме того, ограничение скорости может быть задано в поле “X-Accel-Limit-Rate” заголовка ответа проксированного сервера. Эту возможность можно запретить с помощью директив proxy_ignore_headers, fastcgi_ignore_headers, uwsgi_ignore_headers и scgi_ignore_headers.
Эта директива появилась в версии 0.8.0.
Задаёт начальный объём данных, после передачи которого начинает ограничиваться скорость передачи ответа клиенту. В значении параметра можно использовать переменные (1.17.0).
Эта директива появилась в версиях 1.1.0 и 1.0.6.
Управляет закрытием соединений с клиентами.
Со значением по умолчанию “ on ” nginx будет ждать и обрабатывать дополнительные данные, поступающие от клиента, перед полным закрытием соединения, но только если эвристика указывает на то, что клиент может ещё послать данные.
Со значением “ always ” nginx всегда будет ждать и обрабатывать дополнительные данные, поступающие от клиента.
Со значением “ off ” nginx не будет ждать поступления дополнительных данных и сразу же закроет соединение. Это поведение нарушает протокол и поэтому не должно использоваться без необходимости.
Для управления закрытием HTTP/2-соединений директива должна быть задана на уровне server (1.19.1).
Если действует lingering_close, эта директива задаёт максимальное время, в течение которого nginx будет обрабатывать (читать и игнорировать) дополнительные данные, поступающие от клиента. По прошествии этого времени соединение будет закрыто, даже если будут ещё данные.
Если действует lingering_close, эта директива задаёт максимальное время ожидания поступления дополнительных данных от клиента. Если в течение этого времени данные не были получены, соединение закрывается. В противном случае данные читаются и игнорируются, и nginx снова ждёт поступления данных. Цикл “ждать-читать-игнорировать” повторяется, но не дольше чем задано директивой lingering_time.
| Синтаксис: | listen адрес [: порт ] [ default_server ] [ ssl ] [ http2 | spdy ] [ proxy_protocol ] [ setfib = число ] [ fastopen = число ] [ backlog = число ] [ rcvbuf = размер ] [ sndbuf = размер ] [ accept_filter = фильтр ] [ deferred ] [ bind ] [ ipv6only = on | off ] [ reuseport ] [ so_keepalive = on | off |[ keepidle ]:[ keepintvl ]:[ keepcnt ]]; listen порт [ default_server ] [ ssl ] [ http2 | spdy ] [ proxy_protocol ] [ setfib = число ] [ fastopen = число ] [ backlog = число ] [ rcvbuf = размер ] [ sndbuf = размер ] [ accept_filter = фильтр ] [ deferred ] [ bind ] [ ipv6only = on | off ] [ reuseport ] [ so_keepalive = on | off |[ keepidle ]:[ keepintvl ]:[ keepcnt ]]; listen unix: путь [ default_server ] [ ssl ] [ http2 | spdy ] [ proxy_protocol ] [ backlog = число ] [ rcvbuf = размер ] [ sndbuf = размер ] [ accept_filter = фильтр ] [ deferred ] [ bind ] [ so_keepalive = on | off |[ keepidle ]:[ keepintvl ]:[ keepcnt ]]; |
|---|---|
| Умолчание: | |
| Контекст: | server |
IPv6-адреса (0.7.36) задаются в квадратных скобках:
UNIX-сокеты (0.8.21) задаются при помощи префикса “ unix: ”:
Параметр ssl (0.7.14) указывает на то, что все соединения, принимаемые на данном порту, должны работать в режиме SSL. Это позволяет задать компактную конфигурацию для сервера, работающего сразу в двух режимах — HTTP и HTTPS.
Параметр proxy_protocol (1.5.12) указывает на то, что все соединения, принимаемые на данном порту, должны использовать протокол PROXY.
Протокол PROXY версии 2 поддерживается начиная с версии 1.13.11.
setfib = число этот параметр (0.8.44) задаёт таблицу маршрутизации, FIB (параметр SO_SETFIB ) для слушающего сокета. В настоящий момент это работает только на FreeBSD. fastopen = число включает “TCP Fast Open” для слушающего сокета (1.5.8) и ограничивает максимальную длину очереди соединений, которые ещё не завершили процесс three-way handshake.
Не включайте “TCP Fast Open”, не убедившись, что сервер может адекватно обрабатывать многократное получение одного и того же SYN-пакета с данными.
До версии 1.3.4, если этот параметр не был задан явно, то для сокета действовали настройки операционной системы.
Ненадлежащее использование параметра может быть небезопасно.
Устанавливает конфигурацию в зависимости от URI запроса.
location можно задать префиксной строкой или регулярным выражением. Регулярные выражения задаются либо с модификатором “
* ” (для поиска совпадения без учёта регистра символов), либо с модификатором “
” (с учётом регистра). Чтобы найти location, соответствующий запросу, вначале проверяются location’ы, заданные префиксными строками (префиксные location’ы). Среди них ищется location с совпадающим префиксом максимальной длины и запоминается. Затем проверяются регулярные выражения, в порядке их следования в конфигурационном файле. Проверка регулярных выражений прекращается после первого же совпадения, и используется соответствующая конфигурация. Если совпадение с регулярным выражением не найдено, то используется конфигурация запомненного ранее префиксного location’а.
Блоки location могут быть вложенными, с некоторыми исключениями, о которых говорится ниже.
Для операционных систем, нечувствительных к регистру символов, таких как macOS и Cygwin, сравнение с префиксными строками производится без учёта регистра (0.7.7). Однако сравнение ограничено только однобайтными locale’ями.
Регулярные выражения могут содержать выделения (0.7.40), которые могут затем использоваться в других директивах.
Если у совпавшего префиксного location’а максимальной длины указан модификатор “ ^
”, то регулярные выражения не проверяются.
Кроме того, с помощью модификатора “ = ” можно задать точное совпадение URI и location. При точном совпадении поиск сразу же прекращается. Например, если запрос “ / ” случается часто, то указав “ location = / ”, можно ускорить обработку этих запросов, так как поиск прекратится после первого же сравнения. Очевидно, что такой location не может иметь вложенные location’ы.
В версиях с 0.7.1 по 0.8.41, если запрос точно совпал с префиксным location’ом без модификаторов “ = ” и “ ^
”, то поиск тоже сразу же прекращается и регулярные выражения также не проверяются.
Проиллюстрируем вышесказанное примером:
Для запроса “ / ” будет выбрана конфигурация А, для запроса “ /index.html ” — конфигурация Б, для запроса “ /documents/document.html ” — конфигурация В, для запроса “ /images/1.gif ” — конфигурация Г, а для запроса “ /documents/1.jpg ” — конфигурация Д.
Префикс “ @ ” задаёт именованный location. Такой location не используется при обычной обработке запросов, а предназначен только для перенаправления в него запросов. Такие location’ы не могут быть вложенными и не могут содержать вложенные location’ы.
Если location задан префиксной строкой со слэшом в конце и запросы обрабатываются при помощи proxy_pass, fastcgi_pass, uwsgi_pass, scgi_pass, memcached_pass или grpc_pass, происходит специальная обработка. В ответ на запрос с URI равным этой строке, но без завершающего слэша, будет возвращено постоянное перенаправление с кодом 301 на URI с добавленным в конец слэшом. Если такое поведение нежелательно, можно задать точное совпадение URI и location, например:
Разрешает или запрещает записывать в error_log ошибки о том, что файл не найден.
Разрешает или запрещает записывать в access_log подзапросы.
Эта директива появилась в версии 1.1.2.
Ограничивает максимальное допустимое число диапазонов в запросах с указанием диапазона запрашиваемых байт (byte-range requests). Запросы, превышающие указанное ограничение, обрабатываются как если бы они не содержали указания диапазонов. По умолчанию число диапазонов не ограничено. Значение 0 полностью запрещает поддержку диапазонов.
Разрешает или запрещает преобразование URI путём замены двух и более подряд идущих слэшей (“ / ”) на один.
Необходимо иметь в виду, что это преобразование необходимо для корректной проверки префиксных строк и регулярных выражений. Если его не делать, то запрос “ //scripts/one.php ” не попадёт в
и может быть обслужен как статический файл. Поэтому он преобразуется к виду “ /scripts/one.php ”.
Запрет преобразования может понадобиться, если в URI используются имена, закодированные методом base64, в котором задействован символ “ / ”. Однако из соображений безопасности лучше избегать отключения преобразования.
Если директива указана на уровне server, то может использоваться значение из сервера по умолчанию. Подробнее см. в разделе “Выбор виртуального сервера”.
Разрешает или запрещает добавлять в ответы для MSIE со статусом больше 400 комментарий для увеличения размера ответа до 512 байт.
Разрешает или запрещает выдавать для MSIE клиентов refresh’ы вместо перенаправлений.
Задаёт кэш, в котором могут храниться:
Кэширование ошибок нужно разрешить отдельно директивой open_file_cache_errors.
У директивы есть следующие параметры:
max задаёт максимальное число элементов в кэше; при переполнении кэша удаляются наименее востребованные элементы (LRU); inactive задаёт время, после которого элемент кэша удаляется, если к нему не было обращений в течение этого времени; по умолчанию 60 секунд; off запрещает кэш.
Разрешает или запрещает кэширование ошибок поиска файлов в open_file_cache.
Задаёт минимальное число обращений к файлу в течение времени, заданного параметром inactive директивы open_file_cache, необходимых для того, чтобы дескриптор файла оставался открытым в кэше.
Определяет время, через которое следует проверять актуальность информации об элементе в open_file_cache.
Задаёт число и размер буферов, используемых при чтении ответа с диска.
До версии 1.9.5 по умолчанию использовалось значение 1 32k.
Разрешает или запрещает указывать порт в абсолютных перенаправлениях, выдаваемых nginx’ом.
Использование в перенаправлениях основного имени сервера управляется директивой server_name_in_redirect.
Если это возможно, то отправка данных клиенту будет отложена пока nginx не накопит по крайней мере указанное количество байт для отправки. Значение 0 запрещает отложенную отправку данных.
Задаёт ядру размер предчтения при работе с файлами.
Разрешает или запрещает делать несколько перенаправлений через директиву error_page. Число таких перенаправлений ограничено.
Позволяет производить точную настройку выделений памяти под конкретные запросы. Эта директива не оказывает существенного влияния на производительность, и её не следует использовать.
Разрешает или запрещает сброс соединений по таймауту, а также при закрытии соединений с помощью нестандартного кода 444 (1.15.2). Сброс делается следующим образом. Перед закрытием сокета для него задаётся параметр SO_LINGER с таймаутом 0. После этого при закрытии сокета клиенту отсылается TCP RST, а вся память, связанная с этим сокетом, освобождается. Это позволяет избежать длительного нахождения уже закрытого сокета в состоянии FIN_WAIT1 с заполненными буферами.
Необходимо отметить, что keep-alive соединения по истечении таймаута закрываются обычным образом.
Задаёт серверы DNS, используемые для преобразования имён вышестоящих серверов в адреса, например:
Адрес может быть указан в виде доменного имени или IP-адреса, и необязательного порта (1.3.1, 1.2.2). Если порт не указан, используется порт 53. Серверы DNS опрашиваются циклически.
До версии 1.1.7 можно было задать лишь один DNS-сервер. Задание DNS-серверов с помощью IPv6-адресов поддерживается начиная с версий 1.3.1 и 1.2.2.
Преобразование имён в IPv6-адреса поддерживается начиная с версии 1.5.8.
По умолчанию nginx кэширует ответы, используя значение TTL из ответа. Необязательный параметр valid позволяет это переопределить:
До версии 1.1.9 настройка времени кэширования была невозможна и nginx всегда кэшировал ответы на срок в 5 минут.
Для предотвращения DNS-спуфинга рекомендуется использовать DNS-серверы в защищённой доверенной локальной сети.
Задаёт таймаут для преобразования имени в адрес, например:
Задаёт корневой каталог для запросов. Например, при такой конфигурации
Эта директива игнорируется на Linux, Solaris и Windows.
Задаёт таймаут при передаче ответа клиенту. Таймаут устанавливается не на всю передачу ответа, а только между двумя операциями записями. Если по истечении этого времени клиент ничего не примет, соединение будет закрыто.
Начиная с nginx 0.8.12 и FreeBSD 5.2.1, можно использовать aio для подгрузки данных для sendfile() :
До версии 1.21.4 по умолчанию ограничения не было.
Задаёт конфигурацию для виртуального сервера. Чёткого разделения виртуальных серверов на IP-based (на основании IP-адреса) и name-based (на основании поля “Host” заголовка запроса) нет. Вместо этого директивами listen описываются все адреса и порты, на которых нужно принимать соединения для этого сервера, а в директиве server_name указываются все имена серверов. Примеры конфигураций описаны в документе “Как nginx обрабатывает запросы”.
Задаёт имена виртуального сервера, например:
Первое имя становится основным именем сервера.
В именах серверов можно использовать звёздочку (“ * ”) для замены первой или последней части имени:
Такие имена называются именами с маской.
Два первых вышеприведённых имени можно объединить в одно:
В качестве имени сервера можно также использовать регулярное выражение, указав перед ним тильду (“
Регулярное выражение может содержать выделения (0.7.40), которые могут затем использоваться в других директивах:
Именованные выделения в регулярном выражении создают переменные (0.8.25), которые могут затем использоваться в других директивах:
Возможно также указать пустое имя сервера (0.7.11):
Это позволяет обрабатывать запросы без поля “Host” заголовка запроса в этом сервере, а не в сервере по умолчанию для данной пары адрес:порт. Это настройка по умолчанию.
До 0.8.48 по умолчанию использовалось имя хоста (hostname) машины.
При поиске виртуального сервера по имени, если имени соответствует несколько из указанных вариантов, например, одновременно подходят и имя с маской, и регулярное выражение, будет выбран первый подходящий вариант в следующем порядке приоритета:
Подробнее имена серверов обсуждаются в отдельном документе.
Разрешает или запрещает использовать в абсолютных перенаправлениях, выдаваемых nginx’ом, основное имя сервера, задаваемое директивой server_name. Если использование основного имени сервера запрещено, то используется имя, указанное в поле “Host” заголовка запроса. Если же этого поля нет, то используется IP-адрес сервера.
Использование в перенаправлениях порта управляется директивой port_in_redirect.
| Синтаксис: | server_names_hash_bucket_size размер ; |
|---|---|
| Умолчание: | |
| Контекст: | http |
Задаёт размер корзины в хэш-таблицах имён серверов. Значение по умолчанию зависит от размера строки кэша процессора. Подробнее настройка хэш-таблиц обсуждается в отдельном документе.
| Синтаксис: | server_names_hash_max_size размер ; |
|---|---|
| Умолчание: | |
| Контекст: | http |
Задаёт максимальный размер хэш-таблиц имён серверов. Подробнее настройка хэш-таблиц обсуждается в отдельном документе.
Разрешает или запрещает выдавать версию nginx’а на страницах ошибок и в поле “Server” заголовка ответа.
Если указан параметр build (1.11.10), то наряду с версией nginx’а будет также выдаваться имя сборки.
Дополнительно, как часть коммерческой подписки, начиная с версии 1.9.13 подписи на страницах ошибок и значение поля “Server” заголовка ответа можно задать явно с помощью строки с переменными. Пустая строка запрещает выдачу поля “Server”.
Эта директива появилась в версии 1.13.10.
Задаёт размер буфера, используемого для хранения тела ответа подзапроса. По умолчанию размер одного буфера равен размеру страницы памяти. В зависимости от платформы это или 4K, или 8K, однако его можно сделать меньше.
Директива применима только для подзапросов, тело ответа которых сохраняется в памяти. Например, подобные подзапросы создаются при помощи SSI.
Разрешает или запрещает использование параметра сокета TCP_NOPUSH во FreeBSD или TCP_CORK в Linux. Параметр включаются только при использовании sendfile. Включение параметра позволяет
Последний параметр может также указывать на именованный location, как в примерах ниже. С версии 0.7.51 последний параметр может также быть кодом :
Пример использования при проксировании Mongrel:
Пример использования вместе с Drupal/FastCGI:
В следующем примере директива try_files
try_files проверяет существование PHP-файла, прежде чем передать запрос FastCGI-серверу.
Пример использования вместе с WordPress и Joomla:
Задаёт соответствие расширений имён файлов и MIME-типов ответов. Расширения нечувствительны к регистру символов. Одному MIME-типу может соответствовать несколько расширений, например:
Для того чтобы для определённого location’а для всех ответов выдавался MIME-тип “ application/octet-stream ”, можно использовать следующее:
Задаёт размер корзины в хэш-таблицах типов. Подробнее настройка хэш-таблиц обсуждается в отдельном документе.
До версии 1.5.13 значение по умолчанию зависело от размера строки кэша процессора.
Задаёт максимальный размер хэш-таблиц типов. Подробнее настройка хэш-таблиц обсуждается в отдельном документе.
Разрешает или запрещает использование символов подчёркивания в полях заголовка запроса клиента. Если использование символов подчёркивания запрещено, поля заголовка запроса, в именах которых есть подчёркивания, помечаются как недопустимые и подпадают под действие директивы ignore_invalid_headers.
Если директива указана на уровне server, то может использоваться значение из сервера по умолчанию. Подробнее см. в разделе “Выбор виртуального сервера”.
| Синтаксис: | variables_hash_bucket_size размер ; |
|---|---|
| Умолчание: | |
| Контекст: | http |
Задаёт размер корзины в хэш-таблице переменных. Подробнее настройка хэш-таблиц обсуждается в отдельном документе.
| Синтаксис: | variables_hash_max_size размер ; |
|---|---|
| Умолчание: | |
| Контекст: | http |
Задаёт максимальный размер хэш-таблицы переменных. Подробнее настройка хэш-таблиц обсуждается в отдельном документе.
До версии 1.5.13 по умолчанию использовалось значение 512.
Встроенные переменные
Протокол PROXY должен быть предварительно включён при помощи установки параметра proxy_protocol в директиве listen.
$proxy_protocol_port порт клиента, полученный из заголовка протокола PROXY (1.11.0)
Протокол PROXY должен быть предварительно включён при помощи установки параметра proxy_protocol в директиве listen.
$proxy_protocol_server_addr адрес сервера, полученный из заголовка протокола PROXY (1.17.6)
Протокол PROXY должен быть предварительно включён при помощи установки параметра proxy_protocol в директиве listen.
$proxy_protocol_server_port порт сервера, полученный из заголовка протокола PROXY (1.17.6)
Протокол PROXY должен быть предварительно включён при помощи установки параметра proxy_protocol в директиве listen.
Значение переменной появляется в location’ах, обрабатываемых директивами proxy_pass, fastcgi_pass, uwsgi_pass и scgi_pass, когда тело было прочитано в буфер в памяти.
$request_body_file имя временного файла, в котором хранится тело запроса
По завершении обработки файл необходимо удалить. Для того чтобы тело запроса всегда записывалось в файл, следует включить client_body_in_file_only. При передаче имени временного файла в проксированном запросе или в запросе к FastCGI/uwsgi/SCGI-серверу следует запретить передачу самого тела директивами proxy_pass_request_body off, fastcgi_pass_request_body off, uwsgi_pass_request_body off или scgi_pass_request_body off соответственно.









