Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
nginx
GitHub Repository: nginx/nginx.org
Path: blob/main/xml/ja/docs/http/request_processing.xml
1 views
1
<!DOCTYPE article SYSTEM "../../../../dtd/article.dtd">
2
3
<article name="nginx はどのようにリクエストを処理するか"
4
link="/ja/docs/http/request_processing.html"
5
lang="ja"
6
author="Igor Sysoev"
7
translator="DigitalCube Co. Ltd., wokamoto">
8
9
<section name="名前ベースの仮想サーバ">
10
11
<para>
12
nginx はまず最初にどの<i>サーバ</i>がそのリクエストを処理すべきなのかを決定します。手はじめに、3つすべての仮想サーバが port *:80 で待ち受けている単純な設定から見てみましょう:
13
14
<programlisting>
15
server {
16
listen 80;
17
server_name example.org www.example.org;
18
...
19
}
20
21
server {
22
listen 80;
23
server_name example.net www.example.net;
24
...
25
}
26
27
server {
28
listen 80;
29
server_name example.com www.example.com;
30
...
31
}
32
</programlisting>
33
</para>
34
35
<para>
36
この設定では nginx は、(ブラウザからの)HTTP リクエストの &ldquo;Host&rdquo; ヘッダだけを考査して、そのリクエストをどのサーバに振り向けるべきかを決定します。もし &ldquo;Host&rdquo; ヘッダがどのサーバ名ともマッチしない場合、またはリクエストにこのフィールドがまったく含まれていない場合は、nginxはこのリクエストをデフォルトサーバに振り向けます。上記の設定ではデフォルトサーバは最初のもので、これは nginx の標準的なデフォルトの挙動です。設定内の最初のサーバをデフォルトサーバにしたくない場合は、<literal>listen</literal> ディレクティブに <literal>default_server</literal> パラメータを使って明示的に設定することができます:
37
38
<programlisting>
39
server {
40
listen 80 <b>default_server</b>;
41
server_name example.net www.example.net;
42
...
43
}
44
</programlisting>
45
46
<note>
47
この <literal>default_server</literal> パラメータはバージョン 0.8.21 以上で利用できます。それ以前のバージョンでは代わりに <literal>default</literal> パラメータを使用してください。
48
</note>
49
50
このデフォルトサーバは <literal>listen</literal> ディレクティブのプロパティで、<literal>server_name</literal> ディレクティブのプロパティではないことに注意してください。詳細は後述します。
51
</para>
52
53
</section>
54
55
56
<section id="how_to_prevent_undefined_server_names"
57
name="サーバ名未定義のリクエストの処理を防ぐ">
58
59
<para>
60
&ldquo;Host&rdquo; ヘッダが未定義のリクエストを処理させたくない場合は、リクエストを単にドロップさせるデフォルトサーバを設定できます:
61
62
<programlisting>
63
server {
64
listen 80 default_server;
65
server_name _;
66
return 444;
67
}
68
</programlisting>
69
70
ここでは存在しないドメイン名 “_” をサーバ名として選択し、接続を閉じる nginx の特別な標準外コード 444 を返します。このサーバ用にサーバ名を設定しなければならないことに注意してください。さもなければ nginx は<i>ホスト名</i>を使用します。
71
</para>
72
73
</section>
74
75
76
<section id="mixed_name_ip_based_servers"
77
name="名前ベースとIPベースをミックスした仮想サーバ">
78
79
<para>
80
異なるアドレスで待ち受けている仮想サーバのより複雑な設定をみてみましょう:
81
82
<programlisting>
83
server {
84
listen 192.168.1.1:80;
85
server_name example.org www.example.org;
86
...
87
}
88
89
server {
90
listen 192.168.1.1:80;
91
server_name example.net www.example.net;
92
...
93
}
94
95
server {
96
listen 192.168.1.2:80;
97
server_name example.com www.example.com;
98
...
99
}
100
</programlisting>
101
102
この設定では、nginx はまず最初に <literal>server</literal> ブロックの <literal>listen</literal> ディレクティブに対してリクエストの IP アドレスとポートを考査します。次に、その IP アドレスとポートにマッチする <literal>server</literal> ブロックの <literal>server_name</literal> ディレクティブに対して、その HTTP リクエストの &ldquo;Host&rdquo; ヘッダを考査します。
103
104
もしサーバ名が見つからなければ、そのリクエストはデフォルトサーバによって処理されます。例えば、192.168.1.1:80 ポートで受信された <literal>www.example.com</literal> へのリクエストは 192.168.1.1:80 ポートのデフォルトサーバ、つまり最初のサーバで処理されます。これはこのポートでは <literal>www.example.com</literal> は定義されていないからです。
105
</para>
106
107
<para>
108
すでに述べたように、デフォルトサーバは <literal>listen</literal> ディレクティブのプロパティで、別の <literal>listen</literal> ディレクティブには別のデフォルトサーバが定義されています:
109
110
<programlisting>
111
server {
112
listen 192.168.1.1:80;
113
server_name example.org www.example.org;
114
...
115
}
116
117
server {
118
listen 192.168.1.1:80 default_server;
119
server_name example.net www.example.net;
120
...
121
}
122
123
server {
124
listen 192.168.1.2:80 default_server;
125
server_name example.com www.example.com;
126
...
127
}
128
</programlisting>
129
</para>
130
131
</section>
132
133
134
<section id="simple_php_site_configuration"
135
name="単純な PHP サイトの設定">
136
137
<para>
138
では、典型的で単純な PHP サイトで nginx がどのように<i>ロケーション(location)</i>を選択してリクエストを処理するのかを見てみましょう:
139
140
<programlisting>
141
server {
142
listen 80;
143
server_name example.org www.example.org;
144
root /data/www;
145
146
location / {
147
index index.html index.php;
148
}
149
150
location ~* \.(gif|jpg|png)$ {
151
expires 30d;
152
}
153
154
location ~ \.php$ {
155
fastcgi_pass localhost:9000;
156
fastcgi_param SCRIPT_FILENAME
157
$document_root$fastcgi_script_name;
158
include fastcgi_params;
159
}
160
}
161
</programlisting>
162
</para>
163
164
<para>
165
nginx はまず最初に、リストの順序には関係なくリテラルな文字列によって指定されているもっとも限定されたロケーションを検索します。上記の設定では唯一のリテラルなロケーションは <path>/</path> であり、したがってどのリクエストでもマッチして最終的にこのロケーションが使われます。次に nginx は、設定ファイルにリストされている順番で正規表現によって指定されているロケーションをチェックします。最初にマッチした正規表現で検索はストップし、 nginx そのロケーションを使用します。もしどの正規表現もリクエストにマッチしない場合は、nginx はその前に見つかったもっとも限定されたリテラルなロケーションを使用します。
166
</para>
167
168
<para>
169
すべてのタイプのロケーションはクエリー部分を除いたリクエスト URI 部分のみを考査することに注意してください。これはクエリー文字列の引数がいろいろな方法で渡されることがあるためです。例えば:
170
171
<programlisting>
172
/index.php?user=john&amp;page=1
173
/index.php?page=1&amp;user=john
174
</programlisting>
175
176
さらに、クエリー文字列ではどのようなリクエストでも可能だからです:
177
178
<programlisting>
179
/index.php?page=1&amp;something+else&amp;user=john
180
</programlisting>
181
</para>
182
183
<para>
184
では、上記の設定ではどのようにリクエストが処理されるのかを見てみましょう:
185
186
<list type="bullet">
187
188
<listitem>
189
<para>
190
リクエスト <path>/logo.gif</path> はリテラルなロケーション <literal>/</literal> に最初にマッチし、次に正規表現 <literal>\.(gif|jpg|png)$</literal> にマッチするので、後者のロケーションによって処理されます。 このリクエストは <literal>root&nbsp;/data/www</literal> ディレクティブを使用してファイル <path>/data/www/logo.gif</path> にマップされ、このファイルがクライアントに送られます。
191
</para>
192
</listitem>
193
194
<listitem>
195
<para>
196
リクエスト <path>/index.php</path> もまたリテラルなロケーション <literal>/</literal> に最初にマッチし、次に正規表現 <literal>\.(php)$</literal> にマッチします。したがって、このリクエストは後者のロケーションによって処理され、localhost:9000 で待ち受けている FastCGI サーバに渡されます。<literal>fastcgi_param</literal> ディレクティブは FastCGI のパラメータ SCRIPT_FILENAME を <path>/data/www/index.php</path> にセットし、この FastCGI サーバがこのファイルを実行します。変数 $document_root は <literal>root</literal> ディレクティブの値と同等で、変数 $fastcgi_script_name はリクエスト URI、例えば <path>/index.php</path> と同等です。
197
</para>
198
</listitem>
199
200
<listitem>
201
<para>
202
リクエスト <path>/about.html</path> はリテラルなロケーション <literal>/</literal> のみにマッチします。したがってこのロケーションで処理されます。このリクエストは <literal>root</literal> ディレクティブのパラメータ <literal>/data/www</literal> を使い、ファイル <path>/data/www/about.html</path> にマップされ、クライアントに送られます。
203
</para>
204
</listitem>
205
206
<listitem>
207
<para>
208
リクエスト <path>/</path> の処理はより複雑です。これはリテラルなロケーション <literal>/</literal> のみにマッチし、このロケーションで処理されます。ついで <literal>index</literal> ディレクティブがパラメータと <literal>root</literal> ディレクティブのパラメータ <literal>/data/www</literal> にしたがって index ファイルが存在するかどうかを考査します。もし <path>/data/www/index.php</path> ファイル存在すればこのディレクティブは <path>/index.php</path> への内部リダイレクトを実行し、nginx はまるでこのリクエストがクライアントに送られたかのようにこのロケーションを再び検索します。先に見たように、リダイレクトされたリクエストは最終的に FastCGI サーバで処理されます。
209
</para>
210
</listitem>
211
212
</list>
213
</para>
214
215
</section>
216
217
</article>
218
219