nginx-0.8.39

Богун Дмитрий vugluskr на vugluskr.org.ua
Чт Июн 3 11:54:47 MSD 2010


В Чтв, 03/06/2010 в 03:05 +0400, Maxim Dounin пишет:
> > > > >Есть ещё проблема при binary upgrade совмещённом с аналогичным
> > > > >изменением конфига.
> > > > Есть и ещё проблема с оставшимися от hard reboot сокетами
> > > 
> > > Отличить "оставшиеся от hard reboot" сокеты от сокетов открытых 
> > > другими процессами - не представляется возможным.  
> > А нужно ли их отличать?
> > Если кто-то настроил две разные программы слушать на одном сокете, это
> > его личные проблемы...
> > 
> > Т.е. мы имеем ситуацию, когда сокет в неизвестном состоянии принадлежит
> > нам(нашей программе - т.е. nginx'у). Из это следует, что если мы смогли
> > "завладеть" пид-файлом, то мы "должны" обеспечить работоспособность того
> > что прописано в конфиге. Для чего может потребоваться удалить предыдущий
> > unix-сокет с ФС.
> 
> В nginx'е нет никаго "завладевания" pid-файлом, он стартует если 
> смог прочитать конфиг и сделать bind() на listen-сокеты.  В рамках 
> tcp-сокетов это работает отлично - при старте (попытке старта) мы 
> не ломаем работающий сервис (если вдруг он есть), и замечательно 
> стартуем если никого нет.
Нет "завладевания" пид-файлом, но есть условие после которого он
гарантированно запускается, что по моему равнозначно.
> Unix-сокеты в этом смысле ушибленные на голову, всмысле - совсем 
> другие.  Чтобы сделать для них то же самое - нужно дополнительно 
> изобретать mandatory locking.  Которого в unix-системах по 
> большому счёту нет.
> 
> Кроме того, мне например совсем не нравится идея совершения 
> деструктивных действий при старте.  Если кто-то случайно написал в 
> конфиге listen unix:/etc/passwd; - это совсем не повод оный файл 
> стирать.  Сейчас, правда, то же самое будет для pid-файла, но это 
> не значит что количество подобных мест надо увеличивать.
Разве нельзя сделать на него lstat() и посмотреть что это такое? Это не
pid-файл, который как и /etc/passwd является обычным файлом, а сокет,
который довольно легко отличить. 

Правда от того, кто пишет такое в конфигах, никакой защиты не сделаешь.
Тогда прийдется делать защиту и от "rm -rf /", что есть неправильно.

> > Живость предыдущего инкарнации nginx'а(владельца существующего сокета) к
> > этому моменту не играет определяющей роли - существующие по нему
> > соедининия(если он был жив), будут обработаны. А потенциально новые
> > соединений уже обработаем Мы, после создания нового сокета.
> 
> Это - выварачивание наизнанку существующей модели поведения.  При 
> этом следует иметь ввиду что:
> 
> 1. C tcp-сокетами подобная модель просто невозможна, т.е. вообще.  
> Если жить так - придётся тщательно крепить крышу.
Вы сами сказали, что unix сокеты "иные" и модель tcp сокетов к ним не
применима, может быть имеет смысл использовать для них другую модель при
которой они будут нормально работать.
> 2. Мой опыт показывает что подобная модель чревата бОльшим 
> количеством проблем, чем существующая.  В частности - проблемы в 
> модели "не запускаться если тапки заняты" обычно возникают как 
> следствие осмысленных действий администратора (и он где-то рядом 
> чтобы всё исправить), в то время как в модели "стереть и 
> запуститься" - как следствие забывчивости и/или неосторожности (и 
> не факт что есть кому править, а если и есть - то не факт что он 
> сможет или вообще заметит проблему).
Но ведь оно так не работает. Если бы оно выругалось и отказалось
запускаться/перезапускаться, тогда никаких вопросов. А сейчас оно просто
запускается и невозможность забиндить unix сокет его нисколько не
смущает.
> 3. Существующая логика превращается в "стереть и запуститься" для 
> unix-сокетов дописыванием пары строчек в startup script.  Обратное 
> невозможно.
А это нарушает принцип "непрерывности" обслуживания. Причем перерыв в
обслуживании, в тяжелых случаях(сокет удалили, а новый нгинкс по
какой-либо причине отказался стартовать), может быть весьма
существенным.

Дело конечно ваше, но по моему невозможно сделать единую систему для TCP
и unix сокетов.




Подробная информация о списке рассылки nginx-ru