Интересный эффект при proxy_next_upstream http_404

Igor Sysoev is at rambler-co.ru
Tue Jun 21 12:41:48 MSD 2005


On Tue, 21 Jun 2005, Andrew Velikoredchanin wrote:

> Интересный эффект заметил.
>
> Если на фронтэнде стоит "proxy_next_upstream ... http_404;", а ни на одном 
> бэкэнде запрашиваемого файла нет, то фронтэнд продолжает перебирать бэкэнда 
> до бесконечности, т.е. соединение фактически виснет.
>
> nginx последний 0.1.36

Это ошибка. Прилагаемый патч должен помочь.


Игорь Сысоев
http://sysoev.ru
-------------- next part --------------
--- src/event/ngx_event_connect.c	Mon Apr 18 00:59:54 2005
+++ src/event/ngx_event_connect.c	Tue Jun 21 12:34:25 2005
@@ -376,18 +376,20 @@
 
 
 void
-ngx_event_connect_peer_failed(ngx_peer_connection_t *pc)
+ngx_event_connect_peer_failed(ngx_peer_connection_t *pc, ngx_uint_t down)
 {
     time_t  now;
 
-    now = ngx_time();
+    if (down) {
+        now = ngx_time();
 
-    /* ngx_lock_mutex(pc->peers->mutex); */
+        /* ngx_lock_mutex(pc->peers->mutex); */
 
-    pc->peers->peer[pc->cur_peer].fails++;
-    pc->peers->peer[pc->cur_peer].accessed = now;
+        pc->peers->peer[pc->cur_peer].fails++;
+        pc->peers->peer[pc->cur_peer].accessed = now;
 
-    /* ngx_unlock_mutex(pc->peers->mutex); */
+        /* ngx_unlock_mutex(pc->peers->mutex); */
+    }
 
     pc->cur_peer++;
 
--- src/event/ngx_event_connect.h	Mon Apr  4 12:44:01 2005
+++ src/event/ngx_event_connect.h	Tue Jun 21 12:34:39 2005
@@ -67,7 +67,7 @@
 
 
 ngx_int_t ngx_event_connect_peer(ngx_peer_connection_t *pc);
-void ngx_event_connect_peer_failed(ngx_peer_connection_t *pc);
+void ngx_event_connect_peer_failed(ngx_peer_connection_t *pc, ngx_uint_t down);
 
 
 #endif /* _NGX_EVENT_CONNECT_H_INCLUDED_ */
--- src/http/ngx_http_upstream.c	Thu May 19 16:52:40 2005
+++ src/http/ngx_http_upstream.c	Tue Jun 21 12:35:50 2005
@@ -1230,7 +1230,7 @@
 ngx_http_upstream_next(ngx_http_request_t *r, ngx_http_upstream_t *u,
     ngx_uint_t ft_type)
 {
-    ngx_uint_t  status;
+    ngx_uint_t  status, down;
 
     ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
                    "http next upstream, %xD", ft_type);
@@ -1239,10 +1239,14 @@
     ngx_http_busy_unlock(u->conf->busy_lock, &u->busy_lock);
 #endif
 
-    if (ft_type != NGX_HTTP_UPSTREAM_FT_HTTP_404) {
-        ngx_event_connect_peer_failed(&u->peer);
+    if (ft_type == NGX_HTTP_UPSTREAM_FT_HTTP_404) {
+        down = 0;
+    } else {
+        down = 1;
     }
-    
+
+    ngx_event_connect_peer_failed(&u->peer, down);
+
     if (ft_type == NGX_HTTP_UPSTREAM_FT_TIMEOUT) {
         ngx_log_error(NGX_LOG_ERR, r->connection->log, NGX_ETIMEDOUT,
                       "upstream timed out");


More information about the nginx-ru mailing list