On Wed, Feb 13, 2013 at 08:56:56AM +0400, ivan babrou wrote: > On 12 February 2013 23:14, Ruslan Ermilov <r...@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: [...] > 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?
Just for the record. Here's how it works on BSD-like systems: : $ ps 36455 : PID TT STAT TIME COMMAND : 36455 s004 S+ 0:00.00 nginx: master process objs/nginx -p . -c x.conf : : $ cat x.conf : [...] : http { : server { : listen *:8000; : server_name one; : return 200 "$server_name\n"; : } : server { : listen 127.0.0.1:8000; : server_name two; : return 200 "$server_name\n"; : } : } : : $ echo 'GET http://one/' | nc 127.0.0.1 8000 : two : : $ echo 'GET http://two/' | nc 127.0.0.1 8000 : two : : $ netstat -anL | grep 8000 : 0/0/128 *.8000 : : $ vim x.conf : [...] : : $ cat x.conf : [...] : http { : server { : listen 127.0.0.1:8000; : server_name one; : return 200 "$server_name\n"; : } : server { : listen 127.0.0.1:8000; : server_name two; : return 200 "$server_name\n"; : } : } : : $ kill -HUP 36455 : : $ netstat -anL | grep 8000 : 0/0/128 127.0.0.1.8000 : $ echo 'GET http://one/' | nc 127.0.0.1 8000 : one : $ echo 'GET http://two/' | nc 127.0.0.1 8000 : two But as Igor already mentioned, trying this on Linux fails at the "reload" step because Linux cannot create two sockets for *:8000 and 127.0.0.1:8000: 2013/02/13 08:15:57 [notice] 17532#0: signal 1 (SIGHUP) received, reconfiguring 2013/02/13 08:15:57 [notice] 17532#0: reconfiguring 2013/02/13 08:15:57 [emerg] 17532#0: bind() to 127.0.0.1:8000 failed (98: Address already in use) 2013/02/13 08:15:57 [notice] 17532#0: try again to bind() after 500ms 2013/02/13 08:15:57 [emerg] 17532#0: bind() to 127.0.0.1:8000 failed (98: Address already in use) 2013/02/13 08:15:57 [notice] 17532#0: try again to bind() after 500ms 2013/02/13 08:15:57 [emerg] 17532#0: bind() to 127.0.0.1:8000 failed (98: Address already in use) 2013/02/13 08:15:57 [notice] 17532#0: try again to bind() after 500ms 2013/02/13 08:15:57 [emerg] 17532#0: bind() to 127.0.0.1:8000 failed (98: Address already in use) 2013/02/13 08:15:57 [notice] 17532#0: try again to bind() after 500ms 2013/02/13 08:15:57 [emerg] 17532#0: bind() to 127.0.0.1:8000 failed (98: Address already in use) 2013/02/13 08:15:57 [notice] 17532#0: try again to bind() after 500ms 2013/02/13 08:15:57 [emerg] 17532#0: still could not bind() So nginx rolls back to previous configuration [1]. [1] http://nginx.org/libxslt/en/docs/control.html#reconfiguration _______________________________________________ nginx-devel mailing list nginx-devel@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-devel