Bad Gateway и proxy_next_upstream
Maxim Dounin
mdounin at mdounin.ru
Sat Jan 12 06:06:25 MSK 2008
Hello!
On Fri, Jan 11, 2008 at 10:34:45PM +0300, Михаил Монашёв wrote:
>MD> Апач, я так понимаю, ни разу не прокси, и 502 приходит только от
>MD> nginx'а?
>
>Обин бэкен - Апач на том же сервере. Второй бэкенд - nginx на втором
>сервере. Его я заставил выдавать 500 вместо 502, как ты описал ниже. А
>Апач на первом бэкенде никак не могу. Там есть ErrorDocument
>http://httpd.apache.org/docs/1.3/mod/core.html#errordocument , но
>подменить код статуса я не понял как...
Если Апач - всё-таки прокси, то наверное никак.
[...]
>MD> Естественные последствия - включенный proxy_next_upstream для 500
>MD> ошибок, что может быть нежелательно. Но тут уж смотри сам,
>MD> вариантов не много - либо 500, либо 404.
>
>Либо 503...
Ага, конечно. (с)
Нет там обработки 503, и никогда не было. Версия 0.3.33, в
changelog'е для которой заявлено:
*) Feature: the "http_503" parameter of the "proxy_next_upstream"
or "fastcgi_next_upstream" directives.
содержит только поддержку параметра. И этот параметр не делает
ровным счётом ничего.
>MD> Можно ещё попробовать поиграться с proxy_intercept_errors и
>MD> ручными fallback'ами, но тут красоты не будет.
>
>Это грязный хак. Не хочу так.
>
>
>Ты похоже оказался прав... Проще, и возможно правильнее, добавить в
>исходники поддержку http_502. Ну и http_504 заодно...
Я так понимаю - 501 и 505 вычёркиваем, нам интересны только 500, 502,
503, 504. Можно ещё 507 для общности прикрутить, но как-нибудь в
другой раз.
Прилагающийся патчик (для 0.6.25) делает вышеуказанное тупо и в
лоб. Возможно, он даже работает (сразу предупреждаю - я не проверял).
Maxim Dounin
-------------- next part --------------
# HG changeset patch
# User Maxim Dounin <mdounin at mdounin.ru>
# Date 1200093936 -10800
# Node ID fea1578a837b7b6957157b3ab708f5cc467471de
# Parent 6999caedb6658e8ad716eebe605fe07221be85d5
Add "http_502" and others to proxy_next_upstream/fastcgi_next_upstream.
Add support for "http_502", "http_503", "http_504" parameters in
"proxy_next_upstream" and "fastcgi_next_upstream" directives.
diff -r 6999caedb665 -r fea1578a837b src/http/modules/ngx_http_fastcgi_module.c
--- a/src/http/modules/ngx_http_fastcgi_module.c Tue Jan 08 00:00:00 2008 +0300
+++ b/src/http/modules/ngx_http_fastcgi_module.c Sat Jan 12 02:25:36 2008 +0300
@@ -179,7 +179,9 @@ static ngx_conf_bitmask_t ngx_http_fast
{ ngx_string("timeout"), NGX_HTTP_UPSTREAM_FT_TIMEOUT },
{ ngx_string("invalid_header"), NGX_HTTP_UPSTREAM_FT_INVALID_HEADER },
{ ngx_string("http_500"), NGX_HTTP_UPSTREAM_FT_HTTP_500 },
+ { ngx_string("http_502"), NGX_HTTP_UPSTREAM_FT_HTTP_502 },
{ ngx_string("http_503"), NGX_HTTP_UPSTREAM_FT_HTTP_503 },
+ { ngx_string("http_504"), NGX_HTTP_UPSTREAM_FT_HTTP_504 },
{ ngx_string("http_404"), NGX_HTTP_UPSTREAM_FT_HTTP_404 },
{ ngx_string("off"), NGX_HTTP_UPSTREAM_FT_OFF },
{ ngx_null_string, 0 }
diff -r 6999caedb665 -r fea1578a837b src/http/modules/ngx_http_proxy_module.c
--- a/src/http/modules/ngx_http_proxy_module.c Tue Jan 08 00:00:00 2008 +0300
+++ b/src/http/modules/ngx_http_proxy_module.c Sat Jan 12 02:25:36 2008 +0300
@@ -156,7 +156,9 @@ static ngx_conf_bitmask_t ngx_http_prox
{ ngx_string("timeout"), NGX_HTTP_UPSTREAM_FT_TIMEOUT },
{ ngx_string("invalid_header"), NGX_HTTP_UPSTREAM_FT_INVALID_HEADER },
{ ngx_string("http_500"), NGX_HTTP_UPSTREAM_FT_HTTP_500 },
+ { ngx_string("http_502"), NGX_HTTP_UPSTREAM_FT_HTTP_502 },
{ ngx_string("http_503"), NGX_HTTP_UPSTREAM_FT_HTTP_503 },
+ { ngx_string("http_504"), NGX_HTTP_UPSTREAM_FT_HTTP_504 },
{ ngx_string("http_404"), NGX_HTTP_UPSTREAM_FT_HTTP_404 },
{ ngx_string("off"), NGX_HTTP_UPSTREAM_FT_OFF },
{ ngx_null_string, 0 }
diff -r 6999caedb665 -r fea1578a837b src/http/ngx_http_upstream.c
--- a/src/http/ngx_http_upstream.c Tue Jan 08 00:00:00 2008 +0300
+++ b/src/http/ngx_http_upstream.c Sat Jan 12 02:25:36 2008 +0300
@@ -1210,6 +1210,35 @@ ngx_http_upstream_process_header(ngx_eve
}
}
+ if (u->headers_in.status_n == NGX_HTTP_BAD_GATEWAY) {
+
+ if (u->peer.tries > 1
+ && u->conf->next_upstream & NGX_HTTP_UPSTREAM_FT_HTTP_502)
+ {
+ ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_HTTP_502);
+ return;
+ }
+ }
+
+ if (u->headers_in.status_n == NGX_HTTP_SERVICE_UNAVAILABLE) {
+
+ if (u->peer.tries > 1
+ && u->conf->next_upstream & NGX_HTTP_UPSTREAM_FT_HTTP_503)
+ {
+ ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_HTTP_503);
+ return;
+ }
+ }
+
+ if (u->headers_in.status_n == NGX_HTTP_GATEWAY_TIME_OUT) {
+
+ if (u->peer.tries > 1
+ && u->conf->next_upstream & NGX_HTTP_UPSTREAM_FT_HTTP_504)
+ {
+ ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_HTTP_504);
+ return;
+ }
+ }
if (u->headers_in.status_n >= NGX_HTTP_BAD_REQUEST
&& u->conf->intercept_errors)
@@ -2291,6 +2320,7 @@ ngx_http_upstream_next(ngx_http_request_
} else {
switch(ft_type) {
+ case NGX_HTTP_UPSTREAM_FT_HTTP_504:
case NGX_HTTP_UPSTREAM_FT_TIMEOUT:
status = NGX_HTTP_GATEWAY_TIME_OUT;
break;
@@ -2301,6 +2331,14 @@ ngx_http_upstream_next(ngx_http_request_
case NGX_HTTP_UPSTREAM_FT_HTTP_404:
status = NGX_HTTP_NOT_FOUND;
+ break;
+
+ case NGX_HTTP_UPSTREAM_FT_HTTP_502:
+ status = NGX_HTTP_BAD_GATEWAY;
+ break;
+
+ case NGX_HTTP_UPSTREAM_FT_HTTP_503:
+ status = NGX_HTTP_SERVICE_UNAVAILABLE;
break;
/*
diff -r 6999caedb665 -r fea1578a837b src/http/ngx_http_upstream.h
--- a/src/http/ngx_http_upstream.h Tue Jan 08 00:00:00 2008 +0300
+++ b/src/http/ngx_http_upstream.h Sat Jan 12 02:25:36 2008 +0300
@@ -24,6 +24,8 @@
#define NGX_HTTP_UPSTREAM_FT_HTTP_404 0x00000040
#define NGX_HTTP_UPSTREAM_FT_BUSY_LOCK 0x00000080
#define NGX_HTTP_UPSTREAM_FT_MAX_WAITING 0x00000100
+#define NGX_HTTP_UPSTREAM_FT_HTTP_502 0x00000200
+#define NGX_HTTP_UPSTREAM_FT_HTTP_504 0x00000400
#define NGX_HTTP_UPSTREAM_FT_NOLIVE 0x40000000
#define NGX_HTTP_UPSTREAM_FT_OFF 0x80000000
More information about the nginx-ru
mailing list