server_name and listen behaviour

Ruslan Ermilov ru at nginx.com
Tue Feb 12 19:14:23 UTC 2013


On Tue, Feb 12, 2013 at 09:10:17PM +0400, ivan babrou wrote:
>    Hi, I have a question. It's better to describe with example
>    I point one.local and two.local to 127.0.0.1 and create following servers
>    in config for nginx:
>    server {
>      listen 80;
>      server_name one.local;
>      location / {
>        return 404;
>      }
>    }
>    server {
>      listen two.local:80;
>      server_name two.local;
>      location / {
>        return 403;
>      }
>    }
>    If I request one.local then 403 is returned. If i change listen for
>    one.local to one.local:80 then 404 correctly returned, but only after
>    restart, reload doesn't help (that's probably bug too).
>    I expect to get 404 if i request one.local even if I listen on all
>    addresses. Am I right?

127.0.0.1:80 and *:80 are two different socket addresses,
and when you connect to 127.0.0.1:80, the first one will
be used (two.local in your case).  This is not specific
to nginx, it's how sockets work.

nginx by default optimizes such a config by creating only
one listening socket [1], and pessimizes by using getsockaddr()
to differentiate between multiple sockaddrs.  This optimization
can be turned off by using "bind" parameter (or some other
parameters, see [1] for details).  Nevertheless, 127.0.0.1:80
and *:80 are still two different addresses, and 127.0.0.1:80
is more specific than *:80.

As to "reload not working", I cannot reproduce this:

(in my config I always return 200 with "$server_name")

$ echo 'GET http://one:8000/' | nc 127.0.0.1 8000
two.local

# here config was changed to listen on 127.0.0.1:80
# instead of *:80 for one.local

# reload (kill -HUP nginx master process)

$ kill -HUP 33122
$ echo 'GET http://one:8000/' | nc 127.0.0.1 8000
one.local

[1] http://nginx.org/r/listen



More information about the nginx-devel mailing list