Re[2]: динамическая обработка ошибок

test157 at smail.ee test157 at smail.ee
Mon Jun 16 17:25:55 MSD 2008


Hello Igor,

Monday, June 16, 2008, 3:33:00 PM, you wrote:

> On Mon, Jun 16, 2008 at 03:09:41PM +0300, test157 at smail.ee wrote:

>> задача очень простая, все ошибки разбиты на две группы - одни
>> обрабатывают статически, т.е. Nginx'ом - другие передаются на backend
>> для обработки. делается все примерно так:
>> 
>> error_page 501 502 503 504 507 /error/index.html;
>> 
>> error_page 404 @e404;
>>
>> location @e404 {
>>   rewrite  .*  /e/index.php?id=404&ip=$remote_addr&uri=$request_uri  last;
>> }
>> 
>> # тут статика
>> location /error/ {
>>   root /var/www;
>>   internal;
>> }
>> 
>> # шлем ошибку на backend
>> location  /e/ {
>>   proxy_pass http://127.0.0.1:80;
>>   internal;
>> }
>> 
>> т.е. 404 идет на обработку удаленно, все 500-ые идут локально. так
>> вот, все работает очень хорошо, до той поры пока живой backend - как
>> только 127.0.0.1 уходит в офф - начинает лезть 502-ой эррор, хотя он
>> переопределен вверху, на уровне сервера - однако он исчезает, если его
>> переназначить в location / - но тогда начинает лезть error 404 - хотя
>> он сам по себе определен выше работать через backend который в офе.
>> 
>> суть вопроса, почему лезет 502-ой, и как избавиться от него - с учетом
>> того что сам 404 должен идти через backend.  я пробовал переназначать
>> 404-ую на статику в самом /error/ но это ничего не дало, пробовал
>> играться с рекурсией - тоже мимо.
>> 
>> как вариант обрабатывать ошибки на самом backendе и опустить
>> использование rewrite_url - но не хотелось бы его озадачивать этим.
>> 
>> P.S.: и еще может стоит ввести новую переменную которая будет
>> содержать код ошибки? или такие вещи делаются как-то иначе? а то чтобы
>> создать динамические обработки для 10 ошибок нужно сделать 10 блоков
>> с @ где будет только разница в коде ошибке.

> Лучше так:

> -    error_page 404 @e404;
> +    error_page 404 = @e404;

заменил

> Кроме того, proxy_pass можно ставить сразу в @e404:

>      location @e404 {
>          proxy_pass 
> http://127.0.0.1:80/e/index.php?id=404&ip=$remote_addr&uri=$request_uri;
>          recursive_error_pages   on;
>      }

> А переход к 502 лечится "recursive_error_pages on";

убрал полностью реврайт, и сделал как Вы указали один в один. все
работает как прежде, но поведение на 502 не изменилось (или не заметил).

1) если error_page 502 /error/index.html определено в сервере. то
ошибка выдается 502 от nginx дефолтовая.
2) если error_page 502 /error/index.html определено в location / -
выдается ошибка 404 - также дефолтовая страничка nginx - а нужно статическую
error_page 502 /error/index.html, или как-то заменять 404-ую
дефолтовую, которая изначально через бякэнд запрашивается.
3) изменения в поведении от recursive_error_pages on/off при лежащем
backende вобще не заметил.

пробовал также переназначить error_page внутри @e404 также ничего не
помогло.





-- 
Best regards,
 Test157                            mailto:test157 at smail.ee






More information about the nginx-ru mailing list