comparison xml/ru/docs/http/server_names.xml @ 645:bb450e295ca2

Translated "Server names" into Russian and slightly changed original layout.
author Vladimir Homutov <vl@nginx.com>
date Fri, 17 Aug 2012 07:15:00 +0000
parents
children 00972444baa7
comparison
equal deleted inserted replaced
644:b4d15f1c7c06 645:bb450e295ca2
1 <!--
2 Copyright (C) Igor Sysoev
3 Copyright (C) Nginx, Inc.
4 -->
5
6 <!DOCTYPE article SYSTEM "../../../../dtd/article.dtd">
7
8 <article name="Имена сервера"
9 link="/ru/docs/http/server_names.html"
10 lang="ru"
11 rev="2"
12 author="Игорь Сысоев"
13 editor="Brian Mercer">
14
15
16 <section>
17
18 <para>
19 Имена сервера задаются с помощью директивы
20 <link doc="ngx_http_core_module.xml" id="server_name"/>
21 и определяют, в каком блоке <link doc="ngx_http_core_module.xml" id="server"/>
22 будет обрабатываться тот или иной запрос.
23 См. также “<link doc="request_processing.xml"/>”.
24 Имена могут быть заданы точно, с помощью маски или регулярного
25 выражения:
26
27 <programlisting>
28 server {
29 listen 80;
30 server_name example.org www.example.org;
31 ...
32 }
33
34 server {
35 listen 80;
36 server_name *.example.org;
37 ...
38 }
39
40 server {
41 listen 80;
42 server_name mail.*;
43 ...
44 }
45
46 server {
47 listen 80;
48 server_name ~^(?&lt;user&gt;.+)\.example\.net$;
49 ...
50 }
51 </programlisting>
52 </para>
53
54 <para>
55 При поиске виртуального сервера по имени,
56 если имени соответствует несколько из указанных вариантов,
57 например, одновременно подходят и имя с маской, и регулярное выражение,
58 будет выбран первый подходящий вариант в следующем порядке приоритета:
59 <list type="enum">
60
61 <listitem>
62 точное имя
63 </listitem>
64
65 <listitem>
66 самое длинное имя с маской в начале, например
67 “<literal>*.example.org</literal>”
68 </listitem>
69
70 <listitem>
71 самое длинное имя с маской в конце, например “<literal>mail.*</literal>”
72 </listitem>
73
74 <listitem>
75 первое подходящее регулярное выражение
76 (в порядке следования в конфигурационном файле)
77 </listitem>
78
79 </list>
80 </para>
81
82 </section>
83
84
85 <section id="wildcard_names"
86 name="Имена с масками">
87
88 <para>
89 Имя с маской может содержать звёздочку (“<literal>*</literal>”) только в начале
90 или в конце имени, и только на границе, определяемой точкой.
91 Имена “<literal>www.*.example.org</literal>” и
92 “<literal>w*.example.org</literal>” являются некорректными,
93 но их можно задать с помощью регулярных выражений,
94 например, “<literal>~^www\..+\.example\.org$</literal>” и
95 “<literal>~^w.*\.example\.org$</literal>”.
96 Звёздочка может соответствовать нескольким частям имени.
97 Имени с маской “<literal>*.example.org</literal>” соответствует не только
98 <literal>www.example.org</literal>, но и
99 <literal>www.sub.example.org</literal>.
100 </para>
101
102 <para>
103 Специальное имя с маской вида “<literal>.example.org</literal>”
104 соответствует как точному имени “<literal>example.org</literal>”,
105 так и маске “<literal>*.example.org</literal>”.
106 </para>
107
108 </section>
109
110
111 <section id="regex_names"
112 name="Имена, заданные регулярными выражениями">
113
114 <para>
115 Регулярные выражения, используемые в nginx, совместимы
116 с используемыми в языке программирования Perl (PCRE).
117 Имя сервера, заданное регулярным выражением,
118 должно начинаться с символа тильды:
119
120 <programlisting>
121 server_name ~^www\d+\.example\.net$;
122 </programlisting>
123
124 в противном случае оно будет рассматриваться как точное, или же, если
125 выражение содержит звёздочку (“<literal>*</literal>”), то как имя с маской
126 (и, скорее всего, некорректное).
127 Не забывайте ставить специальные символы начала (“<literal>^</literal>”)
128 и конца (“<literal>$</literal>”) строки.
129 По синтаксису они не требуются, но логически они могут быть нужны.
130 Также заметьте, что все точки в доменных именах должны быть экранированы
131 символом обратной косой черты.
132 Регулярное выражение, содержащее символы “<literal>{</literal>”
133 и “<literal>}</literal>”, необходимо экранировать:
134
135 <programlisting>
136 server_name "~^(?&lt;name&gt;\w\d<b>{</b>1,3<b>}</b>+)\.example\.net$";
137 </programlisting>
138
139 иначе nginx откажется запускаться и выдаст сообщение об ошибке:
140
141 <programlisting>
142 directive "server_name" is not terminated by ";" in ...
143 </programlisting>
144
145 К именованному выделению в регулярном выражении можно впоследствии
146 обратиться через переменную:
147
148 <programlisting>
149 server {
150 server_name ~^(www\.)?(<b>?&lt;domain&gt;</b>.+)$;
151
152 location / {
153 root /sites/<b>$domain</b>;
154 }
155 }
156 </programlisting>
157
158 Библиотека PCRE поддерживает именованные выделения, используя следующий
159 синтаксис:
160
161 <table note="yes">
162
163 <tr>
164 <td><literal>?&lt;<value>name</value>&gt;</literal></td>
165 <td>Совместимый с Perl 5.10 синтаксис, поддерживается начиная с PCRE-7.0</td>
166 </tr>
167
168 <tr>
169 <td><literal>?'<value>name</value>'</literal></td>
170 <td>Совместимый с Perl 5.10 синтаксис, поддерживается начиная с PCRE-7.0</td>
171 </tr>
172
173 <tr>
174 <td><literal>?P&lt;<value>name</value>&gt;</literal></td>
175 <td>Python-совместимый синтаксис, поддерживается начиная с PCRE-4.0</td>
176 </tr>
177
178 </table>
179
180 Если nginx отказывается запускаться и выдаёт сообщение об ошибке:
181
182 <programlisting>
183 pcre_compile() failed: unrecognized character after (?&lt; in ...
184 </programlisting>
185
186 то это значит, что используется старая версия библиотеки PCRE и следует
187 вместо этого попробовать синтаксис
188 “<literal>?P&lt;<value>name</value>&gt;</literal>”.
189 Также можно использовать нумерованные выделения:
190
191 <programlisting>
192 server {
193 server_name ~^(www\.)?(.+)$;
194
195 location / {
196 root /sites/<b>$2</b>;
197 }
198 }
199 </programlisting>
200
201 Однако такое использование должно ограничиваться простыми случаями как в
202 примере выше, поскольку нумерованные выделения легко могут быть перезаписаны.
203 </para>
204
205
206 </section>
207
208
209 <section id="miscellaneous_names"
210 name="Прочие имена">
211
212 <para>
213 Некоторые имена имеют специальное значение.
214 </para>
215
216 <para>
217 Если необходимо обрабатывать запросы без поля <header>Host</header> в заголовке
218 в блоке <link doc="ngx_http_core_module.xml" id="server"/>, который не
219 является сервером по умолчанию, следует указать пустое имя:
220
221 <programlisting>
222 server {
223 listen 80;
224 server_name example.org www.example.org "";
225 ...
226 }
227 </programlisting>
228 </para>
229
230 <para>
231 Если директива
232 <link doc="ngx_http_core_module.xml" id="server_name"/>
233 не задана в блоке <link doc="ngx_http_core_module.xml" id="server"/>,
234 то nginx будет использовать пустое имя в качестве имени сервера.
235 <note>
236 Версии nginx вплоть до 0.8.48 в этом случае использовали имя хоста (hostname)
237 машины в качестве имени сервера.
238 </note>
239 </para>
240
241 <para>
242 Если имя сервера задано как “<literal>$hostname</literal>” (0.9.4), то
243 используется имя хоста (hostname) машины.
244 </para>
245
246 <para>
247 Если в запросе вместо имени сервера указан IP-адрес,
248 то поле <header>Host</header> заголовка запроса будет содержать
249 IP-адрес, и запрос можно обработать, используя IP-адрес как имя сервера:
250
251 <programlisting>
252 server {
253 listen 80;
254 server_name example.org
255 www.example.org
256 ""
257 <b>192.168.1.1</b>
258 ;
259 ...
260 }
261 </programlisting>
262 </para>
263
264 <para>
265 В примерах конфигурации серверов, обрабатывающих все запросы, встречается
266 странное имя “<literal>_</literal>”:
267
268 <programlisting>
269 server {
270 listen 80 default_server;
271 server_name _;
272 return 444;
273 }
274 </programlisting>
275
276 Оно не является каким-то особенным, это просто одно из множества
277 некорректных доменных имён, которые никогда не пересекутся ни с одним из
278 реальных имён.
279 С тем же успехом можно использовать имена типа “<literal>--</literal>”
280 и “<literal>!@#</literal>”.
281 </para>
282
283 <para>
284 Версии nginx вплоть до 0.6.25 поддерживали специальное имя
285 “<literal>*</literal>”, которое многими неверно воспринималось как
286 имя сервера для обработки всех запросов.
287 Оно никогда так не работало, и не работало как имя с маской.
288 Это имя действовало так же, как сейчас действует директива
289 <link doc="ngx_http_core_module.xml" id="server_name_in_redirect"/>.
290 Специальное имя “<literal>*</literal>” объявлено устаревшим, а вместо него
291 следует использовать директиву
292 <link doc="ngx_http_core_module.xml" id="server_name_in_redirect"/>.
293 Заметьте, что с помощью директивы
294 <link doc="ngx_http_core_module.xml" id="server_name"/>
295 нельзя задать ни имя сервера для обработки всех запросов,
296 ни сервер по умолчанию.
297 Это является свойством директивы
298 <link doc="ngx_http_core_module.xml" id="listen"/>,
299 а не
300 <link doc="ngx_http_core_module.xml" id="server_name"/>.
301 См. также “<link doc="request_processing.xml"/>”.
302 Можно настроить серверы, слушающие на портах *:80 и *:8080,
303 и указать, что один из них будет сервером по умолчанию для порта *:8080,
304 а другой - для порта *:80:
305 <programlisting>
306 server {
307 listen 80;
308 listen 8080 default_server;
309 server_name example.net;
310 ...
311 }
312
313 server {
314 listen 80 default_server;
315 listen 8080;
316 server_name example.org;
317 ...
318 }
319 </programlisting>
320 </para>
321
322
323 </section>
324
325
326 <section id="optimization"
327 name="Оптимизация">
328
329 <para>
330 Точные имена, имена с масками, начинающиеся со звёздочки,
331 и имена с масками, заканчивающиеся на звёздочку, хранятся
332 в трёх хэш-таблицах, привязанных к слушающим портам.
333 Размеры хэш-таблиц оптимизируются на фазе конфигурации таким образом,
334 что имя может быть найдено с минимальным числом непопаданий в кэш процессора.
335 См. также “<link doc="../hash.xml"/>”.
336 </para>
337
338 <para>
339 В первую очередь имя ищется в хэш-таблице точных имён.
340 Если имя не было найдено, то имя ищется в хэш-таблице имён с масками,
341 начинающихся со звёздочки.
342 Если и там поиск не дал результата, то имя ищется в хэш-таблице имён с масками,
343 оканчивающихся на звёздочку.
344 </para>
345
346 <para>
347 Поиск в хэш-таблице имён с масками медленнее, чем поиск в хэш-таблице точных
348 имён, поскольку имена сравниваются по доменным частям.
349 Заметьте, что специальное имя с маской вида “<literal>.example.org</literal>”
350 хранится в хэш-таблице имён с масками, а не в хэш-таблице точных имён.
351 </para>
352
353 <para>
354 Регулярные выражения проверяются последовательно,
355 а значит являются самым медленным и плохо масштабируемым методом.
356 </para>
357
358 <para>
359 По вышеизложенным причинам предпочтительнее использовать точные имена,
360 где это только возможно.
361 Например, если к серверу наиболее часто обращаются по именам
362 <literal>example.org</literal> и <literal>www.example.org</literal>,
363 то эффективнее будет указать их явно:
364
365 <programlisting>
366 server {
367 listen 80;
368 server_name example.org www.example.org *.example.org;
369 ...
370 }
371 </programlisting>
372
373 нежели чем использовать упрощённую форму:
374
375 <programlisting>
376 server {
377 listen 80;
378 server_name .example.org;
379 ...
380 }
381 </programlisting>
382 </para>
383
384 <para>
385 Если задано большое число имён серверов, либо заданы необычно
386 длинные имена, возможно потребуется скорректировать значения директив
387 <link doc="ngx_http_core_module.xml" id="server_names_hash_max_size"/>
388 и <link doc="ngx_http_core_module.xml" id="server_names_hash_bucket_size"/>
389 на уровне <i>http</i>.
390 Значение по умолчанию директивы
391 <link doc="ngx_http_core_module.xml" id="server_names_hash_bucket_size"/>
392 может быть равно 32, 64, либо другой величине,
393 в зависимости от размера строки кэша процессора.
394 Если значение по умолчанию равно 32 и имя сервера задано как
395 “<literal>too.long.server.name.example.org</literal>”,
396 то nginx откажется запускаться и выдаст сообщение об ошибке:
397
398 <programlisting>
399 could not build the server_names_hash,
400 you should increase server_names_hash_bucket_size: 32
401 </programlisting>
402
403 В этом случае следует увеличить значение директивы до следующей степени двойки:
404
405 <programlisting>
406 http {
407 server_names_hash_bucket_size 64;
408 ...
409 </programlisting>
410
411 Если задано большое число имён серверов, то будет выдано другое
412 сообщение об ошибке:
413
414 <programlisting>
415 could not build the server_names_hash,
416 you should increase either server_names_hash_max_size: 512
417 or server_names_hash_bucket_size: 32
418 </programlisting>
419
420 В таком случае сначала следует попробовать установить
421 <link doc="ngx_http_core_module.xml" id="server_names_hash_max_size"/>
422 в величину, близкую к числу имён серверов,
423 и только если это не поможет
424 или время запуска nginx станет неприемлемо большим, следует попытаться увеличить
425 <link doc="ngx_http_core_module.xml" id="server_names_hash_bucket_size"/>.
426 </para>
427
428 <para>
429 Если сервер является единственным сервером для слушающего порта,
430 то nginx не будет проверять имена сервера вообще (а также не будет
431 строить хэш-таблицы для слушающего порта).
432 За одним исключением: если имя сервера задано регулярным выражением
433 с выделениями, то nginx’у придётся выполнить это выражение,
434 чтобы получить значения выделений.
435 </para>
436
437 </section>
438
439
440 <section id="compatibility"
441 name="Совместимость">
442
443 <para>
444 <list type="bullet">
445
446 <listitem>
447 Специальное имя сервера “<literal>$hostname</literal>” поддерживается начиная с
448 версии 0.9.4.
449 </listitem>
450
451 <listitem>
452 Имя сервера по умолчанию является пустой строкой “” начиная с версии 0.8.48.
453 </listitem>
454
455 <listitem>
456 Именованные выделения в именах серверов, заданных с помощью регулярных
457 выражений, поддерживаются начиная с версии 0.8.25.
458 </listitem>
459
460 <listitem>
461 Выделения в именах серверов, заданных с помощью регулярных выражений,
462 поддерживаются начиная с версии 0.7.40.
463 </listitem>
464
465 <listitem>
466 Пустое имя сервера “” поддерживается начиная с версии 0.7.12.
467 </listitem>
468
469 <listitem>
470 В качестве первого имени сервера можно задать маску или регулярное выражение
471 начиная с версии 0.6.25.
472 </listitem>
473
474 <listitem>
475 Регулярные выражения в имени сервера поддерживаются начиная с версии 0.6.7.
476 </listitem>
477
478 <listitem>
479 Имена с маской вида <literal>example.*</literal> поддерживаются начиная
480 с версии 0.6.0.
481 </listitem>
482
483 <listitem>
484 Специальная форма имени вида <literal>.example.org</literal> поддерживается
485 начиная с версии 0.3.18.
486 </listitem>
487
488 <listitem>
489 Имена с маской вида <literal>*.example.org</literal> поддерживаются начиная
490 с версии 0.1.13.
491 </listitem>
492
493 </list>
494 </para>
495
496 </section>
497
498 </article>