Mercurial > hg > nginx-site
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 ~^(?<user>.+)\.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 "~^(?<name>\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>?<domain></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>?<<value>name</value>></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<<value>name</value>></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 (?< in ... | |
184 </programlisting> | |
185 | |
186 то это значит, что используется старая версия библиотеки PCRE и следует | |
187 вместо этого попробовать синтаксис | |
188 “<literal>?P<<value>name</value>></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> |