[emerg] duplicate listen options for X.X.X.X:80 in /usr/local/etc/nginx/nginx.conf:9

Gena Makhomed gmm at csdoc.com
Sat Sep 6 13:00:07 UTC 2014


On 06.09.2014 14:01, Vadim A. Misbakh-Soloviov wrote:

>> если я 2 раза (или 1 раз) укажу spdy - работать будет всегда в двух
>> случаях и ошибки конфигурации не будет.
>> кажется, что с фильтрами подобная логика была бы уместна.
>>
>> ну и, раз уж оно все равно работает во всех случаях, вероятно, имеет
>> смысл выдавать warning, если указано не во всех (вдруг кто-то будет
>> полагать, что в одном месте у него spdy, а в другом нет).

Да, это было бы вполне логично. Иначе - зачем давать юзеру возможность
выборочно не-указывать параметр spdy, если он всеравно применится везде.

То же самое относится и к параметру ssl - хотя и "listen 1.2.3.4:443;"
в конфиге, но соединения всеравно принимаются только по протоколу https.

> Обычно это делается так:
> в дефолтном catch-all вхосте указываются все эти уникальные опции (которые
> указываются один раз), а у остальных — неуникальные.

Только из документации совсем не понятно, какие из параметров listen
являются уникальными для сервера, а какие - общими для всех серверов.

Похоже, что только опция default_server является специфичной
для сервера, а все остальные - и так общие для всех серверов будут.

| В директиве listen можно также указать несколько дополнительных
| параметров, специфичных для связанных с сокетами системных вызовов.
| Эти параметры можно задать в любой директиве listen, но только один
| раз для указанной пары адрес:порт.

Что только еще больше добавляет путаницы. Прописали параметр
в каком-то одном случайном сервере - а применяется этот параметр
потом во всех серверах с такой же комбинацией ip:port в listen.

Идеальным вариантом с точки зрения легкости чтения/сопровождения
конфига было бы требовать наличия параметра default_server всегда,
если в конфиге присутствует более одного сервера на каком-то сокете.

И все параметры, которые можно задать только один раз - можно задать
только в том единственном сервере, который помечен как default_server,
а общие параметры ssl, spdy и proxy_protocol должны быть указаны
в каждом сервере или ни в одном из них. Если эти условия
не выполняются - тогда пользователю выдается warning.

В результате чтобы понять как работает тот или иной сервер -
надо будет прочитать в конфиге определения максимум двух серверов.

Обратная совместимость не теряется, потому что это только warning,
который не блокирует работу сервера со старой версией конфигурации.

Сейчас - надо просмотреть определения вообще всех серверов на этом
сокете и в случае неочевидной конфигурации - никаких варнингов нет.

-- 
Best regards,
  Gena



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