Error 50x html

Пользовательские страницы ошибок в Nginx Nginx – это высокопроизводительный веб-сервер, способный гибко и качественно обслуживать контент. Оформляя страницы своего сайта, вы наверняка захотите создать пользовательский стиль для каждого его элемента, включая и страницы об ошибках, которые появляются, если контент недоступен. В этом руководстве мы покажем, как настроить такие страницы на Nginx. Требования Виртуальный сервер […]

Содержание

  1. Пользовательские страницы ошибок в Nginx
  2. Требования
  3. Создание пользовательской страницы об ошибке
  4. Настройка Nginx для поддержки пользовательских страниц
  5. Настройка пользовательской страницы 404
  6. Настройка страницы ошибок 50х
  7. Перезапуск Nginx и тестирование
  8. Заключение
  9. Настройка пользовательских страниц ошибок Nginx в Ubuntu 14.04
  10. Требования
  11. Создание пользовательской страницы ошибок
  12. Error 404: Not found 🙁
  13. Oops! Something went wrong.
  14. Настройка Nginx для обслуживания пользовательской страницы ошибок
  15. Настройка страницы 404
  16. Настройка страницы ошибок 500
  17. Тестирование настроек
  18. Заключение
  19. Модуль ngx_http_core_module
  20. Директивы
  21. Встроенные переменные

Пользовательские страницы ошибок в Nginx

Nginx – это высокопроизводительный веб-сервер, способный гибко и качественно обслуживать контент. Оформляя страницы своего сайта, вы наверняка захотите создать пользовательский стиль для каждого его элемента, включая и страницы об ошибках, которые появляются, если контент недоступен. В этом руководстве мы покажем, как настроить такие страницы на Nginx.

Требования

  • Виртуальный сервер с пользователем sudo (мы используем сервер Ubuntu 22.04, настроенный по этому мануалу).
  • Предварительно установленный веб-сервер Nginx (инструкции по установке вы найдете здесь).

Создание пользовательской страницы об ошибке

Пользовательские страницы ошибок, которые мы используем здесь, предназначены для демонстрационных целей. Если у вас есть свои страницы, используйте их.

Поместите пользовательские страницы ошибок в каталог /usr/share/nginx/html, корневой каталог Nginx по умолчанию. Там мы создадим страницу для ошибки 404 под названием custom_404.html и для общих ошибок уровня 500 под названием custom_50x.html.

Примечание: Дальнейшие строки можно использовать, если вы тренируетесь на наших страницах. В противном случае не забудьте указать свои данные.

Сначала создайте HTML-файл для своей пользовательской страницы 404 с помощью nano или другого текстового редактора:

sudo nano /usr/share/nginx/html/custom_404.html

Вставьте туда код, который определяет пользовательскую страницу:

Сохраните и закройте файл.

Теперь создайте файл HTML для страницы 500:

sudo nano /usr/share/nginx/html/custom_50x.html

Вставьте в файл следующее:

Сохраните и закройте файл.

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

Настройка Nginx для поддержки пользовательских страниц

Итак, пора сообщить Nginx, что он должен использовать эти страницы всякий раз, когда возникают соответствующие ошибки. Откройте тот файл server-блока в каталоге /etc/nginx/sites-enabled, который вы хотите настроить. Здесь мы используем стандартный файл по имени default. Если вы настраиваете свои собственные страницы, пожалуйста, убедитесь, что используете правильный файл:

sudo nano /etc/nginx/sites-enabled/default

Теперь нужно направить Nginx на соответствующие страницы.

Настройка пользовательской страницы 404

Используйте директиву error_page, чтобы при возникновении ошибки 404 (когда запрошенный файл не найден) обслуживалась созданная вами пользовательская страница. Создайте location-блок для вашего файла, где вы сможете установить его правильное расположение в файловой системе и указать, что файл доступен только через внутренние перенаправления Nginx (не запрашиваемые клиентами напрямую):

Обычно устанавливать root в новом блоке location не нужно, так как он совпадает с root в блоке server. Однако здесь мы явно указываем, что страницы ошибок нужно обслуживать, даже если вы перемещаете свой обычный веб-контент и связанный с ним root в другое место.

Настройка страницы ошибок 50х

Затем добавьте новые директивы, чтобы Nginx, столкнувшись с ошибками уровня 500 (это проблемы, связанные с сервером), мог обслуживать другую пользовательскую страницу, которую вы создали. Здесь мы будем следовать той же формуле, которую вы использовали в предыдущем разделе. На этот раз мы насторим несколько ошибок уровня 500, чтобы все они использовали страницу custom_50x.html.

Внизу мы также добавим фиктивный FastCGI, чтобы вы могли протестировать свою страницу с ошибкой уровня 500. Это выдаст ошибку, потому что бэкэнд на самом деле не существует. Так вы можете убедиться, что ошибки уровня 500 обслуживают вашу пользовательскую страницу.

Отредактируйте файл /etc/nginx/sites-enabled/default следующим образом:

Сохраните и закройте файл, когда закончите.

Перезапуск Nginx и тестирование

Чтобы проверить синтаксис ваших файлов, введите:

Если команда обнаружила какие-либо ошибки, исправьте их, прежде чем продолжить. Перезапустите Nginx, если ошибок нет:

sudo systemctl restart nginx

Теперь, если вы перейдете на домен или IP-адрес вашего сервера и запросите несуществующий файл, вы должны увидеть настроенную вами страницу 404:

Перейдите в расположение вашего FastCGI и вы получите ошибку 502 Bad Gateway, что является ошибкой уровня 50х:

Вернитесь в конфигурационный файл и удалите фиктивный FastCGI.

Заключение

Теперь ваш веб-сервер может обслуживать пользовательские страницы ошибок. Это простой способ персонализировать ваш сайт и обеспечить лучший пользовательский опыт даже при возникновении ошибок. Один из способов оптимизировать эти страницы – разместить на них дополнительную информацию или полезные ссылки для пользователей. Если вы сделаете это, убедитесь, что ссылки доступны даже при возникновении соответствующих ошибок.

Источник

Настройка пользовательских страниц ошибок Nginx в Ubuntu 14.04

Nginx – это высокопроизводительный и гибкий веб-сервер.

При проектировании веб-страниц часто возникает необходимость настроить каждую часть контента, которую будут видеть пользователи, в индивидуальном порядке. Это касается и страниц ошибок, которые возникают, если запрашиваемый контент недоступен. В этом руководстве показано, как настроить Nginx для отображения пользовательских страниц ошибок в системе Ubuntu 14.04.

Требования

Для выполнения данного руководства нужно иметь учётную запись пользователя с привилегиями sudo; подробнее об этом можно узнать в руководстве «Начальная настройка сервера Ubuntu 14.04».

Кроме того, нужно предварительно установить Nginx; чтобы получить инструкции по установке веб-сервера, читайте эту статью.

Создание пользовательской страницы ошибок

Для начала нужно создать свою страницу ошибок.

Примечание: Для тестирования можно использовать следующий код; в противном случае рекомендуется внести в echo собственный текст.

Пользовательские страницы ошибок должны храниться в каталоге /usr/share/nginx/html – стандартном document root веб-сервера Nginx в системе Ubuntu. Создайте страницу 404 по имени custom_404.html и общую страницу для ошибок с кодом 500 по имени custom_50x.html.

Error 404: Not found 🙁

I have no idea where that file is, sorry. Are you sure you typed in the correct URL?

» | sudo tee -a /usr/share/nginx/html/custom_404.html
echo «

Oops! Something went wrong.

We seem to be having some technical difficulties. Hang tight.

» | sudo tee -a /usr/share/nginx/html/custom_50x.html

Итак, теперь на сервере есть две страницы ошибок, которые должны использоваться в случае, если пользователь запрашивает недоступный контент.

Настройка Nginx для обслуживания пользовательской страницы ошибок

Теперь нужно настроить поддержку только что созданных страниц при возникновении соответствующей ошибки. Для этого нужно отредактировать виртуальные хосты (Nginx называет их блоками server); откройте блок server в каталоге /etc/nginx/sites-enabled

В данном руководстве для примера показано, как отредактировать стандартный хост default; если вы используете другие блоки server, выполните инструкции раздела в файлах этих блоков.

sudo nano /etc/nginx/sites-enabled/default

Настройка страницы 404

Конфигурационный файл Nginx определяет страницу 404 при помощи директивы error_page. Нужно отредактировать соответствующий блок файла, чтобы убедиться, что директива root указывает на локальную файловую систему и что файл доступен только по внутренним редиректам Nginx (т.е, не может запрашиваться непосредственно клиентами):

/etc/nginx/sites-enabled/default
server <
listen 80 default_server;
listen [::]:80 default_server ipv6only=on;
. . .
error_page 404 /custom_404.html;
location = /custom_404.html <
root /usr/share/nginx/html;
internal;
>
>

Как правило, редактировать директиву root нет необходимости. Однако здесь она задана явно, чтобы страницы ошибок обслуживались даже в случае перемещения веб-контента и каталога document root в другую точку.

Настройка страницы ошибок 500

Затем нужно добавить директивы для поддержки пользовательской страницы ошибок 500. Это делается точно таким же образом; используйте следующий код:

/etc/nginx/sites-enabled/default
server <
listen 80 default_server;
listen [::]:80 default_server ipv6only=on;
. . .
error_page 404 /custom_404.html;
location = /custom_404.html <
root /usr/share/nginx/html;
internal;
>
error_page 500 502 503 504 /custom_50x.html;
location = /custom_50x.html <
root /usr/share/nginx/html;
internal;
>
location /testing <
fastcgi_pass unix:/does/not/exist;
>
>

В конце файла добавлен фиктивный путь к FastCGI, чтобы протестировать работу страницы 500. В данном случае возникнет ошибка, поскольку бэкэнда не существует. При запросе страницы на экране появится код ошибки 500 и соответствующая пользовательская страница.

Сохраните и закройте файл.

Тестирование настроек

Проверьте синтаксис файла на наличие ошибок при помощи команды:

Если команда обнаружила в файле ошибки, исправьте их. Затем перезапустите веб-сервер:

sudo service nginx restart

Теперь откройте домен или IP сервера в браузере и запросите несуществующий файл, чтобы проверить работу страницы 404:

http:// server_domain_or_IP /thiswillerror

На экране появится страница:

Error 404: Not found 🙁
I have no idea where that file is, sorry. Are you sure you typed in the correct URL?

Если запросить FastCGI, на экране появится страница ошибки 502 Bad Gateway:

http:// server_domain_or_IP /testing
Oops! Something went wrong.
We seem to be having some technical difficulties. Hang tight.

После тестирования удалите фиктивный путь к FastCGI из настроек Nginx.

Заключение

Теперь сервер Nginx обслуживает пользовательские страницы ошибок для сайта. В целом, пользовательские страницы ошибок – это отличный способ помочь посетителям сайта разобраться, в чём дело, предоставить им всю необходимую информацию об ошибке и полезные ссылки (не забудьте убедиться, что ссылки работают даже в случае возникновения ошибок).

Источник

Модуль ngx_http_core_module

Директивы

Синтаксис: absolute_redirect on | off ;
Умолчание:
Контекст: http , server , location

Эта директива появилась в версии 1.11.8.

Если запрещено, то перенаправления, выдаваемые nginx’ом, будут относительными.

Синтаксис: aio on | off | threads [ = pool ];
Умолчание:
Контекст: http , server , location

Эта директива появилась в версии 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 ”. Имя пула может быть задано при помощи переменных:

По умолчанию поддержка многопоточности выключена, её сборку следует разрешить с помощью конфигурационного параметра —with-threads . В настоящий момент многопоточность совместима только с методами epoll, kqueue и eventport. Отправка файлов в многопоточном режиме поддерживается только на Linux.

См. также директиву sendfile.

Синтаксис: aio_write on | off ;
Умолчание:
Контекст: http , server , location

Эта директива появилась в версии 1.9.13.

При включённом aio разрешает его использование для записи файлов. В настоящий момент это работает только при использовании aio threads и ограничено записью временных файлов с данными, полученными от проксируемых серверов.

Синтаксис: alias путь ;
Умолчание:
Контекст: location

Задаёт замену для указанного location’а. Например, при такой конфигурации

на запрос “ /i/top.gif ” будет отдан файл /data/w3/images/top.gif .

В значении параметра путь можно использовать переменные, кроме $document_root и $realpath_root .

Если alias используется внутри location’а, заданного регулярным выражением, то регулярное выражение должно содержать выделения, а сам alias — ссылки на эти выделения (0.7.40), например:

Если location и последняя часть значения директивы совпадают:

то лучше воспользоваться директивой root:

Синтаксис: auth_delay время ;
Умолчание:
Контекст: http , server , location

Эта директива появилась в версии 1.17.10.

Задерживает обработку неавторизованных запросов с кодом ответа 401 для предотвращения атак по времени в случае ограничения доступа по паролю, по результату подзапроса или по JWT.

Синтаксис: chunked_transfer_encoding on | off ;
Умолчание:
Контекст: http , server , location

Позволяет запретить формат передачи данных частями (chunked transfer encoding) в HTTP/1.1. Это может понадобиться при использовании программ, не поддерживающих chunked encoding, несмотря на требования стандарта.

Синтаксис: client_body_buffer_size размер ;
Умолчание:
Контекст: http , server , location

Задаёт размер буфера для чтения тела запроса клиента. Если тело запроса больше заданного буфера, то всё тело запроса или только его часть записывается во временный файл. По умолчанию размер одного буфера равен двум размерам страницы. На x86, других 32-битных платформах и x86-64 это 8K. На других 64-битных платформах это обычно 16K.

Синтаксис: client_body_in_file_only on | clean | off ;
Умолчание:
Контекст: http , server , location

Определяет, сохранять ли всё тело запроса клиента в файл. Директиву можно использовать для отладки и при использовании переменной $request_body_file или метода $r->request_body_file модуля ngx_http_perl_module.

При установке значения on временные файлы по окончании обработки запроса не удаляются.

Значение clean разрешает удалять временные файлы, оставшиеся по окончании обработки запроса.

Синтаксис: client_body_in_single_buffer on | off ;
Умолчание:
Контекст: http , server , location

Определяет, сохранять ли всё тело запроса клиента в одном буфере. Директива рекомендуется при использовании переменной $request_body для уменьшения требуемого числа операций копирования.

Синтаксис: client_body_temp_path путь [ уровень1 [ уровень2 [ уровень3 ]]];
Умолчание:
Контекст: http , server , location

Задаёт каталог для хранения временных файлов с телами запросов клиентов. В каталоге может использоваться иерархия подкаталогов до трёх уровней. Например, при такой конфигурации

путь к временному файлу будет следующего вида:

Синтаксис: client_body_timeout время ;
Умолчание:
Контекст: http , server , location

Задаёт таймаут при чтении тела запроса клиента. Таймаут устанавливается не на всю передачу тела запроса, а только между двумя последовательными операциями чтения. Если по истечении этого времени клиент ничего не передаст, обработка запроса прекращается с ошибкой 408 (Request Time-out).

Синтаксис: client_header_buffer_size размер ;
Умолчание:
Контекст: http , server

Задаёт размер буфера для чтения заголовка запроса клиента. Для большинства запросов достаточно буфера размером в 1K байт. Однако если в запросе есть длинные cookies, или же запрос пришёл от WAP-клиента, то он может не поместиться в 1K. Поэтому, если строка запроса или поле заголовка запроса не помещаются полностью в этот буфер, то выделяются буферы большего размера, задаваемые директивой large_client_header_buffers.

Если директива указана на уровне server, то может использоваться значение из сервера по умолчанию. Подробнее см. в разделе “Выбор виртуального сервера”.

Синтаксис: client_header_timeout время ;
Умолчание:
Контекст: http , server

Задаёт таймаут при чтении заголовка запроса клиента. Если по истечении этого времени клиент не передаст полностью заголовок, обработка запроса прекращается с ошибкой 408 (Request Time-out).

Синтаксис: client_max_body_size размер ;
Умолчание:
Контекст: http , server , location

Задаёт максимально допустимый размер тела запроса клиента. Если размер больше заданного, то клиенту возвращается ошибка 413 (Request Entity Too Large). Следует иметь в виду, что браузеры не умеют корректно показывать эту ошибку. Установка параметра размер в 0 отключает проверку размера тела запроса клиента.

Синтаксис: connection_pool_size размер ;
Умолчание:
Контекст: http , server

Позволяет производить точную настройку выделения памяти под конкретные соединения. Эта директива не оказывает существенного влияния на производительность, и её не следует использовать. По умолчанию размер равен 256 байт на 32-битных платформах и 512 байт на 64-битных платформах.

До версии 1.9.8 по умолчанию использовалось значение 256 на всех платформах.

Синтаксис: default_type mime-тип ;
Умолчание:
Контекст: http , server , location

Задаёт MIME-тип ответов по умолчанию. Соответствие расширений имён файлов MIME-типу ответов задаётся с помощью директивы types.

Синтаксис: directio размер | off ;
Умолчание:
Контекст: http , server , location

Эта директива появилась в версии 0.7.7.

Разрешает использовать флаги O_DIRECT (FreeBSD, Linux), F_NOCACHE (macOS) или функцию directio() (Solaris) при чтении файлов, размер которых больше либо равен указанному. Директива автоматически запрещает (0.7.15) использование sendfile для данного запроса. Рекомендуется использовать для больших файлов:

или при использовании aio в Linux.

Синтаксис: directio_alignment размер ;
Умолчание:
Контекст: http , server , location

Эта директива появилась в версии 0.8.11.

Устанавливает выравнивание для directio. В большинстве случаев достаточно 512-байтового выравнивания, однако при использовании XFS под Linux его нужно увеличить до 4K.

Синтаксис: disable_symlinks off ;
disable_symlinks on | if_not_owner [ from = часть ];
Умолчание:
Контекст: http , server , location

Эта директива появилась в версии 1.1.15.

Определяет, как следует поступать с символическими ссылками при открытии файлов:

off Символические ссылки в пути допускаются и не проверяются. Это стандартное поведение. on Если любой компонент пути является символической ссылкой, доступ к файлу запрещается. if_not_owner Доступ к файлу запрещается, если любой компонент пути является символической ссылкой, а ссылка и объект, на который она ссылается, имеют разных владельцев. from = часть При проверке символических ссылок (параметры on и if_not_owner ) обычно проверяются все компоненты пути. Можно не проверять символические ссылки в начальной части пути, указав дополнительно параметр from = часть . В этом случае символические ссылки проверяются лишь начиная с компонента пути, который следует за заданной начальной частью. Если значение не является начальной частью проверяемого пути, путь проверяется целиком, как если бы этот параметр не был указан вовсе. Если значение целиком совпадает с именем файла, символические ссылки не проверяются. В значении параметра можно использовать переменные.

Эта директива доступна только на системах, в которых есть интерфейсы openat() и fstatat() . К таким системам относятся современные версии FreeBSD, Linux и Solaris.

Параметры on и if_not_owner требуют дополнительных затрат на обработку.

На системах, не поддерживающих операцию открытия каталогов только для поиска, для использования этих параметров требуется, чтобы рабочие процессы имели право читать все проверяемые каталоги.

Синтаксис: error_page код . [ = [ ответ ]] uri ;
Умолчание:
Контекст: http , server , location , if в location

Задаёт URI, который будет показываться для указанных ошибок. В значении uri можно использовать переменные.

При этом делается внутреннее перенаправление на указанный uri , а метод запроса клиента меняется на “ GET ” (для всех методов, отличных от “ GET ” и “ HEAD ”).

Кроме того, можно поменять код ответа на другой, используя синтаксис вида “ = ответ ”, например:

Если ошибочный ответ обрабатывается проксированным сервером или 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 не обрабатывался как перенаправление.

Директивы наследуются с предыдущего уровня конфигурации при условии, что на данном уровне не описаны свои директивы error_page .

Синтаксис: etag on | off ;
Умолчание:
Контекст: http , server , location

Эта директива появилась в версии 1.3.3.

Разрешает или запрещает автоматическую генерацию поля “ETag” заголовка ответа для статических ресурсов.

Синтаксис: http < . >
Умолчание:
Контекст: main

Предоставляет контекст конфигурационного файла, в котором указываются директивы HTTP-сервера.

Синтаксис: if_modified_since off | exact | before ;
Умолчание:
Контекст: http , server , location

Эта директива появилась в версии 0.7.24.

Определяет, как сравнивать время модификации ответа с временем в поле “If-Modified-Since” заголовка запроса:

off ответ всегда считается изменившимся (0.7.34); exact точное совпадение; before время модификации ответа меньше или равно времени, заданному в поле “If-Modified-Since” заголовка запроса.

Синтаксис: ignore_invalid_headers on | off ;
Умолчание:
Контекст: http , server

Если включено, nginx игнорирует поля заголовка с недопустимыми именами. Допустимыми считаются имена, состоящие из английских букв, цифр, дефисов и возможно знаков подчёркивания (последнее контролируется директивой underscores_in_headers).

Если директива указана на уровне server, то может использоваться значение из сервера по умолчанию. Подробнее см. в разделе “Выбор виртуального сервера”.

Синтаксис: internal;
Умолчание:
Контекст: location

Указывает, что location может использоваться только для внутренних запросов. Для внешних запросов клиенту будет возвращаться ошибка 404 (Not Found). Внутренними запросами являются:

  • запросы, перенаправленные директивами error_page, index, random_index и try_files;
  • запросы, перенаправленные с помощью поля “X-Accel-Redirect” заголовка ответа вышестоящего сервера;
  • подзапросы, формируемые командой “ include virtual ” модуля ngx_http_ssi_module, директивами модуля ngx_http_addition_module, а также директивами auth_request и mirror;
  • запросы, изменённые директивой rewrite.

Для предотвращения зацикливания, которое может возникнуть при использовании некорректных конфигураций, количество внутренних перенаправлений ограничено десятью. По достижении этого ограничения будет возвращена ошибка 500 (Internal Server Error). В таком случае в лог-файле ошибок можно увидеть сообщение “rewrite or internal redirection cycle”.

Синтаксис: keepalive_disable none | браузер . ;
Умолчание:
Контекст: http , server , location

Запрещает keep-alive соединения с некорректно ведущими себя браузерами. Параметры браузер указывают, на какие браузеры это распространяется. Значение msie6 запрещает keep-alive соединения со старыми версиями MSIE после получения запроса POST. Значение safari запрещает keep-alive соединения с Safari и подобными им браузерами на macOS и подобных ей ОС. Значение none разрешает keep-alive соединения со всеми браузерами.

До версии 1.1.18 под значение safari подпадали все Safari и подобные им браузеры на всех ОС, и keep-alive соединения с ними были по умолчанию запрещены.

Синтаксис: keepalive_requests число ;
Умолчание:
Контекст: http , server , location

Эта директива появилась в версии 0.8.0.

Задаёт максимальное число запросов, которые можно сделать по одному keep-alive соединению. После того, как сделано максимальное число запросов, соединение закрывается.

Периодическое закрытие соединений необходимо для освобождения памяти, выделенной под конкретные соединения. Поэтому использование слишком большого максимального числа запросов может приводить к чрезмерному потреблению памяти и не рекомендуется.

До версии 1.19.10 по умолчанию использовалось значение 100.

Синтаксис: keepalive_time время ;
Умолчание:
Контекст: http , server , location

Эта директива появилась в версии 1.19.10.

Ограничивает максимальное время, в течение которого могут обрабатываться запросы в рамках keep-alive соединения. По достижении заданного времени соединение закрывается после обработки очередного запроса.

Синтаксис: keepalive_timeout таймаут [ заголовок_таймаута ];
Умолчание:
Контекст: http , server , location

Первый параметр задаёт таймаут, в течение которого keep-alive соединение с клиентом не будет закрыто со стороны сервера. Значение 0 запрещает keep-alive соединения с клиентами. Второй необязательный параметр задаёт значение в поле “Keep-Alive: timeout= время ” заголовка ответа. Два параметра могут отличаться друг от друга.

Поле “Keep-Alive: timeout= время ” заголовка понимают Mozilla и Konqueror. MSIE сам закрывает keep-alive соединение примерно через 60 секунд.

Синтаксис: large_client_header_buffers число размер ;
Умолчание:
Контекст: http , server

Задаёт максимальное число и размер буферов для чтения большого заголовка запроса клиента. Строка запроса не должна превышать размера одного буфера, иначе клиенту возвращается ошибка 414 (Request-URI Too Large). Поле заголовка запроса также не должно превышать размера одного буфера, иначе клиенту возвращается ошибка 400 (Bad Request). Буферы выделяются только по мере необходимости. По умолчанию размер одного буфера равен 8K байт. Если по окончании обработки запроса соединение переходит в состояние keep-alive, эти буферы освобождаются.

Если директива указана на уровне server, то может использоваться значение из сервера по умолчанию. Подробнее см. в разделе “Выбор виртуального сервера”.

Синтаксис: limit_except метод . < . >
Умолчание:
Контекст: location

Ограничивает HTTP-методы, доступные внутри location. Параметр метод может быть одним из GET , HEAD , POST , PUT , DELETE , MKCOL , COPY , MOVE , OPTIONS , PROPFIND , PROPPATCH , LOCK , UNLOCK или PATCH . Если разрешён метод GET , то метод HEAD также будет разрешён. Доступ к остальным методам может быть ограничен при помощи директив модулей ngx_http_access_module, ngx_http_auth_basic_module и ngx_http_auth_jwt_module (1.13.10):

Обратите внимание, что данное ограничение действует для всех методов, кроме GET и HEAD.

Синтаксис: limit_rate скорость ;
Умолчание:
Контекст: http , server , location , if в location

Ограничивает скорость передачи ответа клиенту. Скорость задаётся в байтах в секунду. Значение 0 отключает ограничение скорости. Ограничение устанавливается на запрос, поэтому, если клиент одновременно откроет два соединения, суммарная скорость будет вдвое выше заданного ограничения.

В значении параметра можно использовать переменные (1.17.0). Это может быть полезно в случаях, когда скорость нужно ограничивать в зависимости от какого-либо условия:

Ограничение скорости можно также задать в переменной $limit_rate , однако начиная с 1.17.0 использовать данный метод не рекомендуется:

Кроме того, ограничение скорости может быть задано в поле “X-Accel-Limit-Rate” заголовка ответа проксированного сервера. Эту возможность можно запретить с помощью директив proxy_ignore_headers, fastcgi_ignore_headers, uwsgi_ignore_headers и scgi_ignore_headers.

Синтаксис: limit_rate_after размер ;
Умолчание:
Контекст: http , server , location , if в location

Эта директива появилась в версии 0.8.0.

Задаёт начальный объём данных, после передачи которого начинает ограничиваться скорость передачи ответа клиенту. В значении параметра можно использовать переменные (1.17.0).

Синтаксис: lingering_close off | on | always ;
Умолчание:
Контекст: http , server , location

Эта директива появилась в версиях 1.1.0 и 1.0.6.

Управляет закрытием соединений с клиентами.

Со значением по умолчанию “ on ” nginx будет ждать и обрабатывать дополнительные данные, поступающие от клиента, перед полным закрытием соединения, но только если эвристика указывает на то, что клиент может ещё послать данные.

Со значением “ always ” nginx всегда будет ждать и обрабатывать дополнительные данные, поступающие от клиента.

Со значением “ off ” nginx не будет ждать поступления дополнительных данных и сразу же закроет соединение. Это поведение нарушает протокол и поэтому не должно использоваться без необходимости.

Для управления закрытием HTTP/2-соединений директива должна быть задана на уровне server (1.19.1).

Синтаксис: lingering_time время ;
Умолчание:
Контекст: http , server , location

Если действует lingering_close, эта директива задаёт максимальное время, в течение которого nginx будет обрабатывать (читать и игнорировать) дополнительные данные, поступающие от клиента. По прошествии этого времени соединение будет закрыто, даже если будут ещё данные.

Синтаксис: lingering_timeout время ;
Умолчание:
Контекст: http , server , location

Если действует 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

Задаёт адрес и порт для IP или путь для UNIX-сокета, на которых сервер будет принимать запросы. Можно указать адрес и порт , либо только адрес или только порт . Кроме того, адрес может быть именем хоста, например:

IPv6-адреса (0.7.36) задаются в квадратных скобках:

UNIX-сокеты (0.8.21) задаются при помощи префикса “ unix: ”:

Если указан только адрес , то используется порт 80.

Если директива не указана, то используется либо *:80 , если nginx работает с привилегиями суперпользователя, либо *:8000 .

Если у директивы есть параметр default_server , то сервер, в котором описана эта директива, будет сервером по умолчанию для указанной пары адрес : порт . Если же директив с параметром default_server нет, то сервером по умолчанию будет первый сервер, в котором описана пара адрес : порт .

До версии 0.8.21 этот параметр назывался просто default .

Параметр ssl (0.7.14) указывает на то, что все соединения, принимаемые на данном порту, должны работать в режиме SSL. Это позволяет задать компактную конфигурацию для сервера, работающего сразу в двух режимах — HTTP и HTTPS.

Параметр http2 (1.9.5) позволяет принимать на этом порту HTTP/2-соединения. Обычно, чтобы это работало, следует также указать параметр ssl , однако nginx можно также настроить и на приём HTTP/2-соединений без SSL.

Параметр spdy (1.3.15-1.9.4) позволяет принимать на этом порту SPDY-соединения. Обычно, чтобы это работало, следует также указать параметр ssl , однако nginx можно также настроить и на приём SPDY-соединений без SSL.

Параметр proxy_protocol (1.5.12) указывает на то, что все соединения, принимаемые на данном порту, должны использовать протокол PROXY.

Протокол PROXY версии 2 поддерживается начиная с версии 1.13.11.

В директиве listen можно также указать несколько дополнительных параметров, специфичных для связанных с сокетами системных вызовов. Эти параметры можно задать в любой директиве listen , но только один раз для указанной пары адрес : порт .

До версии 0.8.21 их можно было указывать лишь в директиве listen совместно с параметром default .

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, если этот параметр не был задан явно, то для сокета действовали настройки операционной системы.

Ненадлежащее использование параметра может быть небезопасно.

Синтаксис: location [ = |

] uri < . >
location @ имя < . > Умолчание: — Контекст: server , location

Устанавливает конфигурацию в зависимости от URI запроса.

Для сопоставления используется URI запроса в нормализованном виде, после декодирования текста, заданного в виде “ %XX ”, преобразования относительных элементов пути “ . ” и “ .. ” в реальные и возможной замены двух и более подряд идущих слэшей на один.

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, например:

Синтаксис: log_not_found on | off ;
Умолчание:
Контекст: http , server , location

Разрешает или запрещает записывать в error_log ошибки о том, что файл не найден.

Синтаксис: log_subrequest on | off ;
Умолчание:
Контекст: http , server , location

Разрешает или запрещает записывать в access_log подзапросы.

Синтаксис: max_ranges число ;
Умолчание:
Контекст: http , server , location

Эта директива появилась в версии 1.1.2.

Ограничивает максимальное допустимое число диапазонов в запросах с указанием диапазона запрашиваемых байт (byte-range requests). Запросы, превышающие указанное ограничение, обрабатываются как если бы они не содержали указания диапазонов. По умолчанию число диапазонов не ограничено. Значение 0 полностью запрещает поддержку диапазонов.

Синтаксис: merge_slashes on | off ;
Умолчание:
Контекст: http , server

Разрешает или запрещает преобразование URI путём замены двух и более подряд идущих слэшей (“ / ”) на один.

Необходимо иметь в виду, что это преобразование необходимо для корректной проверки префиксных строк и регулярных выражений. Если его не делать, то запрос “ //scripts/one.php ” не попадёт в

и может быть обслужен как статический файл. Поэтому он преобразуется к виду “ /scripts/one.php ”.

Запрет преобразования может понадобиться, если в URI используются имена, закодированные методом base64, в котором задействован символ “ / ”. Однако из соображений безопасности лучше избегать отключения преобразования.

Если директива указана на уровне server, то может использоваться значение из сервера по умолчанию. Подробнее см. в разделе “Выбор виртуального сервера”.

Синтаксис: msie_padding on | off ;
Умолчание:
Контекст: http , server , location

Разрешает или запрещает добавлять в ответы для MSIE со статусом больше 400 комментарий для увеличения размера ответа до 512 байт.

Синтаксис: msie_refresh on | off ;
Умолчание:
Контекст: http , server , location

Разрешает или запрещает выдавать для MSIE клиентов refresh’ы вместо перенаправлений.

Синтаксис: open_file_cache off ;
open_file_cache max = N [ inactive = время ];
Умолчание:
Контекст: http , server , location

Задаёт кэш, в котором могут храниться:

  • дескрипторы открытых файлов, информация об их размерах и времени модификации;
  • информация о существовании каталогов;
  • информация об ошибках поиска файла — “нет файла”, “нет прав на чтение” и тому подобное.

Кэширование ошибок нужно разрешить отдельно директивой open_file_cache_errors.

У директивы есть следующие параметры:

max задаёт максимальное число элементов в кэше; при переполнении кэша удаляются наименее востребованные элементы (LRU); inactive задаёт время, после которого элемент кэша удаляется, если к нему не было обращений в течение этого времени; по умолчанию 60 секунд; off запрещает кэш.

Синтаксис: open_file_cache_errors on | off ;
Умолчание:
Контекст: http , server , location

Разрешает или запрещает кэширование ошибок поиска файлов в open_file_cache.

Синтаксис: open_file_cache_min_uses число ;
Умолчание:
Контекст: http , server , location

Задаёт минимальное число обращений к файлу в течение времени, заданного параметром inactive директивы open_file_cache, необходимых для того, чтобы дескриптор файла оставался открытым в кэше.

Синтаксис: open_file_cache_valid время ;
Умолчание:
Контекст: http , server , location

Определяет время, через которое следует проверять актуальность информации об элементе в open_file_cache.

Синтаксис: output_buffers number size ;
Умолчание:
Контекст: http , server , location

Задаёт число и размер буферов, используемых при чтении ответа с диска.

До версии 1.9.5 по умолчанию использовалось значение 1 32k.

Синтаксис: port_in_redirect on | off ;
Умолчание:
Контекст: http , server , location

Разрешает или запрещает указывать порт в абсолютных перенаправлениях, выдаваемых nginx’ом.

Использование в перенаправлениях основного имени сервера управляется директивой server_name_in_redirect.

Синтаксис: postpone_output размер ;
Умолчание:
Контекст: http , server , location

Если это возможно, то отправка данных клиенту будет отложена пока nginx не накопит по крайней мере указанное количество байт для отправки. Значение 0 запрещает отложенную отправку данных.

Синтаксис: read_ahead размер ;
Умолчание:
Контекст: http , server , location

Задаёт ядру размер предчтения при работе с файлами.

На Linux используется системный вызов posix_fadvise(0, 0, 0, POSIX_FADV_SEQUENTIAL) , поэтому параметр размер там игнорируется.

На FreeBSD используется системный вызов fcntl(O_READAHEAD, размер ) , появившийся во FreeBSD 9.0-CURRENT. Для FreeBSD 7 необходимо установить патч.

Синтаксис: recursive_error_pages on | off ;
Умолчание:
Контекст: http , server , location

Разрешает или запрещает делать несколько перенаправлений через директиву error_page. Число таких перенаправлений ограничено.

Синтаксис: request_pool_size размер ;
Умолчание:
Контекст: http , server

Позволяет производить точную настройку выделений памяти под конкретные запросы. Эта директива не оказывает существенного влияния на производительность, и её не следует использовать.

Синтаксис: reset_timedout_connection on | off ;
Умолчание:
Контекст: http , server , location

Разрешает или запрещает сброс соединений по таймауту, а также при закрытии соединений с помощью нестандартного кода 444 (1.15.2). Сброс делается следующим образом. Перед закрытием сокета для него задаётся параметр SO_LINGER с таймаутом 0. После этого при закрытии сокета клиенту отсылается TCP RST, а вся память, связанная с этим сокетом, освобождается. Это позволяет избежать длительного нахождения уже закрытого сокета в состоянии FIN_WAIT1 с заполненными буферами.

Необходимо отметить, что keep-alive соединения по истечении таймаута закрываются обычным образом.

Синтаксис: resolver адрес . [ valid = время ] [ ipv4 = on | off ] [ ipv6 = on | off ] [ status_zone = зона ];
Умолчание:
Контекст: http , server , location

Задаёт серверы DNS, используемые для преобразования имён вышестоящих серверов в адреса, например:

Адрес может быть указан в виде доменного имени или IP-адреса, и необязательного порта (1.3.1, 1.2.2). Если порт не указан, используется порт 53. Серверы DNS опрашиваются циклически.

До версии 1.1.7 можно было задать лишь один DNS-сервер. Задание DNS-серверов с помощью IPv6-адресов поддерживается начиная с версий 1.3.1 и 1.2.2.

По умолчанию nginx будет искать как IPv4-, так и IPv6-адреса при преобразовании имён в адреса. Если поиск IPv4- или IPv6-адресов нежелателен, можно указать параметр ipv4=off (1.23.1) или ipv6=off .

Преобразование имён в IPv6-адреса поддерживается начиная с версии 1.5.8.

По умолчанию nginx кэширует ответы, используя значение TTL из ответа. Необязательный параметр valid позволяет это переопределить:

До версии 1.1.9 настройка времени кэширования была невозможна и nginx всегда кэшировал ответы на срок в 5 минут.

Для предотвращения DNS-спуфинга рекомендуется использовать DNS-серверы в защищённой доверенной локальной сети.

Необязательный параметр status_zone (1.17.1) включает сбор информации о запросах и ответах сервера DNS в указанной зоне . Параметр доступен как часть коммерческой подписки.

Синтаксис: resolver_timeout время ;
Умолчание:
Контекст: http , server , location

Задаёт таймаут для преобразования имени в адрес, например:

Синтаксис: root путь ;
Умолчание:
Контекст: http , server , location , if в location

Задаёт корневой каталог для запросов. Например, при такой конфигурации

в ответ на запрос “ /i/top.gif ” будет отдан файл /data/w3/i/top.gif .

В значении параметра путь можно использовать переменные, кроме $document_root и $realpath_root .

Путь к файлу формируется путём простого добавления URI к значению директивы root . Если же URI необходимо поменять, следует воспользоваться директивой alias.

Синтаксис: satisfy all | any ;
Умолчание:
Контекст: http , server , location
Синтаксис: send_lowat размер ;
Умолчание:
Контекст: http , server , location

При установке этой директивы в ненулевое значение nginx будет пытаться минимизировать число операций отправки на клиентских сокетах либо при помощи флага NOTE_LOWAT метода kqueue, либо при помощи параметра сокета SO_SNDLOWAT . В обоих случаях будет использован указанный размер .

Эта директива игнорируется на Linux, Solaris и Windows.

Синтаксис: send_timeout время ;
Умолчание:
Контекст: http , server , location

Задаёт таймаут при передаче ответа клиенту. Таймаут устанавливается не на всю передачу ответа, а только между двумя операциями записями. Если по истечении этого времени клиент ничего не примет, соединение будет закрыто.

Синтаксис: sendfile on | off ;
Умолчание:
Контекст: http , server , location , if в location

Разрешает или запрещает использовать sendfile() .

Начиная с nginx 0.8.12 и FreeBSD 5.2.1, можно использовать aio для подгрузки данных для sendfile() :

В такой конфигурации функция sendfile() вызывается с флагом SF_NODISKIO , в результате чего она не блокируется на диске, а сообщает об отсутствии данных в памяти. После этого nginx инициирует асинхронную подгрузку данных, читая один байт. При этом ядро FreeBSD подгружает в память первые 128K байт файла, однако при последующих чтениях файл подгружается частями только по 16K. Изменить это можно с помощью директивы read_ahead.

До версии 1.7.11 подгрузка данных включалась с помощью aio sendfile; .

Синтаксис: sendfile_max_chunk размер ;
Умолчание:
Контекст: http , server , location

Ограничивает объём данных, который может передан за один вызов sendfile() . Без этого ограничения одно быстрое соединение может целиком захватить рабочий процесс.

До версии 1.21.4 по умолчанию ограничения не было.

Синтаксис: server < . >
Умолчание:
Контекст: http

Задаёт конфигурацию для виртуального сервера. Чёткого разделения виртуальных серверов на IP-based (на основании IP-адреса) и name-based (на основании поля “Host” заголовка запроса) нет. Вместо этого директивами listen описываются все адреса и порты, на которых нужно принимать соединения для этого сервера, а в директиве server_name указываются все имена серверов. Примеры конфигураций описаны в документе “Как nginx обрабатывает запросы”.

Синтаксис: server_name имя . ;
Умолчание:
Контекст: server

Задаёт имена виртуального сервера, например:

Первое имя становится основным именем сервера.

В именах серверов можно использовать звёздочку (“ * ”) для замены первой или последней части имени:

Такие имена называются именами с маской.

Два первых вышеприведённых имени можно объединить в одно:

В качестве имени сервера можно также использовать регулярное выражение, указав перед ним тильду (“

Регулярное выражение может содержать выделения (0.7.40), которые могут затем использоваться в других директивах:

Именованные выделения в регулярном выражении создают переменные (0.8.25), которые могут затем использоваться в других директивах:

Если параметр директивы установлен в “ $hostname ” (0.9.4), то подставляется имя хоста (hostname) машины.

Возможно также указать пустое имя сервера (0.7.11):

Это позволяет обрабатывать запросы без поля “Host” заголовка запроса в этом сервере, а не в сервере по умолчанию для данной пары адрес:порт. Это настройка по умолчанию.

До 0.8.48 по умолчанию использовалось имя хоста (hostname) машины.

При поиске виртуального сервера по имени, если имени соответствует несколько из указанных вариантов, например, одновременно подходят и имя с маской, и регулярное выражение, будет выбран первый подходящий вариант в следующем порядке приоритета:

  1. точное имя
  2. самое длинное имя с маской в начале, например “ *.example.com ”
  3. самое длинное имя с маской в конце, например “ mail.* ”
  4. первое подходящее регулярное выражение (в порядке следования в конфигурационном файле)

Подробнее имена серверов обсуждаются в отдельном документе.

Синтаксис: server_name_in_redirect on | off ;
Умолчание:
Контекст: http , server , location

Разрешает или запрещает использовать в абсолютных перенаправлениях, выдаваемых nginx’ом, основное имя сервера, задаваемое директивой server_name. Если использование основного имени сервера запрещено, то используется имя, указанное в поле “Host” заголовка запроса. Если же этого поля нет, то используется IP-адрес сервера.

Использование в перенаправлениях порта управляется директивой port_in_redirect.

Синтаксис: server_names_hash_bucket_size размер ;
Умолчание:
Контекст: http

Задаёт размер корзины в хэш-таблицах имён серверов. Значение по умолчанию зависит от размера строки кэша процессора. Подробнее настройка хэш-таблиц обсуждается в отдельном документе.

Синтаксис: server_names_hash_max_size размер ;
Умолчание:
Контекст: http

Задаёт максимальный размер хэш-таблиц имён серверов. Подробнее настройка хэш-таблиц обсуждается в отдельном документе.

Синтаксис: server_tokens on | off | build | строка ;
Умолчание:
Контекст: http , server , location

Разрешает или запрещает выдавать версию nginx’а на страницах ошибок и в поле “Server” заголовка ответа.

Если указан параметр build (1.11.10), то наряду с версией nginx’а будет также выдаваться имя сборки.

Дополнительно, как часть коммерческой подписки, начиная с версии 1.9.13 подписи на страницах ошибок и значение поля “Server” заголовка ответа можно задать явно с помощью строки с переменными. Пустая строка запрещает выдачу поля “Server”.

Синтаксис: subrequest_output_buffer_size размер ;
Умолчание:
Контекст: http , server , location

Эта директива появилась в версии 1.13.10.

Задаёт размер буфера, используемого для хранения тела ответа подзапроса. По умолчанию размер одного буфера равен размеру страницы памяти. В зависимости от платформы это или 4K, или 8K, однако его можно сделать меньше.

Директива применима только для подзапросов, тело ответа которых сохраняется в памяти. Например, подобные подзапросы создаются при помощи SSI.

Синтаксис: tcp_nodelay on | off ;
Умолчание:
Контекст: http , server , location

Разрешает или запрещает использование параметра TCP_NODELAY . Параметр включается при переходе соединения в состояние keep-alive. Также, он включается на SSL-соединениях, при небуферизованном проксировании и при проксировании WebSocket.

Синтаксис: tcp_nopush on | off ;
Умолчание:
Контекст: http , server , location

Разрешает или запрещает использование параметра сокета TCP_NOPUSH во FreeBSD или TCP_CORK в Linux. Параметр включаются только при использовании sendfile. Включение параметра позволяет

  • передавать заголовок ответа и начало файла в одном пакете в Linux и во FreeBSD 4.*;
  • передавать файл полными пакетами.
Синтаксис: try_files файл . uri ;
try_files файл . = код ;
Умолчание:
Контекст: server , location

Проверяет существование файлов в заданном порядке и использует для обработки запроса первый найденный файл, причём обработка делается в контексте этого же location’а. Путь к файлу строится из параметра файл в соответствии с директивами root и alias. С помощью слэша в конце имени можно проверить существование каталога, например, “ $uri/ ”. В случае, если ни один файл не найден, то делается внутреннее перенаправление на uri , заданный последним параметром. Например:

Последний параметр может также указывать на именованный location, как в примерах ниже. С версии 0.7.51 последний параметр может также быть кодом :

Пример использования при проксировании Mongrel:

Пример использования вместе с Drupal/FastCGI:

В следующем примере директива try_files

try_files проверяет существование PHP-файла, прежде чем передать запрос FastCGI-серверу.

Пример использования вместе с WordPress и Joomla:

Синтаксис: types < . >
Умолчание:
Контекст: http , server , location

Задаёт соответствие расширений имён файлов и MIME-типов ответов. Расширения нечувствительны к регистру символов. Одному MIME-типу может соответствовать несколько расширений, например:

Достаточно полная таблица соответствий входит в дистрибутив nginx и находится в файле conf/mime.types .

Для того чтобы для определённого location’а для всех ответов выдавался MIME-тип “ application/octet-stream ”, можно использовать следующее:

Синтаксис: types_hash_bucket_size размер ;
Умолчание:
Контекст: http , server , location

Задаёт размер корзины в хэш-таблицах типов. Подробнее настройка хэш-таблиц обсуждается в отдельном документе.

До версии 1.5.13 значение по умолчанию зависело от размера строки кэша процессора.

Синтаксис: types_hash_max_size размер ;
Умолчание:
Контекст: http , server , location

Задаёт максимальный размер хэш-таблиц типов. Подробнее настройка хэш-таблиц обсуждается в отдельном документе.

Синтаксис: underscores_in_headers on | off ;
Умолчание:
Контекст: http , server

Разрешает или запрещает использование символов подчёркивания в полях заголовка запроса клиента. Если использование символов подчёркивания запрещено, поля заголовка запроса, в именах которых есть подчёркивания, помечаются как недопустимые и подпадают под действие директивы ignore_invalid_headers.

Если директива указана на уровне server, то может использоваться значение из сервера по умолчанию. Подробнее см. в разделе “Выбор виртуального сервера”.

Синтаксис: variables_hash_bucket_size размер ;
Умолчание:
Контекст: http

Задаёт размер корзины в хэш-таблице переменных. Подробнее настройка хэш-таблиц обсуждается в отдельном документе.

Синтаксис: variables_hash_max_size размер ;
Умолчание:
Контекст: http

Задаёт максимальный размер хэш-таблицы переменных. Подробнее настройка хэш-таблиц обсуждается в отдельном документе.

До версии 1.5.13 по умолчанию использовалось значение 512.

Встроенные переменные

Модуль ngx_http_core_module поддерживает встроенные переменные, имена которых совпадают с именами переменных веб-сервера Apache. Прежде всего, это переменные, представляющие из себя поля заголовка запроса клиента, такие как $http_user_agent , $http_cookie и тому подобное. Кроме того, есть и другие переменные:

$arg_ имя аргумент имя в строке запроса $args аргументы в строке запроса $binary_remote_addr адрес клиента в бинарном виде, длина значения всегда 4 байта для IPv4-адресов или 16 байт для IPv6-адресов $body_bytes_sent число байт, переданное клиенту, без учёта заголовка ответа; переменная совместима с параметром “ %B ” модуля Apache mod_log_config $bytes_sent число байт, переданных клиенту (1.3.8, 1.2.5) $connection порядковый номер соединения (1.3.8, 1.2.5) $connection_requests текущее число запросов в соединении (1.3.8, 1.2.5) $connection_time время соединения в секундах с точностью до миллисекунд (1.19.10) $content_length поле “Content-Length” заголовка запроса $content_type поле “Content-Type” заголовка запроса $cookie_ имя cookie имя $document_root значение директивы root или alias для текущего запроса $document_uri то же, что и $uri $host в порядке приоритета: имя хоста из строки запроса, или имя хоста из поля “Host” заголовка запроса, или имя сервера, соответствующего запросу $hostname имя хоста $http_ имя произвольное поле заголовка запроса; последняя часть имени переменной соответствует имени поля, приведённому к нижнему регистру, с заменой символов тире на символы подчёркивания $https “ on ” если соединение работает в режиме SSL, либо пустая строка $is_args “ ? ”, если в строке запроса есть аргументы, и пустая строка, если их нет $limit_rate установка этой переменной позволяет ограничивать скорость передачи ответа, см. limit_rate $msec текущее время в секундах с точностью до миллисекунд (1.3.9, 1.2.6) $nginx_version версия nginx $pid номер (PID) рабочего процесса $pipe “ p ” если запрос был pipelined, иначе “ . ” (1.3.12, 1.2.7) $proxy_protocol_addr адрес клиента, полученный из заголовка протокола PROXY (1.5.12)

Протокол 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.

$proxy_protocol_tlv_ имя TLV, полученный из заголовка протокола PROXY (1.23.2). Имя может быть именем типа TLV или его числовым значением. В последнем случае значение задаётся в шестнадцатеричном виде и должно начинаться с 0x :

Поддерживаются следующие имена типов TLV:

  • alpn ( 0x01 ) — протокол более высокого уровня, используемый поверх соединения
  • authority ( 0x02 ) — значение имени хоста, передаваемое клиентом
  • unique_id ( 0x05 ) — уникальный идентификатор соединения
  • netns ( 0x30 ) — имя пространства имён
  • ssl ( 0x20 ) — структура SSL TLV в бинарном виде

Поддерживаются следующие имена типов SSL TLV:

  • ssl_version ( 0x21 ) — версия SSL, используемая в клиентском соединении
  • ssl_cn ( 0x22 ) — Common Name сертификата
  • ssl_cipher ( 0x23 ) — имя используемого шифра
  • ssl_sig_alg ( 0x24 ) — алгоритм, используемый для подписи сертификата
  • ssl_key_alg ( 0x25 ) — алгоритм публичного ключа

Также поддерживается следующее специальное имя типа SSL TLV:

  • ssl_verify — результат проверки клиентского сертификата: 0 , если клиент предоставил сертификат и он был успешно верифицирован, либо ненулевое значение

Протокол PROXY должен быть предварительно включён при помощи установки параметра proxy_protocol в директиве listen.

$query_string то же, что и $args $realpath_root абсолютный путь, соответствующий значению директивы root или alias для текущего запроса, в котором все символические ссылки преобразованы в реальные пути $remote_addr адрес клиента $remote_port порт клиента $remote_user имя пользователя, использованное в Basic аутентификации $request первоначальная строка запроса целиком $request_body тело запроса

Значение переменной появляется в 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 соответственно.

$request_completion “ OK ” если запрос завершился, либо пустая строка $request_filename путь к файлу для текущего запроса, формируемый из директив root или alias и URI запроса $request_id уникальный идентификатор запроса, сформированный из 16 случайных байт, в шестнадцатеричном виде (1.11.0) $request_length длина запроса (включая строку запроса, заголовок и тело запроса) (1.3.12, 1.2.7) $request_method метод запроса, обычно “ GET ” или “ POST ” $request_time время обработки запроса в секундах с точностью до миллисекунд (1.3.9, 1.2.6); время, прошедшее с момента чтения первых байт от клиента $request_uri первоначальный URI запроса целиком (с аргументами) $scheme схема запроса, “ http ” или “ https ” $sent_http_ имя произвольное поле заголовка ответа; последняя часть имени переменной соответствует имени поля, приведённому к нижнему регистру, с заменой символов тире на символы подчёркивания $sent_trailer_ имя произвольное поле, отправленное в конце ответа (1.13.2); последняя часть имени переменной соответствует имени поля, приведённому к нижнему регистру, с заменой символов тире на символы подчёркивания $server_addr адрес сервера, принявшего запрос

Получение значения этой переменной обычно требует одного системного вызова. Чтобы избежать системного вызова, в директивах listen следует указывать адреса и использовать параметр bind .

$server_name имя сервера, принявшего запрос $server_port порт сервера, принявшего запрос $server_protocol протокол запроса, обычно “ HTTP/1.0 ”, “ HTTP/1.1 ” или “HTTP/2.0” $status статус ответа (1.3.2, 1.2.2) $time_iso8601 локальное время в формате по стандарту ISO 8601 (1.3.12, 1.2.7) $time_local локальное время в Common Log Format (1.3.12, 1.2.7) $tcpinfo_rtt , $tcpinfo_rttvar , $tcpinfo_snd_cwnd , $tcpinfo_rcv_space информация о клиентском TCP-соединении; доступна на системах, поддерживающих параметр сокета TCP_INFO $uri текущий URI запроса в нормализованном виде

Значение $uri может изменяться в процессе обработки запроса, например, при внутренних перенаправлениях или при использовании индексных файлов.

Источник

Permalink

Cannot retrieve contributors at this time


This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters

Show hidden characters

<!DOCTYPE html>
<html>
<head>
<title>Error</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>An error occurred.</h1>
<p>Sorry, the page you are looking for is currently unavailable.<br/>
Please try again later.</p>
<p>If you are the system administrator of this resource then you should check
the error log for details.</p>
<p><em>Faithfully yours, nginx.</em></p>
</body>
</html>

7 июня, 2022 12:03 пп
373 views
| Комментариев нет

LEMP Stack, Ubuntu

Nginx – это высокопроизводительный веб-сервер, способный гибко и качественно обслуживать контент. Оформляя страницы своего сайта, вы наверняка захотите создать пользовательский стиль для каждого его элемента, включая и страницы об ошибках, которые появляются, если контент недоступен. В этом руководстве мы покажем, как настроить такие страницы на Nginx.

Требования

  • Виртуальный сервер с пользователем sudo (мы используем сервер Ubuntu 22.04, настроенный по этому мануалу).
  • Предварительно установленный веб-сервер Nginx (инструкции по установке вы найдете здесь).

Создание пользовательской страницы об ошибке

Пользовательские страницы ошибок, которые мы используем здесь, предназначены для демонстрационных целей. Если у вас есть свои страницы, используйте их.

Поместите пользовательские страницы ошибок в каталог /usr/share/nginx/html, корневой каталог Nginx по умолчанию. Там мы создадим страницу для ошибки 404 под названием custom_404.html и для общих ошибок уровня 500 под названием custom_50x.html.

Примечание: Дальнейшие строки можно использовать, если вы тренируетесь на наших страницах. В противном случае не забудьте указать свои данные.

Сначала создайте HTML-файл для своей пользовательской страницы 404 с помощью nano или другого текстового редактора:

sudo nano /usr/share/nginx/html/custom_404.html

Вставьте туда код, который определяет пользовательскую страницу:

<h1 style='color:red'>Error 404: Not found :-(</h1>
<p>I have no idea where that file is, sorry. Are you sure you typed in the correct URL?</p>

Сохраните и закройте файл.

Теперь создайте файл HTML для страницы 500:

sudo nano /usr/share/nginx/html/custom_50x.html

Вставьте в файл следующее:

<h1>Oops! Something went wrong...</h1>
<p>We seem to be having some technical difficulties. Hang tight.</p>

Сохраните и закройте файл.

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

Настройка Nginx для поддержки пользовательских страниц

Итак, пора сообщить Nginx, что он должен использовать эти страницы всякий раз, когда возникают соответствующие ошибки. Откройте тот файл server-блока в каталоге /etc/nginx/sites-enabled, который вы хотите настроить. Здесь мы используем стандартный файл по имени default. Если вы настраиваете свои собственные страницы, пожалуйста, убедитесь, что используете правильный файл:

sudo nano /etc/nginx/sites-enabled/default

Теперь нужно направить Nginx на соответствующие страницы.

Настройка пользовательской страницы 404

Используйте директиву error_page, чтобы при возникновении ошибки 404 (когда запрошенный файл не найден) обслуживалась созданная вами пользовательская страница. Создайте location-блок для вашего файла, где вы сможете установить его правильное расположение в файловой системе и указать, что файл доступен только через внутренние перенаправления Nginx (не запрашиваемые клиентами напрямую):

server {
    listen 80 default_server;



    . . .

    error_page 404 /custom_404.html;
    location = /custom_404.html {
        root /usr/share/nginx/html;
        internal;
    }
}

Обычно устанавливать root в новом блоке location не нужно, так как он совпадает с root в блоке server. Однако здесь мы явно указываем, что страницы ошибок нужно обслуживать, даже если вы перемещаете свой обычный веб-контент и связанный с ним root в другое место.

Настройка страницы ошибок 50х

Затем добавьте новые директивы, чтобы Nginx, столкнувшись с ошибками уровня 500 (это проблемы, связанные с сервером), мог обслуживать другую пользовательскую страницу, которую вы создали. Здесь мы будем следовать той же формуле, которую вы использовали в предыдущем разделе. На этот раз мы насторим несколько ошибок уровня 500, чтобы все они использовали страницу custom_50x.html.

Внизу мы также добавим фиктивный FastCGI, чтобы вы могли протестировать свою страницу с ошибкой уровня 500. Это выдаст ошибку, потому что бэкэнд на самом деле не существует. Так вы можете убедиться, что ошибки уровня 500 обслуживают вашу пользовательскую страницу.

Отредактируйте файл /etc/nginx/sites-enabled/default следующим образом:

server {
    listen 80 default_server;


    . . .

    error_page 404 /custom_404.html;
    location = /custom_404.html {
        root /usr/share/nginx/html;
        internal;
    }

    error_page 500 502 503 504 /custom_50x.html;
    location = /custom_50x.html {
        root /usr/share/nginx/html;
        internal;
    }

    location /testing {
        fastcgi_pass unix:/does/not/exist;
    }
}

Сохраните и закройте файл, когда закончите.

Перезапуск Nginx и тестирование

Чтобы проверить синтаксис ваших файлов, введите:

sudo nginx -t

Если команда обнаружила какие-либо ошибки, исправьте их, прежде чем продолжить. Перезапустите Nginx, если ошибок нет:

sudo systemctl restart nginx

Теперь, если вы перейдете на домен или IP-адрес вашего сервера и запросите несуществующий файл, вы должны увидеть настроенную вами страницу 404:

http://server_domain_or_IP/thiswillerror

Перейдите в расположение вашего FastCGI и вы получите ошибку 502 Bad Gateway, что является ошибкой уровня 50х:

http://server_domain_or_IP/testing

Вернитесь в конфигурационный файл и удалите фиктивный FastCGI.

Заключение

Теперь ваш веб-сервер может обслуживать пользовательские страницы ошибок. Это простой способ персонализировать ваш сайт и обеспечить лучший пользовательский опыт даже при возникновении ошибок. Один из способов оптимизировать эти страницы – разместить на них дополнительную информацию или полезные ссылки для пользователей. Если вы сделаете это, убедитесь, что ссылки доступны даже при возникновении соответствующих ошибок.

Tags: NGINX, Ubuntu 22.04

I am build nginx with CRA as frontend and also have own backend api
I have problem in redirecting to 50x.html when the backend return 50x

I have follow the solution in
nginx is not showing custom 50x error page with php-fpm
and

nginx custom error page 502 with css and image files

My Dockerfile was as below:

FROM node:18-bullseye-slim as react_build 
#also say 
WORKDIR /app
#copy the react app to the container
#
COPY package*.json ./ 
#COPY . /app/ 
COPY . .

# #prepare the contiainer for building react 
RUN npm install --silent
RUN npm install react-scripts@5.0.1 -g --silent 
RUN npm run build 

#prepare nginx
FROM nginx:1.16.0-alpine

COPY --from=react_build /app/build /usr/share/nginx/html
RUN rm /etc/nginx/conf.d/default.conf
COPY nginx/nginx.conf /etc/nginx/conf.d
COPY nginx/50x.html /usr/share/nginx/html

#fire up nginx
EXPOSE 80 
CMD ["nginx","-g","daemon off;"]

and my nginx.conf was located in nginx folder in the root of the CRA, it was as shown in below:

    server {

  listen 80;
  


  error_page   500 502 503 504  /50x.html;
  location = /50x.html {
    root    /usr/share/nginx/html;
    try_files $uri $uri/ /50x.html = 500 502 503; 
  }
  location / {
    root   /usr/share/nginx/html;
    index  index.html index.htm;
    try_files $uri $uri/ /index.html; 
  }

}

my frontend return this:

{
"message": "Request failed with status code 500",
"name": "AxiosError",
"stack": "AxiosError: Request failed with status code 500n    at http://localhost:3001/static/js/main.ae2e2cbe.js:2:430462n    at XMLHttpRequest.d (http://localhost:3001/static/js/main.ae2e2cbe.js:2:430610)",
"config": {
    "transitional": {
        "silentJSONParsing": true,
        "forcedJSONParsing": true,
        "clarifyTimeoutError": false
    },
    "transformRequest": [
        null
    ],
    "transformResponse": [
        null
    ],
    "timeout": 0,
    "xsrfCookieName": "XSRF-TOKEN",
    "xsrfHeaderName": "X-XSRF-TOKEN",
    "maxContentLength": -1,
    "maxBodyLength": -1,
    "env": {},
    "headers": {
        "Accept": "application/json, text/plain, */*",
        "Authorization": "ApiKey V**********************==",
        "apikey": "V************************==",
        "apikey_id": "Tx5dBYUBFwx4oQ2b15KP"
    },
    "params": {
        "path": "/test/test",
        "size": 10,
        "order": "desc"
    },
    "method": "get",
    "url": "http://192.168.13.251:8000/device/"
},
"code": "ERR_BAD_RESPONSE",
"status": 500

}

and i have try:

    server {
  listen 80;

  location / {
    rewrite ^/viewer(/.*)$ $1 break;
    root   /usr/share/nginx/html;
    index  index.html index.htm;
    try_files $uri $uri/ /index.html;
  }
  error_page   500 502 503 504  /50x.html;
  location = /50x.html {
    root   /usr/share/nginx/html;
  }
}

without success, i would appreciate if someone can help,thanks
Jeff

It is always better to show the helpful information to the users instead of the default raw message. In this guide, we’ll demonstrate how to configure Nginx to use custom error pages.

Let’s create a directory called errors in the root folder. Inside error folder, create a file called error_404.html for 404 error messages and create a file called error_50x.htlm for 500-level error messages.

error_404.html

    
        
            Page Not Found
        
        

Page Not Found

We're very sorry to inform you that the page you are looking for could not be found, please accept our apologies, and follow one of the following options
  1. Contact the webmaster and send him the link of the page you were trying to reach, and the page where it is published
  2. Go to our Homepage, and use our search box, to find what you were looking for.

error_50x.html

    
    
        Oops! Something went wrong...
    
    

Oops! Something went wrong...

Contact the webmaster and send him the link of the page you were trying to reach, and the page where it is published

Now open your nginx config file, generally, it will be located at /etc/nginx/sites-available/

Open config file with vi editor (you can use other editor also)

$ vi /etc/nginx/sites-available/default

We use error_page directive to serve custom pages which you have created, as shown below we will use error_page directive with location block.We will create a location block for the file, where we are able to ensure that the root matches our file system location and that the file is only accessible through internal Nginx redirects, not requestable directly by clients/visitors

Add this to consutome 404 error page –

        error_page 404 /custom_404.html;
        location = /custom_404.html {
                root /usr/share/nginx/html;
                internal;
        }

Add this to serve custom 50x-level error page –

        error_page 500 502 503 504 /custom_50x.html;
        location = /custom_50x.html {
                root /usr/share/nginx/html;
                internal;
        }

Here is the complete config file (/etc/nginx/sites-available/).

server {
        listen 80 default_server;
        listen [::]:80 default_server;

        root /var/www/html;

        # Add index.php to the list if you are using PHP
        index index.html index.htm index.nginx-debian.html;

        server_name _;

        error_page 404 /custom_404.html;
        location = /custom_404.html {
                root /usr/share/nginx/html;
                internal;
        }

        error_page 500 502 503 504 /custom_50x.html;
        location = /custom_50x.html {
                root /usr/share/nginx/html;
                internal;
        }       

        location / {
                # First attempt to serve request as file, then
                # as directory, then fall back to displaying a 404.
                try_files $uri $uri/ /index.html =404;
        }

}

I hope you like this Post, Please feel free to comment below, your suggestion and problems if you face — we are here to solve your problems.

Понравилась статья? Поделить с друзьями:
  • Error 507 furud crossout
  • Error 507 app inventor
  • Error 5055 sans
  • Error 50503 unsupported modem fw
  • Error 505 что это значит