Santhosh
Santhosh

Reputation: 11774

nginx: not matching the correct way

i have the following nginx configuration

GIVES WRONG RESULTS

upstream webapp {
    server webapp:8000;
}


upstream db {
    server phppgadmin:80;
}


server {
    listen 80;

    server_name db.*;

    location / {
        proxy_pass http://db;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_redirect off;
    }

}

server {
    listen 80;


    location / {
        proxy_pass http://webapp;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_redirect off;
    }

    location /static {
        autoindex on;
        alias /staticfiles/;
    }

   location /media {
       autoindex on;
       alias /mediafiles/;
   }

}

My ip address of the pc is xx.xx.xx.xx

what I observed is that

db.xx.xx.xx.xx - shows the db upstream

and also xx.xx.xx.xx - shows the db upstream

GIVES CORRECT RESULTS

where as when i change the order it shows properly

upstream webapp {
    server webapp:8000;
}


upstream db {
    server phppgadmin:80;
}

server {
    listen 80;


    location / {
        proxy_pass http://webapp;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_redirect off;
    }

    location /static {
        autoindex on;
        alias /staticfiles/;
    }

   location /media {
       autoindex on;
       alias /mediafiles/;
   }

}



server {
    listen 80;

    server_name db.*;

    location / {
        proxy_pass http://db;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_redirect off;
    }

}

Now

db.xx.xx.xx.xx - shows the db upstream

and xx.xx.xx.xx - shows the webapp upstream

QUESTION

I am not able to understand in the first case how come xx.xx.xx.xx is matched by server_name db.*; Or why the second one shows the intended behaviour

note

Ofcourse in my /etc/hosts i have setup

xx.xx.xx.xx app.xx.xx.xx.xx
xx.xx.xx.xx db.xx.xx.xx.xx

Upvotes: 1

Views: 132

Answers (1)

anemyte
anemyte

Reputation: 20176

Nginx selects server block by port (with IP, if given) and Host header. If there is no match, it uses a block where default_server is set. In your case there is no match by Host and neither there is a default_server so I think it just picked first. Either add server_name to the block with the webapp upstream or make it a default one:

listen 80 default_server;

Upvotes: 1

Related Questions