Nginx error_page location не работает

archive view archive save

article Переопределение error_page на уровне server не работает для нужного location и выдает стандартно оформленные страницы HTTP ошибок. Как заставить Nginx выдавать страницу из нужного location для определённого error_page HTTP статуса?

Например мы хотим:

#
# The default server
#
server
{
 
    ....
 
    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html
    {
        internal;
        root   /usr/share/nginx/html;
    }
 
}

Но Nginx error_page location не срабатывает и в итоге мы получаем стандартно оформленную страницу ошибки:

502 Bad Gateway
 
-------------------------
         Nginx

А хотелось получить содержимое /usr/share/nginx/html/50x.html:

An error occurred.

Sorry, the page you are looking for is currently unavailable.
Please try again later.

If you are the system administrator of this resource then you should check the error log for details.

Faithfully yours, nginx.

При этом "/var/log/nginx/error.log" и "/var/log/nginx/access.log" не особо щедры на подробности:

/var/log/nginx/error.log
2013/12/21 10:47:54 [error] 4549#0: *1 connect() failed (111: Connection refused
) while connecting to upstream, client: 192.168.231.1, server: *.localhost, requ
est: "GET / HTTP/1.1", upstream: "http://127.0.0.1:81/", host: "192.168.231.131"
---
/var/log/nginx/access.log
192.168.231.1 - - [21/Dec/2013:10:47:54 +0200] "GET / HTTP/1.1" 502 549 "-" "Ope
ra/9.80 (Windows NT 5.1; U; ru) Presto/2.10.229 Version/11.64" "-"

Не буду раскрывать весь супер-пупер секретный конфиг кэширующего Nginx на фронтэнде, а просто скажу отказ Nginx-а перенаправлять error_page на нужный нам location связан с настройками перенаправления, и, чтобы всё заработало как нам нужно, допилим конфиг до такой кондиции:

#
# The default server
#
server
{
 
    recursive_error_pages on;
 
    ....
 
    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html
    {
        internal;
        root   /usr/share/nginx/html;
    }
 
}

В некоторых случаях возможно кому-то будет полезно обратить внимание на директивы "proxy_intercept_errors on;" и "proxy_redirect off;". Нужно иметь ввиду, что в случае разрешения "recursive_error_pages on;" в некоторых конфигурациях может возникать ошибка "500 - Internal Server Error":

2013/12/06 13:49:23 [error] 8902#0: *3 rewrite or internal redirection cycle
while redirect to named location "@nocached" while sending to client, client:
66.249.78.178, server: www.example.com, request: "GET /profiles/ HTTP/1.1",
upstream: "http://127.0.0.1:81/profiles/", host: "www.example.com", referrer:
"http://www.example.com/forum/index"
2013/12/08 13:50:20 [error] 8902#0: *28 rewrite or internal redirection cycle
while redirect to named location "@nocached" while sending to client, client:
66.249.78.178, server: www.example.com, request: "GET /profiles/ HTTP/1.1",
upstream: "http://127.0.0.1:81/profiles/", host: "www.example.com"

В первом случае "*3 rewrite or internal redirection cycle" три цикла, а во втором "*28 rewrite or internal redirection cycle" аж 28 - значит в конфиге может присутствовать что-то вроде:

server {
    ....
    # Set 404 for all request
    location / {
        error_log /dev/null crit;
        access_log  off;
 
        return 404;
    }
}

http://nginx.org/ru/docs/http/ngx_http_core_module.html#internal

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

Часто это связано с использованием mod_rewrite и .htaccess для ЧПУ на бакэнде, разумеется Apache, и, без подобных перенаправлений не обойтись если мы хотим использовать nginx в качестве кэширующего прокси...

Ссылки по теме:


Об авторе
АдМинь БагоИскатель
АдМинь БагоИскатель ярый борец за безглючную работу любых механизмов и организмов во всей вселенной и потому пребывает в вечном поиске всяческих багов, а тот кто ищет как известно всегда находит. Когда что-то или кого-то вылечить не в состоянии, то со словами "Я в аду, а вы все черти" уходит в запой выйдя из которого снова берётся лечить неизлечимое.
Ещё статьи автора
Комментарии в блоге
Новое на форуме