Nginx обработка ошибок 404

Здравствуйте, проблема такая: при вызове несуществующей страницы например mysite.ru/wrongpage
почемуто открывается главная страница.
конфиги такие:

server{
    listen 80;
    server_name www.mysite.ru;
    rewrite ^ http://mysite.ru$request_uri? permanent; #301 redirect
}
server {
    listen 80;
    server_name mysite.ru;
    root /home/user/mysite;

    location / {
        index index.htm index.html index.php;
        try_files $uri /index.html;
        error_page 404             /404.html;
        error_page 500 502 503 504 /50x.html;
    }

    location = /index.html {
       if ($request_uri = /index.html) {
           rewrite ^ http://mysite.ru? permanent;#301 redirect
       }
    }

    error_log /var/log/nginx/mysite.error.log;
    access_log /var/log/nginx/mysite.access.log;
}

Подскажите, пожалуйста, как исправить.


  • Вопрос задан

    более трёх лет назад

  • 7756 просмотров

С какой целью у вас в try_Files указан /index.html?
try_files $uri /index.html;
Пробует найти $uri и если не находит перебрасывает на /index.html.
Это синтаксис try_Files:

try_files file … uri;

Последний аргумент — это URL или named location в случае, если ни один из предыдущих путей не был найден.
В вашем случае, должно быть тогда:
try_files $uri /404.html
Насколько я понимаю начиная с какой-то версии nginx поддерживает следующий синтаксис:
try_files $uri =404
Тогда в случае если ни один из аргументов не был найден генерируется HTTP код 404 и далее обработка идет по соотвествующей error_page.

Пригласить эксперта

error_page 400 404 /404.html;
location = /404.html {
root /home/address
}
ну у меня так.
вне этого:
location / {


  • Показать ещё
    Загружается…

Сбер

Нижний Новгород

от 170 500 ₽

22 июн. 2023, в 00:59

8000 руб./за проект

22 июн. 2023, в 00:56

8000 руб./за проект

22 июн. 2023, в 00:39

12000 руб./за проект

Минуточку внимания

Директивы

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

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

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

См. также директивы server_name_in_redirect
и port_in_redirect.

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

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

Разрешает или запрещает использование файлового асинхронного ввода-вывода (AIO)
во FreeBSD и Linux:

location /video/ {
    aio            on;
    output_buffers 1 64k;
}

Во FreeBSD AIO можно использовать, начиная с FreeBSD 4.3.
До FreeBSD 11.0
AIO можно либо собрать в ядре статически:

options VFS_AIO

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

kldload aio

В Linux AIO можно использовать только начиная с версии ядра 2.6.22.
Кроме того, необходимо также дополнительно включить
directio,
иначе чтение будет блокирующимся:

location /video/ {
    aio            on;
    directio       512;
    output_buffers 1 128k;
}

В Linux
directio
можно использовать только для чтения блоков, выравненных
на границу 512 байт (или 4К для XFS).
Невыравненный конец файла будет читаться блокированно.
То же относится к запросам с указанием диапазона запрашиваемых байт
(byte-range requests) и к запросам FLV не с начала файла: чтение
невыравненных начала и конца ответа будет блокирующимся.

При одновременном включении AIO и sendfile в Linux
для файлов, размер которых больше либо равен указанному
в директиве directio, будет использоваться AIO,
а для файлов меньшего размера
или при выключенном directio — sendfile:

location /video/ {
    sendfile       on;
    aio            on;
    directio       8m;
}

Кроме того, читать и отправлять
файлы можно в многопоточном режиме (1.7.11),
не блокируя при этом рабочий процесс:

location /video/ {
    sendfile       on;
    aio            threads;
}

Операции чтения или отправки файлов будут обрабатываться потоками из указанного
пула.
Если пул потоков не задан явно,
используется пул с именем “default”.
Имя пула может быть задано при помощи переменных:

aio threads=pool$disk;

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

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

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

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

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

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

Контекст: location

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

location /i/ {
    alias /data/w3/images/;
}

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

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

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

location ~ ^/users/(.+.(?:gif|jpe?g|png))$ {
    alias /data/w3/images/$1;
}

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

location /images/ {
    alias /data/w3/images/;
}

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

location /images/ {
    root /data/w3;
}
Синтаксис: auth_delay время;
Умолчание:
auth_delay 0s;
Контекст: http, server, location

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

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

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

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

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

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

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

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

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

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

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

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

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

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

client_body_temp_path /spool/nginx/client_temp 1 2;

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

/spool/nginx/client_temp/7/45/00000123457
Синтаксис: client_body_timeout время;
Умолчание:
client_body_timeout 60s;
Контекст: http, server, location

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

directio 4m;

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

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

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

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

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

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

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

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

Пример:

disable_symlinks on from=$document_root;

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

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

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

Модули
ngx_http_autoindex_module,
ngx_http_random_index_module
и ngx_http_dav_module
в настоящий момент игнорируют эту директиву.

Синтаксис: error_page
код ...
[=[ответ]]
uri;
Умолчание:

Контекст: http, server, location, if в location

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

Пример:

error_page 404             /404.html;
error_page 500 502 503 504 /50x.html;

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

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

error_page 404 =200 /empty.gif;

Если ошибочный ответ обрабатывается проксированным сервером или
FastCGI/uwsgi/SCGI/gRPC-сервером,
и этот сервер может вернуть разные коды ответов,
например, 200, 302, 401 или 404, то можно выдавать возвращаемый им код:

error_page 404 = /404.php;

Если при внутреннем перенаправлении не нужно менять URI и метод,
то можно передать обработку ошибки в именованный location:

location / {
    error_page 404 = @fallback;
}

location @fallback {
    proxy_pass http://backend;
}

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

Также существует возможность использовать перенаправления URL для обработки
ошибок:

error_page 403      http://example.com/forbidden.html;
error_page 404 =301 http://example.com/notfound.html;

В этом случае по умолчанию клиенту возвращается код ответа 302.
Его можно изменить только на один из кодов ответа, относящихся к
перенаправлениям (301, 302, 303, 307 и 308).

До версий 1.1.16 и 1.0.13 код 307 не обрабатывался как перенаправление.

До версии 1.13.0 код 308 не обрабатывался как перенаправление.

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

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

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

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

Синтаксис: http { ... }
Умолчание:

Контекст: main

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

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

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

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

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

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

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

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

Контекст: location

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

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

  • запросы, изменённые директивой
    rewrite.

Пример:

error_page 404 /404.html;

location = /404.html {
    internal;
}

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

Синтаксис: keepalive_disable none | браузер ...;
Умолчание:
keepalive_disable msie6;
Контекст: 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 число;
Умолчание:
keepalive_requests 1000;
Контекст: http, server, location

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

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

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

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

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

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

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

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

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

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

Синтаксис: large_client_header_buffers число размер;
Умолчание:
large_client_header_buffers 4 8k;
Контекст: 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):

limit_except GET {
    allow 192.168.1.0/32;
    deny  all;
}

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

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

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

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

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

map $slow $rate {
    1     4k;
    2     8k;
}

limit_rate $rate;

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

server {

    if ($slow) {
        set $limit_rate 4k;
    }

    ...
}

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

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

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

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

Пример:

location /flv/ {
    flv;
    limit_rate_after 500k;
    limit_rate       50k;
}
Синтаксис: lingering_close
off |
on |
always;
Умолчание:
lingering_close on;
Контекст: http, server, location

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

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

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

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

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

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

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

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

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

Если действует lingering_close, эта директива задаёт
максимальное время ожидания поступления дополнительных данных от клиента.
Если в течение этого времени данные не были получены, соединение закрывается.
В противном случае данные читаются и игнорируются, и nginx снова
ждёт поступления данных.
Цикл “ждать-читать-игнорировать” повторяется, но не дольше чем задано
директивой lingering_time.

Синтаксис: listen
адрес[:порт]
[default_server]
[ssl]
[http2 |
quic]
[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 |
quic]
[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 |
quic]
[proxy_protocol]
[backlog=число]
[rcvbuf=размер]
[sndbuf=размер]
[accept_filter=фильтр]
[deferred]
[bind]
[so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]];
Умолчание:
listen *:80 | *:8000;
Контекст: server

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

listen 127.0.0.1:8000;
listen 127.0.0.1;
listen 8000;
listen *:8000;
listen localhost:8000;

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

listen [::]:8000;
listen [::1];

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

listen unix:/var/run/nginx.sock;

Если указан только адрес, то используется порт 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.

Параметр устарел, вместо него следует использовать
директиву http2.

Параметр quic (1.25.0) позволяет принимать на этом порту
QUIC-соединения.

Параметр 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-пакета с данными.

backlog=число
задаёт параметр backlog в вызове
listen(), который ограничивает
максимальный размер очереди ожидающих приёма соединений.
По умолчанию backlog устанавливается равным -1 для
FreeBSD, DragonFly BSD и macOS, и 511 для других платформ.
rcvbuf=размер
задаёт размер буфера приёма
(параметр SO_RCVBUF) для слушающего сокета.
sndbuf=размер
задаёт размер буфера передачи
(параметр SO_SNDBUF) для слушающего сокета.
accept_filter=фильтр
задаёт название accept-фильтра
(параметр SO_ACCEPTFILTER) для слушающего сокета,
который включается для фильтрации входящих соединений
перед передачей их в accept().
Работает только на FreeBSD и NetBSD 5.0+.
Можно использовать два фильтра:
dataready
и
httpready.
deferred
указывает использовать отложенный accept()
(параметр TCP_DEFER_ACCEPT сокета) на Linux.
bind
указывает, что для данной пары
адрес:порт нужно делать
bind() отдельно.
Это нужно потому, что если описаны несколько директив listen
с одинаковым портом, но разными адресами, и одна из директив
listen слушает на всех адресах для данного порта
(*:порт), то nginx сделает
bind() только на *:порт.
Необходимо заметить, что в этом случае для определения адреса, на который
пришло соединение, делается системный вызов getsockname().
Если же используются параметры setfib,
fastopen,
backlog, rcvbuf,
sndbuf, accept_filter,
deferred, ipv6only,
reuseport
или so_keepalive,
то для данной пары
адрес:порт всегда делается
отдельный вызов bind().
ipv6only=on|off
этот параметр (0.7.42) определяет
(через параметр сокета IPV6_V6ONLY),
будет ли слушающий на wildcard-адресе [::] IPv6-сокет
принимать только IPv6-соединения, или же одновременно IPv6- и IPv4-соединения.
По умолчанию параметр включён.
Установить его можно только один раз на старте.

До версии 1.3.4,
если этот параметр не был задан явно, то для сокета действовали
настройки операционной системы.

reuseport
этот параметр (1.9.1) указывает, что нужно создавать отдельный слушающий сокет
для каждого рабочего процесса
(через параметр сокета
SO_REUSEPORT для Linux 3.9+ и DragonFly BSD
или SO_REUSEPORT_LB для FreeBSD 12+), позволяя ядру
распределять входящие соединения между рабочими процессами.
В настоящий момент это работает только на Linux 3.9+, DragonFly BSD
и FreeBSD 12+ (1.15.1).

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

so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]
этот параметр (1.1.11) конфигурирует для слушающего сокета
поведение “TCP keepalive”.
Если этот параметр опущен, то для сокета будут действовать
настройки операционной системы.
Если он установлен в значение “on”, то для сокета
включается параметр SO_KEEPALIVE.
Если он установлен в значение “off”, то для сокета
параметр SO_KEEPALIVE выключается.
Некоторые операционные системы поддерживают настройку параметров
“TCP keepalive” на уровне сокета посредством параметров
TCP_KEEPIDLE, TCP_KEEPINTVL и
TCP_KEEPCNT.
На таких системах (в настоящий момент это Linux 2.4+, NetBSD 5+ и
FreeBSD 9.0-STABLE)
их можно сконфигурировать с помощью параметров keepidle,
keepintvl и keepcnt.
Один или два параметра могут быть опущены, в таком случае для
соответствующего параметра сокета будут действовать стандартные
системные настройки.
Например,

so_keepalive=30m::10

установит таймаут бездействия (TCP_KEEPIDLE) в 30 минут,
для интервала проб (TCP_KEEPINTVL) будет действовать
стандартная системная настройка, а счётчик проб (TCP_KEEPCNT)
будет равен 10.

Пример:

listen 127.0.0.1 default_server accept_filter=dataready backlog=1024;
Синтаксис: 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’ом без модификаторов “=” и “^~”,
то поиск тоже сразу же прекращается и регулярные выражения также
не проверяются.

Проиллюстрируем вышесказанное примером:

location = / {
    [ конфигурация А ]
}

location / {
    [ конфигурация Б ]
}

location /documents/ {
    [ конфигурация В ]
}

location ^~ /images/ {
    [ конфигурация Г ]
}

location ~* .(gif|jpg|jpeg)$ {
    [ конфигурация Д ]
}

Для запроса “/” будет выбрана конфигурация А,
для запроса “/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, например:

location /user/ {
    proxy_pass http://user.example.com;
}

location = /user {
    proxy_pass http://login.example.com;
}
Синтаксис: log_not_found on | off;
Умолчание:
log_not_found on;
Контекст: http, server, location

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

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

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

Синтаксис: max_ranges число;
Умолчание:

Контекст: http, server, location

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

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

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

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

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

location /scripts/ {
    ...
}

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

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

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

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

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

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

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

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

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

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

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

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

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

Пример:

open_file_cache          max=1000 inactive=20s;
open_file_cache_valid    30s;
open_file_cache_min_uses 2;
open_file_cache_errors   on;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Синтаксис: read_ahead размер;
Умолчание:
read_ahead 0;
Контекст: 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;
Умолчание:
recursive_error_pages off;
Контекст: http, server, location

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

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

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

Синтаксис: reset_timedout_connection on | off;
Умолчание:
reset_timedout_connection 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, используемые для преобразования имён вышестоящих серверов
в адреса, например:

resolver 127.0.0.1 [::1]:5353;

Адрес может быть указан в виде доменного имени или 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 позволяет это
переопределить:

resolver 127.0.0.1 [::1]:5353 valid=30s;

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

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

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

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

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

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

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

location /i/ {
    root /data/w3;
}

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

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

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

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

Разрешает доступ, если все (all)
или хотя бы один (any) из модулей
ngx_http_access_module,
ngx_http_auth_basic_module,
ngx_http_auth_request_module
или
ngx_http_auth_jwt_module
разрешают доступ.

Пример:

location / {
    satisfy any;

    allow 192.168.1.0/32;
    deny  all;

    auth_basic           "closed site";
    auth_basic_user_file conf/htpasswd;
}
Синтаксис: send_lowat размер;
Умолчание:
send_lowat 0;
Контекст: http, server, location

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

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

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

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

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

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

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

location /video/ {
    sendfile       on;
    tcp_nopush     on;
    aio            on;
}

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

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

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

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

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

Синтаксис: server { ... }
Умолчание:

Контекст: http

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

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

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

server {
    server_name example.com www.example.com;
}

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

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

server {
    server_name example.com *.example.com www.example.*;
}

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

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

server {
    server_name .example.com;
}

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

server {
    server_name www.example.com ~^wwwd+.example.com$;
}

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

server {
    server_name ~^(www.)?(.+)$;

    location / {
        root /sites/$2;
    }
}

server {
    server_name _;

    location / {
        root /sites/default;
    }
}

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

server {
    server_name ~^(www.)?(?<domain>.+)$;

    location / {
        root /sites/$domain;
    }
}

server {
    server_name _;

    location / {
        root /sites/default;
    }
}

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

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

server {
    server_name www.example.com "";
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Синтаксис: tcp_nopush on | off;
Умолчание:
tcp_nopush 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 /images/ {
    try_files $uri /images/default.gif;
}

location = /images/default.gif {
    expires 30s;
}

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

location / {
    try_files $uri $uri/index.html $uri.html =404;
}

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

location / {
    try_files /system/maintenance.html
              $uri $uri/index.html $uri.html
              @mongrel;
}

location @mongrel {
    proxy_pass http://mongrel;
}

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

location / {
    try_files $uri $uri/ @drupal;
}

location ~ .php$ {
    try_files $uri @drupal;

    fastcgi_pass ...;

    fastcgi_param SCRIPT_FILENAME /path/to$fastcgi_script_name;
    fastcgi_param SCRIPT_NAME     $fastcgi_script_name;
    fastcgi_param QUERY_STRING    $args;

    ... прочие fastcgi_param
}

location @drupal {
    fastcgi_pass ...;

    fastcgi_param SCRIPT_FILENAME /path/to/index.php;
    fastcgi_param SCRIPT_NAME     /index.php;
    fastcgi_param QUERY_STRING    q=$uri&$args;

    ... прочие fastcgi_param
}

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

location / {
    try_files $uri $uri/ @drupal;
}

аналогична директивам

location / {
    error_page 404 = @drupal;
    log_not_found off;
}

А здесь

location ~ .php$ {
    try_files $uri @drupal;

    fastcgi_pass ...;

    fastcgi_param SCRIPT_FILENAME /path/to$fastcgi_script_name;

    ...
}

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

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

location / {
    try_files $uri $uri/ @wordpress;
}

location ~ .php$ {
    try_files $uri @wordpress;

    fastcgi_pass ...;

    fastcgi_param SCRIPT_FILENAME /path/to$fastcgi_script_name;
    ... прочие fastcgi_param
}

location @wordpress {
    fastcgi_pass ...;

    fastcgi_param SCRIPT_FILENAME /path/to/index.php;
    ... прочие fastcgi_param
}
Синтаксис: types { ... }
Умолчание:
types {
    text/html  html;
    image/gif  gif;
    image/jpeg jpg;
}
Контекст: http, server, location

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

types {
    application/octet-stream bin exe dll;
    application/octet-stream deb;
    application/octet-stream dmg;
}

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

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

location /download/ {
    types        { }
    default_type application/octet-stream;
}
Синтаксис: types_hash_bucket_size размер;
Умолчание:
types_hash_bucket_size 64;
Контекст: http, server, location

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

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

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

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

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

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

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

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

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

Синтаксис: variables_hash_max_size размер;
Умолчание:
variables_hash_max_size 1024;
Контекст: 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:

$proxy_protocol_tlv_alpn
$proxy_protocol_tlv_0x01

SSL TLV могут также быть доступны как по имени типа TLV,
так и по его числовому значению,
оба должны начинаться с ssl_:

$proxy_protocol_tlv_ssl_version
$proxy_protocol_tlv_ssl_0x21

Поддерживаются следующие имена типов 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”
или
“HTTP/3.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 может изменяться в процессе обработки запроса,
например, при внутренних перенаправлениях
или при использовании индексных файлов.

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

В этой статье рассмотрим, почему возникает ошибка «404 not found Nginx», а также способы её устранения и отладки.Мы не будем разбираться с ситуацией, когда файла действительно нет на сервере — это решение, не требующее пояснений. Мы рассмотрим проблему обработки location в Nginx.

Давайте сначала разберёмся, как обрабатываются URL в Nginx. Когда веб-сервер определил, к какому блоку server (сайту) нужно передать запрос пользователя, просматриваются все префиксные блоки location и выбирается тот, который подходит лучше всего. Например, рассмотрим стандартную конфигурацию для WordPress. Здесь префиксные location отмечены зелёным, а с регулярным выражением — оранжевым:

location / {
index index.html index.php;
}
location /favicon.ico {
access_log off;
}
location ~* .(gif|jpg|png)$ {
expires 30d;
}
location ~ .php$ {
fastcgi_pass localhost:9000;
fastcgi_param SCRIPT_FILENAME
$document_root$fastcgi_script_name;
include fastcgi_params;
}

Префиксные локейшены всегда начинаются с символа /. Регулярные же содержат символы регулярных выражений: ~ $ ^ * и так далее. Если пользователь запрашивает favicon.ico, то будет выбран второй location, так как он лучше всего соответствует запросу, при любом другом запросе будет выбран location /, так как он соответствует всем запросам, а других префиксных location у нас нет. Это просто, а дальше начинается магия. После того, как был найден нужный location, Nginx начинает проверять все регулярные выражения в порядке их следования в конфигурационном файле.

При первом же совпадении Nginx останавливает поиск и передаёт управление этому location. Или, если совпадений не было найдено, используется ранее обнаруженный префиксный location. Например, если запрос заканчивается на .php, то первый location будет проигнорирован, а управление передастся четвёртому (~ .php$)

Таким образом, любое неверно составленное регулярное выражение в любой части конфигурационного файла может полностью всё сломать. Поэтому разработчики рекомендуют по минимум использовать регулярные выражения. Что касается вложенных location, то обрабатываются они так же как и основные, только уже после передачи управления в нужный location. Путём чтения конфигурационного файла понять, какой location вызывает 404 сложно, поэтому, чтобы исправить ошибку, нам понадобиться режим отладки Nginx.

Как включить режим отладки Nginx?

Сначала нам необходимо установить версию Nginx с поддержкой отладки. Чтобы проверить, поддерживает ли ваша текущая версия этот режим, наберите:

nginx -V

В выводе должна быть строчка «—with-debug». Если её нет, значит отладка не поддерживается, и надо установить версию с поддержкой. В CentOS такой пакет называется nginx-debug. Для его установки наберите:

sudo yum install nginx-debug

Теперь появился ещё один исполняемый файл, и он собран уже с поддержкой отладки:

nginx-debug -V

Откройте конфигурационный файл вашего сайта или глобальный конфигурационный файл, если вы не задавали настройки логов отдельно для каждого сайта, и в конце стоки error_log замените error на debug:

error_log /var/log/nginx/domains/test.losst.pro.error.log debug

Останавливаем обычную версию и запускаем версию с отладкой:

systemctl stop nginx
systemctl start nginx-debug

Как исправить «404 Not Found Nginx»?

1. Регулярные выражения

Как я уже сказал выше, самой частой проблемой, которая вызывает 404, являются регулярные выражения. Смотрим, что происходит в лог файле:

tail -f /var/log/nginx/domains/test.losst.pro.error.log

Видим, что серверу пришёл запрос /vstats. Дальше он проверяет location: /, /robots.txt, /vatsts/, /site-control/. Здесь уже можем понять, в чём проблема — промазали на один слеш. Дальше проверяются все регулярные выражения, и, так как в них ничего найдено не было, выбирается location /.

Далее директива try_files пытается найти файл /vstats, не находит и ищет index.php, который, в свою очередь, возвращает 404.

Если мы наберём, то что ожидает видеть Nginx — /vstats/, то откроется наша страница статистики.

Если мы добавим к конфигурационному файлу ещё один location с регулярным выражением, например:

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

То абсолютно все запросы будут обрабатываться именно этим регулярным выражением и, естественно, что ничего работать не будет. Видим, что приходит запрос /vstats/:

Он совпадает с префиксным location, но потом Nginx видит наше регулярное выражение и передаёт управление ему.

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

2. Недостаточно памяти

Если php-скрипту не хватило оперативной памяти для выполнения, и его процесс был убит операционной системой, то Nginx тоже может вернуть ошибку 404. Такое поведение вы будете наблюдать, когда скрипт очень долго выполняется, а потом появляется «404 Not Found» или страница ошибки вашего движка. Обычно эта неисправность тоже видна в отладочном логе.

Решить такую проблему можно, освободив память на сервере, часто такое может возникать из-за утечек памяти в php, когда процессы php-fpm занимают почти всю память на сервере. Поэтому перезапуск php-fpm решает проблему:

systemctl restart php-fpm

Чтобы избежать этой проблемы в будущем, можно настроить автоматический перезапуск процессов после обработки определённого количества запросов. Например каждые 200 запросов:

vi /etc/php-fpm.d/www.conf

pm.max_requests = 200

3. Не найден index

Если вы запрашиваете URL вида /vstats/, но в настройках Nginx не указан файл index, который нужно использовать для этой ссылки, то у вас ничего не выйдет, и вы получите 404. Вы можете добавить директиву index в ваш location:

location / {
index index.php index.html index.htm;
}

Или сразу в server, в Nginx все location наследуют директивы, установленные в server.

4. Другие проблемы

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

Выводы

В этой статье мы рассмотрели основные причины, из-за которых может возникнуть ошибка 404 not found Nginx. Как видите, может быть много проблем, но всё достаточно просто решается. А с какими проблемами, вызывающими эту ошибку, вы сталкивались? Как их решали? Напишите в комментариях!

Обнаружили ошибку в тексте? Сообщите мне об этом. Выделите текст с ошибкой и нажмите Ctrl+Enter.

Creative Commons License

Статья распространяется под лицензией Creative Commons ShareAlike 4.0 при копировании материала ссылка на источник обязательна .

Configure NGINX and NGINX Plus as a web server, with support for virtual server multi-tenancy, URI and response rewriting, variables, and error handling.

This article explains how to configure NGINX Open Source and NGINX Plus as a web server, and includes the following sections:

  • Setting Up Virtual Servers
  • Configuring Locations
    • Location Priority
  • Using Variables
  • Returning Specific Status Codes
  • Rewriting URIs in Requests
  • Rewriting HTTP Responses
  • Handling Errors

For additional information on how to tune NGINX Plus and NGINX Open Source, watch our free webinar on-demand Installing and Tuning NGINX.

Note: The information in this article applies to both NGINX Open Source and NGINX Plus. For ease of reading, the remainder of the article refers to NGINX Plus only.

At a high level, configuring NGINX Plus as a web server is a matter of defining which URLs it handles and how it processes HTTP requests for resources at those URLs. At a lower level, the configuration defines a set of virtual servers that control the processing of requests for particular domains or IP addresses. For more information about configuration files, see Creating NGINX Plus Configuration Files.

Each virtual server for HTTP traffic defines special configuration instances called locations that control processing of specific sets of URIs. Each location defines its own scenario of what happens to requests that are mapped to this location. NGINX Plus provides full control over this process. Each location can proxy the request or return a file. In addition, the URI can be modified, so that the request is redirected to another location or virtual server. Also, a specific error code can be returned and you can configure a specific page to correspond to each error code.

Setting Up Virtual Servers

The NGINX Plus configuration file must include at least one server directive to define a virtual server. When NGINX Plus processes a request, it first selects the virtual server that will serve the request.

A virtual server is defined by a server directive in the http context, for example:

http {
    server {
        # Server configuration
    }
}

It is possible to add multiple server directives into the http context to define multiple virtual servers.

The server configuration block usually includes a listen directive to specify the IP address and port (or Unix domain socket and path) on which the server listens for requests. Both IPv4 and IPv6 addresses are accepted; enclose IPv6 addresses in square brackets.

The example below shows configuration of a server that listens on IP address 127.0.0.1 and port 8080:

server {
    listen 127.0.0.1:8080;
    # Additional server configuration
}

If a port is omitted, the standard port is used. Likewise, if an address is omitted, the server listens on all addresses. If the listen directive is not included at all, the “standard” port is 80/tcp and the “default” port is 8000/tcp, depending on superuser privileges.

If there are several servers that match the IP address and port of the request, NGINX Plus tests the request’s Host header field against the server_name directives in the server blocks. The parameter to server_name can be a full (exact) name, a wildcard, or a regular expression. A wildcard is a character string that includes the asterisk (*) at its beginning, end, or both; the asterisk matches any sequence of characters. NGINX Plus uses the Perl syntax for regular expressions; precede them with the tilde (~). This example illustrates an exact name.

server {
    listen      80;
    server_name example.org www.example.org;
    #...
}

If several names match the Host header, NGINX Plus selects one by searching for names in the following order and using the first match it finds:

  1. Exact name
  2. Longest wildcard starting with an asterisk, such as *.example.org
  3. Longest wildcard ending with an asterisk, such as mail.*
  4. First matching regular expression (in order of appearance in the configuration file)

If the Host header field does not match a server name, NGINX Plus routes the request to the default server for the port on which the request arrived. The default server is the first one listed in the nginx.conf file, unless you include the default_server parameter to the listen directive to explicitly designate a server as the default.

server {
    listen 80 default_server;
    #...
}

Configuring Locations

NGINX Plus can send traffic to different proxies or serve different files based on the request URIs. These blocks are defined using the location directive placed within a server directive.

For example, you can define three location blocks to instruct the virtual server to send some requests to one proxied server, send other requests to a different proxied server, and serve the rest of the requests by delivering files from the local file system.

NGINX Plus tests request URIs against the parameters of all location directives and applies the directives defined in the matching location. Inside each location block, it is usually possible (with a few exceptions) to place even more location directives to further refine the processing for specific groups of requests.

Note: In this guide, the word location refers to a single location context.

There are two types of parameter to the location directive: prefix strings (pathnames) and regular expressions. For a request URI to match a prefix string, it must start with the prefix string.

The following sample location with a pathname parameter matches request URIs that begin with /some/path/, such as /some/path/document.html. (It does not match /my-site/some/path because /some/path does not occur at the start of that URI.)

location /some/path/ {
    #...
}

A regular expression is preceded with the tilde (~) for case-sensitive matching, or the tilde-asterisk (~*) for case-insensitive matching. The following example matches URIs that include the string .html or .htm in any position.

location ~ .html? {
    #...
}

NGINX Location Priority

To find the location that best matches a URI, NGINX Plus first compares the URI to the locations with a prefix string. It then searches the locations with a regular expression.

Higher priority is given to regular expressions, unless the ^~ modifier is used. Among the prefix strings NGINX Plus selects the most specific one (that is, the longest and most complete string). The exact logic for selecting a location to process a request is given below:

  1. Test the URI against all prefix strings.
  2. The = (equals sign) modifier defines an exact match of the URI and a prefix string. If the exact match is found, the search stops.
  3. If the ^~ (caret-tilde) modifier prepends the longest matching prefix string, the regular expressions are not checked.
  4. Store the longest matching prefix string.
  5. Test the URI against regular expressions.
  6. Stop processing when the first matching regular expression is found and use the corresponding location.
  7. If no regular expression matches, use the location corresponding to the stored prefix string.

A typical use case for the = modifier is requests for / (forward slash). If requests for / are frequent, specifying = / as the parameter to the location directive speeds up processing, because the search for matches stops after the first comparison.

A location context can contain directives that define how to resolve a request – either serve a static file or pass the request to a proxied server. In the following example, requests that match the first location context are served files from the /data directory and the requests that match the second are passed to the proxied server that hosts content for the www.example.com domain.

server {
    location /images/ {
        root /data;
    }

    location / {
        proxy_pass http://www.example.com;
    }
}

The root directive specifies the file system path in which to search for the static files to serve. The request URI associated with the location is appended to the path to obtain the full name of the static file to serve. In the example above, in response to a request for /images/example.png, NGINX Plus delivers the file /data/images/example.png.

The proxy_pass directive passes the request to the proxied server accessed with the configured URL. The response from the proxied server is then passed back to the client. In the example above, all requests with URIs that do not start with /images/ are be passed to the proxied server.

Using Variables

You can use variables in the configuration file to have NGINX Plus process requests differently depending on defined circumstances. Variables are named values that are calculated at runtime and are used as parameters to directives. A variable is denoted by the $ (dollar) sign at the beginning of its name. Variables define information based upon NGINX’s state, such as the properties of the request being currently processed.

There are a number of predefined variables, such as the core HTTP variables, and you can define custom variables using the set, map, and geo directives. Most variables are computed at runtime and contain information related to a specific request. For example, $remote_addr contains the client IP address and $uri holds the current URI value.

Returning Specific Status Codes

Some website URIs require immediate return of a response with a specific error or redirect code, for example when a page has been moved temporarily or permanently. The easiest way to do this is to use the return directive. For example:

location /wrong/url {
    return 404;
}

The first parameter of return is a response code. The optional second parameter can be the URL of a redirect (for codes 301, 302, 303, and 307) or the text to return in the response body. For example:

location /permanently/moved/url {
    return 301 http://www.example.com/moved/here;
}

The return directive can be included in both the location and server contexts.

Rewriting URIs in Requests

A request URI can be modified multiple times during request processing through the use of the rewrite directive, which has one optional and two required parameters. The first (required) parameter is the regular expression that the request URI must match. The second parameter is the URI to substitute for the matching URI. The optional third parameter is a flag that can halt processing of further rewrite directives or send a redirect (code 301 or 302). For example:

location /users/ {
    rewrite ^/users/(.*)$ /show?user=$1 break;
}

As this example shows, the second parameter users captures though matching of regular expressions.

You can include multiple rewrite directives in both the server and location contexts. NGINX Plus executes the directives one-by-one in the order they occur. The rewrite directives in a server context are executed once when that context is selected.

After NGINX processes a set of rewriting instructions, it selects a location context according to the new URI. If the selected location contains rewrite directives, they are executed in turn. If the URI matches any of those, a search for the new location starts after all defined rewrite directives are processed.

The following example shows rewrite directives in combination with a return directive.

server {
    #...
    rewrite ^(/download/.*)/media/(w+).?.*$ $1/mp3/$2.mp3 last;
    rewrite ^(/download/.*)/audio/(w+).?.*$ $1/mp3/$2.ra  last;
    return  403;
    #...
}

This example configuration distinguishes between two sets of URIs. URIs such as /download/some/media/file are changed to /download/some/mp3/file.mp3. Because of the last flag, the subsequent directives (the second rewrite and the return directive) are skipped but NGINX Plus continues processing the request, which now has a different URI. Similarly, URIs such as /download/some/audio/file are replaced with /download/some/mp3/file.ra. If a URI doesn’t match either rewrite directive, NGINX Plus returns the 403 error code to the client.

There are two parameters that interrupt processing of rewrite directives:

  • last – Stops execution of the rewrite directives in the current server or location context, but NGINX Plus searches for locations that match the rewritten URI, and any rewrite directives in the new location are applied (meaning the URI can be changed again).
  • break – Like the break directive, stops processing of rewrite directives in the current context and cancels the search for locations that match the new URI. The rewrite directives in the new location are not executed.

Rewriting HTTP Responses

Sometimes you need to rewrite or change the content in an HTTP response, substituting one string for another. You can use the sub_filter directive to define the rewrite to apply. The directive supports variables and chains of substitutions, making more complex changes possible.

For example, you can change absolute links that refer to a server other than the proxy:

location / {
    sub_filter      /blog/ /blog-staging/;
    sub_filter_once off;
}

Another example changes the scheme from http:// to https:// and replaces the localhost address with the hostname from the request header field. The sub_filter_once directive tells NGINX to apply sub_filter directives consecutively within a location:

location / {
    sub_filter     'href="http://127.0.0.1:8080/'    'href="https://$host/';
    sub_filter     'img src="http://127.0.0.1:8080/' 'img src="https://$host/';
    sub_filter_once on;
}

Note that the part of the response already modified with the sub_filter is not replaced again if another sub_filter match occurs.

Handling Errors

With the error_page directive, you can configure NGINX Plus to return a custom page along with an error code, substitute a different error code in the response, or redirect the browser to a different URI. In the following example, the error_page directive specifies the page (/404.html) to return with the 404 error code.

error_page 404 /404.html;

Note that this directive does not mean that the error is returned immediately (the return directive does that), but simply specifies how to treat errors when they occur. The error code can come from a proxied server or occur during processing by NGINX Plus (for example, the 404 results when NGINX Plus can’t find the file requested by the client).

In the following example, when NGINX Plus cannot find a page, it substitutes code 301 for code 404, and redirects the client to http:/example.com/new/path.html. This configuration is useful when clients are still trying to access a page at its old URI. The 301 code informs the browser that the page has moved permanently, and it needs to replace the old address with the new one automatically upon return.

location /old/path.html {
    error_page 404 =301 http:/example.com/new/path.html;
}

The following configuration is an example of passing a request to the back end when a file is not found. Because there is no status code specified after the equals sign in the error_page directive, the response to the client has the status code returned by the proxied server (not necessarily 404).

server {
    ...
    location /images/ {
        # Set the root directory to search for the file
        root /data/www;

        # Disable logging of errors related to file existence
        open_file_cache_errors off;

        # Make an internal redirect if the file is not found
        error_page 404 = /fetch$uri;
    }

    location /fetch/ {
        proxy_pass http://backend/;
    }
}

The error_page directive instructs NGINX Plus to make an internal redirect when a file is not found. The $uri variable in the final parameter to the error_page directive holds the URI of the current request, which gets passed in the redirect.

For example, if /images/some/file is not found, it is replaced with /fetch/images/some/file and a new search for a location starts. As a result, the request ends up in the second location context and is proxied to http://backend/.

The open_file_cache_errors directive prevents writing an error message if a file is not found. This is not necessary here since missing files are correctly handled.


6 июля, 2015 12:27 пп
4 140 views
| Комментариев нет

Centos, Cloud Server

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

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

Требования

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

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

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

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

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

echo "<h1 style='color:red'>Error 404: Not found :-(</h1>" | sudo tee /usr/share/nginx/html/custom_404.html
echo "<p>I have no idea where that file is, sorry.  Are you sure you typed in the correct URL?</p>" | sudo tee -a /usr/share/nginx/html/custom_404.html
echo "<h1>Oops! Something went wrong...</h1>" | sudo tee /usr/share/nginx/html/custom_50x.html
echo "<p>We seem to be having some technical difficulties. Hang tight.</p>" | sudo tee -a /usr/share/nginx/html/custom_50x.html

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

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

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

sudo nano /etc/nginx/nginx.conf

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

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

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

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

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

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

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

/etc/nginx/nginx.conf
http {
. . .
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;
}
}
}

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

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

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

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

sudo nginx -t

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

sudo systemctl restart nginx

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

Tags: CentOS 7, NGINX

  • Nginx выдает ошибку 502
  • Nginx вывод ошибок php
  • Nginx php ошибка 500
  • Ngentask exe ошибка приложения 0xe0434352
  • Nfs rivals ошибка 0xc000007b