ошибка в обработке

Maxim Dounin mdounin at mdounin.ru
Fri Aug 7 01:09:37 MSD 2009


Hello!

On Wed, Aug 05, 2009 at 02:25:19PM -0700, Konstantin Svist wrote:

> Konstantin Svist wrote:
> > Igor Sysoev wrote:
> >   
> >> On Fri, May 01, 2009 at 12:23:40PM -0700, Konstantin Svist wrote:
> >>
> >>   
> >>     
> >>>     server {
> >>>         location /foo/bar {
> >>>             proxy_pass http://backend-cluster;
> >>>         }
> >>>         location / {
> >>>             proxy_pass http://somehost;
> >>>         }
> >>>     }
> >>>
> >>> Если запрос приходит на /foo/bar но backend-cluster не отвечает, то
> >>> запрос перекидывается на somehost - который не знает как обработать
> >>> запрос типа /foo/bar.
> >>> **proxy_next_upstream ничего не меняет.
> >>>
> >>> Также без успеха пробовал добавить
> >>>         location /foo {
> >>>             return 403;
> >>>         }
> >>>     
> >>>       
> >> Скорее всего, используется что-то типа
> >>
> >>      error_page  502 504  /50x.html;
> >>
> >> А самого "location = /50x.html" нет, вот оно и уходит на "location /".
> >>
> >>   
> >>     
> >
> > Что-то я не могу понять как правильно сделать следующее:
> > * если бэкенд возвращает ошибку, использовать только nginx встроенную
> > страницу
> > * избежать вышеупомянутую проблему
> > * на многих server-ах
> >   
> 
> 
> Не ошибка ли это nginx-а?
> 
>     # only show nginx internal pages to the user
>     proxy_intercept_errors on;
>     error_page 401 404 500 501 502 503 504 505 /50x.html;

Комментарий очевидно misleading.  Использовать встроенные в nginx 
страницы ошибок при перехвате ошибок от бекенда - вообще нельзя, 
никак.  Встроенные страницы используются только для ошибок 
генерируемых непосредственно nginx'ом, и только если для них не 
определена error_page.

> 
>     server {
>         listen 80;
>         location /foo/ {
>             proxy_pass http://mybackend:8080;  # basic auth, returns 401
> if skipped
>         }
>         location / {
>             proxy_pass http://mybackend:8000;  # port not open
>         }
>     }
> 
> Если делаю запрос на /foo/, получаю 502 Bad Gateway.
> Т.е. идёт запрос без пароля, 8080 отвечает 401, nginx идёт на /50x.html
> но там получает 502 т.к. порт закрыт.
> Почему proxy_intercept_errors не обрабатывает этот 401?

Что значит не обрабатывает?  Ещё как обрабатывает - честно 
отправляет запрос на /50x.html.  А дальше уж куда конфиги привели 
- туда и дойдёт.

Maxim Dounin





More information about the nginx-ru mailing list