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

Alexey V. Karagodov kav at karagodov.name
Mon Jun 16 19:44:30 MSD 2008


On 16.06.2008, at 17:25, test157 at smail.ee wrote:

> 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";
в контексте http{}/server{} указано?


а error_page-ы в каком контексте указаны?
nginx какой версии?

>>
>
> убрал полностью реврайт, и сделал как Вы указали один в один. все
> работает как прежде, но поведение на 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