changeset 522:ef11546f75ee

Translated "request_processing" into Russian, removed "virtual_hosts" (which was a partly obsolete subset of "request_processing"), added Russian introduction.
author Ruslan Ermilov <ru@nginx.com>
date Thu, 24 May 2012 12:39:04 +0000
parents 3481a91d46ab
children a8daad8e83bb
files xml/en/docs/http/ngx_http_core_module.xml xml/en/index.xml xml/menu.xml xml/ru/GNUmakefile xml/ru/docs/http/ngx_http_core_module.xml xml/ru/docs/http/request_processing.xml xml/ru/docs/index.xml xml/ru/docs/introduction.xml xml/ru/docs/virtual_hosts.xml xml/ru/index.xml
diffstat 10 files changed, 350 insertions(+), 82 deletions(-) [+]
line wrap: on
line diff
--- a/xml/en/docs/http/ngx_http_core_module.xml
+++ b/xml/en/docs/http/ngx_http_core_module.xml
@@ -2059,9 +2059,8 @@ virtual servers.
 Instead, the <link id="listen"/> directives describe all
 addresses and ports that should accept connections for a server, and the
 <link id="server_name"/> directive lists all server names.
-An example configuration is provided in the
-<link doc="../virtual_hosts.xml">
-Setting Up Virtual Servers</link> document.
+Example configurations are provided in the
+“<link doc="request_processing.xml"/>” document.
 </para>
 
 </directive>
--- a/xml/en/index.xml
+++ b/xml/en/index.xml
@@ -94,7 +94,8 @@ TLS SNI support</link>.
 <list type="bullet">
 
 <listitem>
-Name-based and IP-based virtual servers;
+Name-based and IP-based
+<link doc="docs/http/request_processing.xml">virtual servers</link>;
 </listitem>
 
 <listitem>
--- a/xml/menu.xml
+++ b/xml/menu.xml
@@ -116,7 +116,7 @@
 <item href="/en/security_advisories.html" lang="en"> безопасность </item>
 <item href="/en/pgp_keys.html" lang="en"> pgp ключи </item>
 <item href="/ru/docs/"> документация </item>
-<item href="/en/docs/introduction.html" lang="en"> введение </item>
+<item href="/ru/docs/introduction.html"> введение </item>
 <item href="/ru/docs/howto.html"> howto </item>
 <item href="/ru/docs/faq.html"> faq </item>
 <item href="http://trac.nginx.org/nginx"> trac </item>
--- a/xml/ru/GNUmakefile
+++ b/xml/ru/GNUmakefile
@@ -1,6 +1,7 @@
 DOC_LANG =	ru
 
 DOCS =									\
+		introduction						\
 		howto							\
 		faq							\
 		install							\
@@ -9,7 +10,6 @@ DOCS =									\
 		syntax							\
 		example							\
 		switches						\
-		virtual_hosts						\
 		control							\
 		hash							\
 		dirindex						\
@@ -17,6 +17,12 @@ DOCS =									\
 DOCS_XML =	$(foreach name, $(DOCS), xml/$(DOC_LANG)/docs/$(name).xml)
 DOCS_HTML =	$(foreach name, $(DOCS), $(OUT)/$(DOC_LANG)/docs/$(name).html)
 
+INTRO =									\
+		http/request_processing					\
+
+INTRO_XML =	$(foreach name, $(INTRO), xml/$(DOC_LANG)/docs/$(name).xml)
+INTRO_HTML =	$(foreach name, $(INTRO), $(OUT)/$(DOC_LANG)/docs/$(name).html)
+
 HOWTO =									\
 		debugging_log						\
 
@@ -81,6 +87,7 @@ REFS_HTML =	$(foreach name, $(REFS), $(O
 		$(OUT)/$(DOC_LANG)/docs/index.html			\
 		$(DOCS_HTML)						\
 		$(REFS_HTML)						\
+		$(INTRO_HTML)						\
 		$(HOWTO_HTML)						\
 		$(FAQ_HTML)						\
 
@@ -103,6 +110,9 @@ xml/$(DOC_LANG)/docs/dirindex.xml:					\
 	xslt/dirindex.xslt - |						\
 	sed 's;xml/[^/]*/docs/;;g' > $@
 
+$(OUT)/$(DOC_LANG)/docs/introduction.html:				\
+		$(INTRO_XML)						\
+
 $(OUT)/$(DOC_LANG)/docs/howto.html:					\
 		$(HOWTO_XML)						\
 
--- a/xml/ru/docs/http/ngx_http_core_module.xml
+++ b/xml/ru/docs/http/ngx_http_core_module.xml
@@ -2044,9 +2044,8 @@ location / {
 Вместо этого директивами <link id="listen"/> описываются все
 адреса и порты, на которых нужно принимать соединения для этого сервера,
 а в директиве <link id="server_name"/> указываются все имена серверов.
-Пример конфигурации описан в документе по
-<link doc="../virtual_hosts.xml">
-настройке виртуальных серверов</link>.
+Примеры конфигураций описаны в документе
+“<link doc="request_processing.xml"/>”.
 </para>
 
 </directive>
new file mode 100644
--- /dev/null
+++ b/xml/ru/docs/http/request_processing.xml
@@ -0,0 +1,297 @@
+<!DOCTYPE article SYSTEM "../../../../dtd/article.dtd">
+
+<article name="Как nginx обрабатывает запросы"
+         link="/ru/docs/http/request_processing.html"
+         lang="ru"
+         author="Игорь Сысоев"
+         editor="Brian Mercer">
+
+<section name="Определение виртуального сервера по имени">
+
+<para>
+nginx вначале решает, какой из серверов должен обработать запрос.
+Рассмотрим простую конфигурацию,
+где все три виртуальных сервера слушают на порту *:80:
+<programlisting>
+server {
+    listen      80;
+    server_name example.org www.example.org;
+    ...
+}
+
+server {
+    listen      80;
+    server_name example.net www.example.net;
+    ...
+}
+
+server {
+    listen      80;
+    server_name example.com www.example.com;
+    ...
+}
+</programlisting>
+
+</para>
+
+<para>
+В этой конфигурации, чтобы определить, какому серверу следует направить
+запрос, nginx проверяет только поле <header>Host</header> заголовка запроса.
+Если его значение не соответствует ни одному из имён серверов
+или в заголовке запроса нет этого поля вовсе,
+nginx направит запрос в сервер по умолчанию для этого порта.
+В вышеприведённой конфигурации сервером по умолчанию будет первый сервер,
+что соответствует стандартному поведению nginx по умолчанию.
+Сервер по умолчанию можно задать явно с помощью параметра
+<literal>default_server</literal> в директиве
+<link doc="ngx_http_core_module.xml" id="listen"/>:
+<programlisting>
+server {
+    listen      80 <b>default_server</b>;
+    server_name example.net www.example.net;
+    ...
+}
+</programlisting>
+
+<note>
+Параметр <literal>default_server</literal> появился в
+версии 0.8.21.
+В более ранних версиях вместо него следует использовать параметр
+<literal>default</literal>.
+</note>
+Следует иметь в виду, что сервер по умолчанию является свойством
+слушающего порта, а не имени сервера.
+Подробнее это обсуждается ниже.
+</para>
+
+</section>
+
+
+<section id="how_to_prevent_undefined_server_names"
+         name="Как предотвратить обработку запросов без имени сервера">
+
+<para>
+Если запросы без поля <header>Host</header> в заголовке не должны
+обрабатываться, можно определить сервер, который будет их отклонять:
+<programlisting>
+server {
+    listen      80;
+    server_name "";
+    return      444;
+}
+</programlisting>
+Здесь в качестве имени сервера указана пустая строка, которая
+соответствует запросам без поля <header>Host</header> в заголовке,
+и возвращается специальный для nginx код 444, который закрывает
+соединение.
+<note>
+Начиная с версии 0.8.48 настройка <literal>server_name ""</literal>
+является стандартной и может явно не указываться.
+В более ранних версиях в качестве стандартного имени сервера
+выступало имя машины (hostname).
+</note>
+</para>
+
+</section>
+
+
+<section id="mixed_name_ip_based_servers"
+         name="Определение виртуального сервера по имени и IP-адресу">
+
+<para>
+Рассмотрим более сложную конфигурацию,
+в которой некоторые виртуальные серверы слушают на разных адресах:
+<programlisting>
+server {
+    listen      192.168.1.1:80;
+    server_name example.org www.example.org;
+    ...
+}
+
+server {
+    listen      192.168.1.1:80;
+    server_name example.net www.example.net;
+    ...
+}
+
+server {
+    listen      192.168.1.2:80;
+    server_name example.com www.example.com;
+    ...
+}
+</programlisting>
+В этой конфигурации nginx вначале сопоставляет IP-адрес и порт
+запроса с директивами
+<link doc="ngx_http_core_module.xml" id="listen"/>
+в блоках
+<link doc="ngx_http_core_module.xml" id="server"/>.
+Затем он сопоставляет значение поля <header>Host</header>
+заголовка запроса с директивами
+<link doc="ngx_http_core_module.xml" id="server_name"/>
+в блоках
+<link doc="ngx_http_core_module.xml" id="server"/>,
+которые соответствуют IP-адресу и порту.
+Если имя сервера не найдено, запрос будет обработан в
+сервере по умолчанию.
+Например, запрос <url>www.example.com</url>, пришедший на порт
+192.168.1.1:80, будет обработан сервером по умолчанию для порта
+192.168.1.1:80, т.е. первым сервером, т.к. для этого порта
+<url>www.example.com</url> не указан в списке имён серверов.
+</para>
+
+<para>
+Как уже говорилось, сервер по умолчанию является свойством слушающего порта,
+поэтому у разных портов могут быть определены свои серверы по умолчанию:
+<programlisting>
+server {
+    listen      192.168.1.1:80;
+    server_name example.org www.example.org;
+    ...
+}
+
+server {
+    listen      192.168.1.1:80 <b>default_server</b>;
+    server_name example.net www.example.net;
+    ...
+}
+
+server {
+    listen      192.168.1.2:80 <b>default_server</b>;
+    server_name example.com www.example.com;
+    ...
+}
+</programlisting>
+
+</para>
+
+</section>
+
+
+<section id="simple_php_site_configuration"
+         name="Конфигурация простого сайта PHP">
+
+<para>
+Теперь посмотрим на то, как nginx выбирает <i>location</i>
+для обработки запроса на примере обычного простого PHP-сайта:
+<programlisting>
+server {
+    listen      80;
+    server_name example.org www.example.org;
+    root        /data/www;
+
+    location / {
+        index   index.html index.php;
+    }
+
+    location ~* \.(gif|jpg|png)$ {
+        expires 30d;
+    }
+
+    location ~ \.php$ {
+        fastcgi_pass  localhost:9000;
+        fastcgi_param SCRIPT_FILENAME
+                      $document_root$fastcgi_script_name;
+        include       fastcgi_params;
+    }
+}
+</programlisting>
+
+</para>
+
+<para>
+nginx вначале ищет среди всех префиксных location’ов, заданных строками,
+максимально совпадающий.
+В вышеприведённой конфигурации
+указан только один префиксный location “<literal>/</literal>”, и поскольку
+он подходит под любой запрос, он и будет использован, если других
+совпадений не будет найдено.
+Затем nginx проверяет location’ы, заданные регулярными выражениями, в
+порядке их следования в конфигурационном файле.
+При первом же совпадении поиск прекращается и nginx использует
+совпавший location.
+Если запросу не соответствует ни одно из регулярных выражений,
+nginx использует максимально совпавший префиксный location,
+найденный ранее.
+</para>
+
+<para>
+Следует иметь в виду, что location’ы всех типов сопоставляются только с
+URI-частью строки запроса без аргументов.
+Так делается потому, что аргументы в строке запроса могут быть
+заданы различными способами, например:
+<programlisting>
+/index.php?user=john&amp;page=1
+/index.php?page=1&amp;user=john
+</programlisting>
+Кроме того, в строке запроса можно запросить что угодно:
+<programlisting>
+/index.php?page=1&amp;something+else&amp;user=john
+</programlisting>
+
+</para>
+
+<para>
+Теперь посмотрим, как бы обрабатывались запросы
+в вышеприведённой конфигурации:
+<list type="bullet" compact="no">
+
+<listitem>
+Запросу “<literal>/logo.gif</literal>” во-первых соответствует префиксный
+location “<literal>/</literal>”, а во-вторых&mdash;регулярное выражение
+“<literal>\.(gif|jpg|png)$</literal>”,
+поэтому он обрабатывается location’ом регулярного выражения.
+Согласно директиве “<literal>root&nbsp;/data/www</literal>” запрос
+отображается в файл <path>/data/www/logo.gif</path>, который
+и посылается клиенту.
+</listitem>
+
+<listitem>
+Запросу “<literal>/index.php</literal>” также во-первых соответствует префиксный
+location “<literal>/</literal>”, а во-вторых&mdash;регулярное выражение
+“<literal>\.(php)$</literal>”.
+Следовательно, он обрабатывается location’ом регулярного выражения
+и запрос передаётся FastCGI-серверу, слушающему на localhost:9000.
+Директива
+<link doc="ngx_http_fastcgi_module.xml" id="fastcgi_param"/>
+устанавливает FastCGI-параметр
+<literal>SCRIPT_FILENAME</literal> в “<literal>/data/www/index.php</literal>”,
+и сервер FastCGI выполняет указанный файл.
+Переменная <var>$document_root</var> равна
+значению директивы
+<link doc="ngx_http_core_module.xml" id="root"/>,
+а переменная <var>$fastcgi_script_name</var> равна
+URI запроса, т.е. “<literal>/index.php</literal>”.
+</listitem>
+
+<listitem>
+Запросу “<literal>/about.html</literal>” соответствует только префиксный
+location “<literal>/</literal>”, поэтому запрос обрабатывается в нём.
+Согласно директиве “<literal>root /data/www</literal>” запрос
+отображается в файл <path>/data/www/about.html</path>, который
+и посылается клиенту.
+</listitem>
+
+<listitem>
+Обработка запроса “<literal>/</literal>” более сложная.
+Ему соответствует только префиксный location “<literal>/</literal>”,
+поэтому запрос обрабатывается в нём.
+Затем директива
+<link doc="ngx_http_index_module.xml" id="index"/>
+проверяет существование индексных файлов согласно своих параметров
+и директиве “<literal>root /data/www</literal>”.
+Если файл <path>/data/www/index.html</path> не существует,
+а файл <path>/data/www/index.php</path> существует, то
+директива делает внутреннее перенаправление на “<literal>/index.php</literal>”
+и nginx снова сопоставляет его с location’ами,
+как если бы такой запрос был послан клиентом.
+Как мы видели ранее, перенаправленный запрос будет в конечном итоге
+обработан сервером FastCGI.
+</listitem>
+
+</list>
+
+</para>
+
+</section>
+
+</article>
--- a/xml/ru/docs/index.xml
+++ b/xml/ru/docs/index.xml
@@ -10,14 +10,10 @@
 <para>
 <list type="bullet">
 
-<!--
-
 <listitem>
 <link doc="introduction.xml"/>
 </listitem>
 
--->
-
 <listitem>
 <link doc="howto.xml"/>
 </listitem>
@@ -57,10 +53,6 @@
 </listitem>
 
 <listitem>
-<link doc="virtual_hosts.xml"/>
-</listitem>
-
-<listitem>
 <link doc="control.xml"/>
 </listitem>
 
new file mode 100644
--- /dev/null
+++ b/xml/ru/docs/introduction.xml
@@ -0,0 +1,34 @@
+<!DOCTYPE article SYSTEM "../../../dtd/article.dtd">
+
+<article name="Введение в nginx"
+         link="/ru/docs/introduction.html"
+         lang="ru">
+
+
+<section>
+
+<para>
+<list type="bullet">
+
+<listitem>
+<link doc="http/request_processing.xml"/>
+</listitem>
+
+<!--
+
+<listitem>
+<link doc="http/server_names.xml"/>
+</listitem>
+
+<listitem>
+<link doc="http/configuring_https_servers.xml"/>
+</listitem>
+
+-->
+
+</list>
+</para>
+
+</section>
+
+</article>
deleted file mode 100644
--- a/xml/ru/docs/virtual_hosts.xml
+++ /dev/null
@@ -1,64 +0,0 @@
-<!DOCTYPE article SYSTEM "../../../dtd/article.dtd">
-
-<article name="Настройка виртуальных серверов"
-         link="/ru/docs/virtual_hosts.html"
-         lang="ru">
-
-<section>
-
-<para>
-Настраивать виртуальные сервера очень просто. В каждом сервере нужно описать
-все адреса и порты, на которых нужно принимать соединения для этого сервера,
-и все имена серверов. Рассмотрим следующую конфигурацию:
-<programlisting>
-http {
-
-    server {
-        listen  192.168.10.1;
-        listen  192.168.10.1:8000;
-
-        server_name   one.example.com  www.one.example.com;
-
-        ...
-    }
-
-    server {
-        listen  192.168.10.1;
-        listen  192.168.10.2:8000;
-        listen  9000;
-
-        server_name   two.example.com  www.two.example.com
-                      three.example.com  www.three.example.com;
-
-        ...
-    }
-
-    server {
-        listen  9000;
-
-        server_name   four.example.com  www.four.example.com;
-
-        ...
-    }
-
-}
-</programlisting>
-</para>
-
-<para>
-При такой настройке запрос, пришедший на 192.168.10.1:80 с заголовком
-"Host: www.three.example.com", будет обслужен вторым сервером.
-Если в запросе нет заголовка "Host" или же в нём указано имя, неописанное
-ни в одном сервере, слушающем на адресе и порту, на которые пришёл запрос,
-то запрос будет обслужен сервером, у которого первым описаны эти адрес и порт.
-Например, все запросы без заголовка "Host", пришедшие на 9000 порт,
-будут обслужены вторым сервером (two.example.com).
-То же самое произойдёт и с запросом с заголовком "Host: www.one.example.com",
-пришедшим на 9000 порт.
-Для гибкой настройки серверов по умолчанию можно использовать параметр
-default в директиве listen.
-</para>
-
-</section>
-
-</article>
--- a/xml/ru/index.xml
+++ b/xml/ru/index.xml
@@ -97,7 +97,7 @@ chunked ответы,
 <list type="bullet">
 
 <listitem>
-<link doc="docs/virtual_hosts.xml">Виртуальные серверы</link>,
+<link doc="docs/http/request_processing.xml">Виртуальные серверы</link>,
 определяемые по IP-адресу и имени;
 </listitem>