динамическая обработка ошибок

Igor Sysoev is at rambler-co.ru
Mon Jun 16 16:33:00 MSD 2008


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://sysoev.ru





More information about the nginx-ru mailing list