location /
Gena Makhomed
gmm на csdoc.com
Пн Окт 10 12:31:43 UTC 2011
On 09.10.2011 23:18, Maxim Dounin wrote:
> Вопрос исключительно в том, хочется ли тому, кто пишет
> конфиг, разбираться в том, как именно поймёт nginx написанное.
это необходимое условие для того, чтобы nginx
на веб-сервере работал предсказуемым образом.
потому что если тот кто пишет конфиг, станет понимать его одним
способом, а nginx другим - то ничего хорошего из этого не будет.
>>> server {
>>> rewrite ^(.*) /prefix$1;
>>> }
>> происходит зацикливание rewrite or internal redirection
>> cycle while processing "/prefix/prefix/prefix/prefix/prefix/prefix/..."
> И причина, в общем-то, очевидна - если знать нюансы. В первом
> конфиге на самом деле написано нечто вроде:
>
> server {
> rewrite ^(.*) /prefix$1;
>
> location / {
> rewrite ^(.*) /prefix$1;
> }
> }
>
> И по понятным причинам будет цикл.
т.е. если в конфиге явно не указан location / { ... }
nginx просто самостоятельно сделает неявный location / { ... }
поместив в него все директивы, которые есь внутри server { ... }
и которые могут находиться внутри директивы location / { ... } ?
и насколько я понимаю, это единственное недокументированное
поведение, если в конфиге явно не будет указан location / ?
кстати, а почему нельзя в случае отсутствия location /
сделать пустой location / {} в который будут наследоваться
необходимые директивы с верхних уровней, например, root и т.п.
тогда например, глюка с зацикливанием rewrite не будет...
(и вообще никаких глюков и "сюрпризов" тогда не будет, AFAIU)
я раньше предполагал что в таком случае создается пустой location / {}
по крайней мере, это было бы ожидаемым поведением, - "без сюрпризов".
("the principle of least surprise", как в языках программирования)
...
>> так же как желательно будет делать и server-по-умолчанию, куда будут
>> попадать все запросы, для которых нет более специфичного server`а.
> Сервер по умолчанию - всегда есть, это первый описанный сервер на
> данном сокете. Если используется debian и производные с их
> "include *" - то да, имеет смысл описать его явно.
не только Debian. например, на сайте http://nginx.org/packages/
лежат пакеты для RHEL и CentOS, в конфиге которых также написано
include /etc/nginx/conf.d/*.conf;
это было сделано, насколько я понимаю, по аналогии с apache,
потому что в дефолтовом конфиге апача в CentOS также указано
Include conf.d/*.conf
но тут есть и одно очень существенное отличие,
о котором говорится в /etc/httpd/conf.d/README
"Files are processed in alphabetical order",
в случае же nginx - ни в документации,
ни в conf.d/README, ни в исходниках
не написано, что включаемые файлы
обрабатываются in alphabetical order.
GLOB_NOSORT в исходниках nginx стоит ради производительности,
потому что через include включаться могут и сотни тысяч файлов.
поэтому - явно указывать default_server в конфигах необходимо всегда,
тем более, что в дефолтовом server`е обычно всегда стоит "return 444"
$ cat /etc/nginx/conf.d/default-server
#
# default-server
#
server {
listen 11.11.11.11:80 default_server backlog=1024;
listen 22.22.22.22:80 default_server backlog=1024;
listen 33.33.33.33:80 default_server backlog=1024;
listen 44.44.44.44:80 default_server backlog=1024;
return 444;
}
то, что для nginx "Сервер по умолчанию - всегда есть" - это понятно.
так же как и location по умолчанию == 'location /' тоже всегда есть.
но вот "Сервер по умолчанию" с точки зрения nginx может оказаться
совсем не таким, как его себе представляет тот, кто пишет конфиг.
P.S.
насколько я понимаю, сейчас практически во всех дистрибутивах
уже применяется технология "include /etc/nginx/conf.d/*.conf;"
чтобы можно было сделать "1 virtual host == 1 configuration file".
и можно было бы легко disab`лить virtual host`ы, просто переименовывая
конфиг или перемещая его в другой каталог, например, в ./sites-disabled
--
Best regards,
Gena
Подробная информация о списке рассылки nginx-ru