11# nginx 如何处理请求
22
3+ - [ 基于名称的虚拟服务器] ( #基于名称的虚拟服务器 )
4+ - [ 如何使用未定义的server名称来阻止处理请求] ( #如何使用未定义的server名称来阻止处理请求 )
5+ - [ 一个简单的PHP站点配置] ( #一个简单的PHP站点配置 )
6+
37## 基于名称的虚拟服务器
48nginx 首先决定哪个 ` server ` 应该处理请求,让我们从一个简单的配置开始,三个虚拟服务器都监听了 ` *:80 ` 端口:
59
@@ -23,7 +27,7 @@ server {
2327}
2428```
2529
26- 在此配置中,nginx 仅检验请求的 header 域中的 ` Host ` ,以确定请求应该被路由到哪一个 ` server ` 。如果其值与任何的 ` server ` 名称不匹配,或者该请求根本不包含此 header 域,nginx 会将请求路由到该端口的默认 ` server ` 中。在上面的配置中,默认 ` server ` 是第一个(这是 nginx 的标准默认行为)。你也可以在 ` listen ` 指令中使用 ` default_server ` 参数,明确地设置默认的 ` server ` 。
30+ 在此配置中,nginx 仅检验请求的 header 域中的 ` Host ` ,以确定请求应该被路由到哪一个 ` server ` 。如果其值与任何的 ` server ` 名称不匹配,或者该请求根本不包含此 header 域,nginx 会将请求路由到该端口的默认 ` server ` 中。在上面的配置中,默认 ` server ` 是第一个(这是 nginx 的标准默认行为)。你也可以在 [ listen] ( http://nginx.org/en/docs/http/ngx_http_core_module.html#listen ) 指令中使用 ` default_server ` 参数,明确地设置默认的 ` server ` 。
2731
2832``` nginx
2933server {
@@ -37,7 +41,7 @@ server {
3741
3842请注意,` default_server ` 是 ` listen port ` 的属性,而不是 ` server_name ` 的。之后会有更多关于这方面的内容。
3943
40- ## 如何使用未定义的 server 名称来阻止处理请求
44+ ## 如何使用未定义的server名称来阻止处理请求
4145如果不允许没有 “Host” header 字段的请求,可以定义一个丢弃请求的 server:
4246
4347``` nginx
@@ -75,7 +79,7 @@ server {
7579}
7680```
7781
78- 此配置中,nginx 首先根据 ` server ` 块的 ` listen ` 指令检验请求的 IP 和端口。之后,根据与 IP 和端口相匹配的 ` server ` 块的 ` server_name ` 项对请求的“Host” header 域进行检验。如果找不到服务器的名称(server_name),请求将由 ` default_server ` 处理。例如,在 ` 192.168.1.1:80 ` 上收到的对 ` www.example.com ` 的请求将由 ` 192.168.1.1:80 ` 端口的 ` default_server ` (即第一个 server)处理,因为没有 ` www.example.com ` 在此端口上定义。
82+ 此配置中,nginx 首先根据 [ server] ( http://nginx.org/en/docs/http/ngx_http_core_module.html#server ) 块的 ` listen ` 指令检验请求的 IP 和端口。之后,根据与 IP 和端口相匹配的 ` server ` 块的 [ server_name] ( http://nginx.org/en/docs/http/ngx_http_core_module.html#server_name ) 项对请求的“Host” header 域进行检验。如果找不到服务器的名称(server_name),请求将由 ` default_server ` 处理。例如,在 ` 192.168.1.1:80 ` 上收到的对 ` www.example.com ` 的请求将由 ` 192.168.1.1:80 ` 端口的 ` default_server ` (即第一个 server)处理,因为没有 ` www.example.com ` 在此端口上定义。
7983
8084如上所述,` default_server ` 是 ` listen port ` 的属性,可以为不同的端口定义不同的 ` default_server ` :
8185
@@ -99,7 +103,7 @@ server {
99103}
100104```
101105
102- ## 一个简单的 PHP 站点配置
106+ ## 一个简单的PHP站点配置
103107现在让我们来看看 nginx 是如何选择一个 ` location ` 来处理典型的简单 PHP 站点的请求:
104108
105109``` nginx
@@ -142,9 +146,9 @@ nginx 首先忽略排序搜索具有最明确字符串的前缀 `location`。在
142146
143147现在来看看在上面的配置中是如何请求的:
144148- 请求 ` /logo.gif ` 首先与 前缀 ` location ` 为 ` / ` 相匹配,然后由正则表达式 ` \.(gif|jpg|png)$ ` 匹配,因此由后一个 ` location ` 处理。使用指令 ` root /data/www ` 将请求映射到 ` /data/www/logo.gif ` 文件,并将文件发送给客户端。
145- - 一个 ` /index.php ` 的请求也是首先与前缀 ` location ` 为 ` / ` 相匹配,然后是正则表达式 ` \.(php)$ ` 。因此,它由后一个 ` location ` 处理,请求将被传递给在 ` localhost:9000 ` 上监听的 FastCGI 服务器。` fastcgi_param ` 指令将 FastCGI 参数 ` SCRPT_FILENAME ` 设置为 ` /data/www/index.php ` ,FastCGI 服务器执行该文件。变量 ` $document_root ` 与 ` root ` 指令的值是一样的,变量 ` $fastcgi_script_name ` 的值为请求URI,即 ` /index.php ` 。
149+ - 一个 ` /index.php ` 的请求也是首先与前缀 ` location ` 为 ` / ` 相匹配,然后是正则表达式 ` \.(php)$ ` 。因此,它由后一个 ` location ` 处理,请求将被传递给在 ` localhost:9000 ` 上监听的 FastCGI 服务器。[ fastcgi_param] ( http://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_param ) 指令将 FastCGI 参数 ` SCRPT_FILENAME ` 设置为 ` /data/www/index.php ` ,FastCGI 服务器执行该文件。变量 ` $document_root ` 与 [ root] ( http://nginx.org/en/docs/http/ngx_http_core_module.html#root ) 指令的值是一样的,变量 ` $fastcgi_script_name ` 的值为请求URI,即 ` /index.php ` 。
146150- ` /about.html ` 请求仅与前缀 ` location ` 为 ` / ` 相匹配,因此由此 ` location ` 处理。使用指令 ` root /data/www ` 将请求映射到 ` /data/www/about.html ` 文件,并将文件发送给客户端。
147- - 处理请求 ` / ` 更复杂。它与前缀 ` location ` 为 ` / ` 相匹配。因此由该 ` location ` 处理。然后,` index ` 指令根据其参数和 ` root /data/www ` 指令检验索引文件是否存在。如果文件 ` /data/www/index.html ` 不存在,并且文件 ` /data/www/index.php ` 存在,则该指令执行内部重定向到 ` /index.php ` ,如果请求是由客户端发起的,nginx 将再次搜索 ` location ` 。如之前所述,重定向请求最终由 FastCGI 服务器处理。
151+ - 处理请求 ` / ` 更复杂。它与前缀 ` location ` 为 ` / ` 相匹配。因此由该 ` location ` 处理。然后,[ index] ( http://nginx.org/en/docs/http/ngx_http_index_module.html#index ) 指令根据其参数和 ` root /data/www ` 指令检验索引文件是否存在。如果文件 ` /data/www/index.html ` 不存在,并且文件 ` /data/www/index.php ` 存在,则该指令执行内部重定向到 ` /index.php ` ,如果请求是由客户端发起的,nginx 将再次搜索 ` location ` 。如之前所述,重定向请求最终由 FastCGI 服务器处理。
148152
149153由 Igor Sysoev 撰写
150154由 Brian Mercer 编辑
0 commit comments