Mercurial > hg > nginx-site
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&page=1 +/index.php?page=1&user=john +</programlisting> +Кроме того, в строке запроса можно запросить что угодно: +<programlisting> +/index.php?page=1&something+else&user=john +</programlisting> + +</para> + +<para> +Теперь посмотрим, как бы обрабатывались запросы +в вышеприведённой конфигурации: +<list type="bullet" compact="no"> + +<listitem> +Запросу “<literal>/logo.gif</literal>” во-первых соответствует префиксный +location “<literal>/</literal>”, а во-вторых—регулярное выражение +“<literal>\.(gif|jpg|png)$</literal>”, +поэтому он обрабатывается location’ом регулярного выражения. +Согласно директиве “<literal>root /data/www</literal>” запрос +отображается в файл <path>/data/www/logo.gif</path>, который +и посылается клиенту. +</listitem> + +<listitem> +Запросу “<literal>/index.php</literal>” также во-первых соответствует префиксный +location “<literal>/</literal>”, а во-вторых—регулярное выражение +“<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>