server_name and listen behaviour

ivan babrou ibobrik at gmail.com
Wed Feb 13 04:56:56 UTC 2013


On 12 February 2013 23:14, Ruslan Ermilov <ru at nginx.com> wrote:

> 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.


See below, I only see one listening address in netstat.

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
>

I have listen *:80 before reload, then change it to listen one.local:80 and
reaload. nginx/1.2.6

Before reload:

callisto ~ # netstat -ntl | fgrep ':80'
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN

After reload:

callisto ~ # netstat -ntl | fgrep ':80'
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN

After restart:

callisto ~ # netstat -ntl | fgrep ':80'
tcp        0      0 127.0.0.1:80            0.0.0.0:*               LISTEN

Did you have one.local and two local when you check this?


> [1] http://nginx.org/r/listen
>
> _______________________________________________
> nginx-devel mailing list
> nginx-devel at nginx.org
> http://mailman.nginx.org/mailman/listinfo/nginx-devel
>



-- 
Regards, Ian Babrou
http://bobrik.name http://twitter.com/ibobrik skype:i.babrou
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.nginx.org/pipermail/nginx-devel/attachments/20130213/bbca49b3/attachment-0001.html>


More information about the nginx-devel mailing list