server_name bug

Igor Sysoev is at rambler-co.ru
Wed Oct 22 13:45:46 MSD 2008


On Wed, Oct 22, 2008 at 12:20:37PM +0300, MZ wrote:

> В вт, 21/10/2008 в 22:40 +0400, Igor Sysoev пишет:
> > On Tue, Oct 21, 2008 at 09:27:40PM +0300, MZ wrote:
> > 
> > > Обнаружил такой баг
> > > server {
> > >   listen *:80;
> > >   server_name example.org;
> > > }
> > > server {
> > >   listen 1.2.3.4:80;
> > >   server_name default;
> > > }
> > > 
> > > запрос на 1.2.3.4 с Host: example.org попадает не в первый vhost а во
> > > второй
> > > 
> > > nginx 0.6.31
> > 
> > Это не баг. Сначала проверяются адрес:порт, а только потом имя.
> > Поскольку listen 1.2.3.4:80 описан явно, то, с точки зрения nginx'а,
> > сервер, в котором он описан, является единственным приёмником таких запросов.
> Поскольку присутствует *:80 то приемников для коннектов на 1.2.3.4 уже
> не одна штука, а включая все виртхосты с 1.2.3.4:80 и все с *:80.
> 
> > Особенно хорошо это видно, если поставить
> > 
> >    listen 1.2.3.4:80 default bind;
> > 
> > Тогда соединение в принципе не попадёт в *:80. Так устроены сокеты.
> без bind соединение попадает в *:80, но не обрабатывается первым
> виртхостом - разве это не баг ?
> 
> > Если на 1.2.3.4:80 ожидаются запросы для example.org, то нужно такое:
> > 
> >  server {
> >    listen *:80;
> >    listen 1.2.3.4:80;
> >    server_name example.org;
> >  }
> >  server {
> >    listen 1.2.3.4:80;
> >    server_name default;
> >  }
> А если запросы на example.org ожидаются на любом ипе? Разве *:80 не для
> того и сделан, чтоб не перечислять все ипы ?

Нет. *:80 сделан для того, чтобы делать bind(*:80).
*:80 - это не только возможность не перечислять ip, это и ещё,
возможность сделать

   server {
       listen 80;
       listen 192.168.1.1;
   }

   server {
       listen 192.168.1.2;
       listen 192.168.1.3;
   }

и при этом не иметь, например, адреса 192.168.1.2 на хосте в данный момент.

> ЗЫ: я конечно понимаю что чинить это никто не будет, кроме тех кому
> надо, - опишите хотя бы этот баг в документации, чтоб у других людей
> вопросов не возникало.

Это не баг. Это фича.
Сейчас поведение двух конфигураций

 server {
   listen *:80;
   server_name example.org;
 }
 server {
   listen 1.2.3.4:80;
   server_name default;
 }

 server {
   listen *:80;
   server_name example.org;
 }
 server {
   listen 1.2.3.4:80 default rcvbuf=8k;
   server_name default;
 }

не отличается. Если сделать, как предлагается, то оно будет отличатся, так
как во втором случае (rcvbuf=8k) делается bind().


-- 
Игорь Сысоев
http://sysoev.ru





More information about the nginx-ru mailing list