server_name bug

Mykola Dzham i at levsha.org.ua
Sat Oct 25 18:38:31 MSD 2008


 kot (kot1 at arsvest.ru):
> Mykola Dzham пишет:
> >  MZ (zuborg at advancedhosters.com):
> >> В ср, 22/10/2008 в 14:13 +0400, Maxim Dounin пишет:
> >>> Hello!
> >>>
> >>> 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 сокет для INADDR_ANY, и 
> >>> дополнительно слушающий сокет на каком-либо IP на том же порту - 
> >>> то соединение на этот IP в сокет для INADDR_ANY просто не попадёт.
> >>>
> >>> То, что nginx по умолчанию при такой конфигурации открывает только 
> >>> один listen сокет - это внутренняя оптимизация, не более того.  
> >>> Поведение от наличия/отсутствия оптимизаций меняться не должно.
> >> Согласен что это всего лишь оптимизация, но я не считаю адекватным
> >> матчинг виртхоста по значению директивы listen в ущерб значению хидера
> >> "Host" и директивы server_name.
> > 
> > А Вам известные адекватные в Вашем понимании http сервера?
> 
> Мне не известны, а что это меняет?

Ничего. Но на определенные мысли навевает. По поводу "все идут не в
ногу, только я в ногу"

> > Например apache тоже будет у Вас не адекватным.
> > А поведение таки вполне логичное если исходить из принципов работы
> > сокетов.
> 
> А зачем вообще исходить из этих принципов в пределах одной
> программы? Какой в этом смысл?

Лично мне больше нравится исходить их принципов работы сокетов чем из
принципов лично Ваших соображений по поводу того, как оно более
правильно.

> Вот если бы другая программа открыла ещё один сокет на том же
> порту, тогда да, от принципа работы сокетов никуда не деться. А в
> пределах одной программы может быть лучше исходить из удобства
> для админа? Ведь для удобства конечного пользователя программы
> обычно и пишутся...

Вот лично для меня более удобно так, как оно есть. Потому что оно
понятно и исходит из принципов того, кто на ком стоит. И прекрасно
согласуется с тем, что у нас сначала происходит tcp соединение, а уж
потом по этому соединению идут данные, которые в частности могут
содержать заголовок host: .
Если Вас это не устраивает Вы всегда можете сделать обработку только
исходя из заголовка Host: не используйте явное указание ip, используйте
только * 

-- 
Mykola Dzham, LEFT-(UANIC|RIPE)
PGP fingerprint: 2A0B 7423 51AF B19B 74D5  31CA 2BFF 42F1 8094 7652





More information about the nginx-ru mailing list