Issue with upstream

Maxim Dounin mdounin at mdounin.ru
Tue Nov 16 17:49:16 MSK 2010


Hello!

On Tue, Nov 16, 2010 at 01:16:25PM +0000, Phil Bayfield wrote:

> I'm having some problems configuring upstream servers with localhost backup
> (error page)
> 
> upstream backend1 {
>     server 1.2.3.4;
>     server 2.3.4.5;
>     server localhost backup;
> }
> 
> upstream backend2 {
>     server 3.4.5.6;
>     server 4.5.6.7;
> }
> 
> Works, but:
> 
> upstream backend1 {
>     server 1.2.3.4;
>     server 2.3.4.5;
>     server localhost backup;
> }
> 
> upstream backend2 {
>     server 3.4.5.6;
>     server 4.5.6.7;
>     server localhost backup;
> }
> 
> Causes:
> 
> Testing nginx configuration: [emerg]: invalid parameter "backup"
> 
> Is this a bug?

Most likely you used backend2 somewhere in proxy_pass before 
defining upstream backend2.  This is not generally supported and 
and shouldn't be allowed, but happens to "work" (though with 
several unexpected side effects) for now.

Attached patch makes sure such configuration like

server {
    location / {
        proxy_pass backend;
        ...
    }
    ...
}

upstream backend {
    ...
}

will generate "upstream "backend" defined too late" error during 
configuration parsing.

Maxim Dounin
-------------- next part --------------
diff --git a/src/http/ngx_http_upstream.c b/src/http/ngx_http_upstream.c
--- a/src/http/ngx_http_upstream.c
+++ b/src/http/ngx_http_upstream.c
@@ -4220,6 +4220,12 @@ ngx_http_upstream_add(ngx_conf_t *cf, ng
             return NULL;
         }
 
+        if (flags & NGX_HTTP_UPSTREAM_CREATE) {
+            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
+                               "upstream \"%V\" defined too late", &u->host);
+            return NULL;
+        }
+
         if ((uscfp[i]->flags & NGX_HTTP_UPSTREAM_CREATE) && u->port) {
             ngx_conf_log_error(NGX_LOG_WARN, cf, 0,
                                "upstream \"%V\" may not have port %d",
@@ -4227,14 +4233,6 @@ ngx_http_upstream_add(ngx_conf_t *cf, ng
             return NULL;
         }
 
-        if ((flags & NGX_HTTP_UPSTREAM_CREATE) && uscfp[i]->port) {
-            ngx_log_error(NGX_LOG_WARN, cf->log, 0,
-                          "upstream \"%V\" may not have port %d in %s:%ui",
-                          &u->host, uscfp[i]->port,
-                          uscfp[i]->file_name, uscfp[i]->line);
-            return NULL;
-        }
-
         if (uscfp[i]->port != u->port) {
             continue;
         }


More information about the nginx mailing list