ПРОЕКТЫ 


  АРХИВ 


Apache-Talk @lexa.ru 

Inet-Admins @info.east.ru 

Filmscanners @halftone.co.uk 

Security-alerts @yandex-team.ru 

nginx-ru @sysoev.ru 


  СТАТЬИ 


  ПЕРСОНАЛЬНОЕ 


  ПРОГРАММЫ 



ПИШИТЕ
ПИСЬМА












     АРХИВ :: nginx-ru
Nginx-ru mailing list archive (nginx-ru@sysoev.ru)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Bad Gateway и proxy_nex t_upstream



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
# HG changeset patch
# User Maxim Dounin <mdounin@xxxxxxxxxx>
# 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
 


 




Copyright © Lexa Software, 1996-2009.