Nginx-ru mailing list archive (nginx-ru@sysoev.ru)
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Re[2]: динамическая о бработка ошибок
On 16.06.2008, at 17:25, test157@xxxxxxxx wrote:
Hello Igor,
Monday, June 16, 2008, 3:33:00 PM, you wrote:
On Mon, Jun 16, 2008 at 03:09:41PM +0300, test157@xxxxxxxx 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@xxxxxxxx
|