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