Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 10 additions & 6 deletions 介绍/Nginx如何处理请求.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
# nginx 如何处理请求

- [基于名称的虚拟服务器](#基于名称的虚拟服务器)
- [如何使用未定义的server名称来阻止处理请求](#如何使用未定义的server名称来阻止处理请求)
- [一个简单的PHP站点配置](#一个简单的PHP站点配置)

## 基于名称的虚拟服务器
nginx 首先决定哪个 `server` 应该处理请求,让我们从一个简单的配置开始,三个虚拟服务器都监听了 `*:80` 端口:

Expand All @@ -23,7 +27,7 @@ server {
}
```

在此配置中,nginx 仅检验请求的 header 域中的 `Host`,以确定请求应该被路由到哪一个 `server`。如果其值与任何的 `server` 名称不匹配,或者该请求根本不包含此 header 域,nginx 会将请求路由到该端口的默认 `server` 中。在上面的配置中,默认 `server` 是第一个(这是 nginx 的标准默认行为)。你也可以在 `listen` 指令中使用 `default_server` 参数,明确地设置默认的 `server`。
在此配置中,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`。

```nginx
server {
Expand All @@ -37,7 +41,7 @@ server {

请注意,`default_server` 是 `listen port` 的属性,而不是 `server_name` 的。之后会有更多关于这方面的内容。

## 如何使用未定义的 server 名称来阻止处理请求
## 如何使用未定义的server名称来阻止处理请求
如果不允许没有 “Host” header 字段的请求,可以定义一个丢弃请求的 server:

```nginx
Expand Down Expand Up @@ -75,7 +79,7 @@ server {
}
```

此配置中,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` 在此端口上定义。
此配置中,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` 在此端口上定义。

如上所述,`default_server` 是 `listen port` 的属性,可以为不同的端口定义不同的 `default_server`:

Expand All @@ -99,7 +103,7 @@ server {
}
```

## 一个简单的 PHP 站点配置
## 一个简单的PHP站点配置
现在让我们来看看 nginx 是如何选择一个 `location` 来处理典型的简单 PHP 站点的请求:

```nginx
Expand Down Expand Up @@ -142,9 +146,9 @@ nginx 首先忽略排序搜索具有最明确字符串的前缀 `location`。在

现在来看看在上面的配置中是如何请求的:
- 请求 `/logo.gif` 首先与 前缀 `location` 为 `/` 相匹配,然后由正则表达式 `\.(gif|jpg|png)$` 匹配,因此由后一个 `location` 处理。使用指令 `root /data/www` 将请求映射到 `/data/www/logo.gif` 文件,并将文件发送给客户端。
- 一个 `/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`。
- 一个 `/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`。
- `/about.html` 请求仅与前缀 `location` 为 `/` 相匹配,因此由此 `location` 处理。使用指令 `root /data/www` 将请求映射到 `/data/www/about.html` 文件,并将文件发送给客户端。
- 处理请求 `/` 更复杂。它与前缀 `location` 为 `/` 相匹配。因此由该 `location` 处理。然后,`index` 指令根据其参数和 `root /data/www` 指令检验索引文件是否存在。如果文件 `/data/www/index.html` 不存在,并且文件 `/data/www/index.php` 存在,则该指令执行内部重定向到 `/index.php`,如果请求是由客户端发起的,nginx 将再次搜索 `location`。如之前所述,重定向请求最终由 FastCGI 服务器处理。
- 处理请求 `/` 更复杂。它与前缀 `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 服务器处理。

由 Igor Sysoev 撰写
由 Brian Mercer 编辑
Expand Down
13 changes: 8 additions & 5 deletions 介绍/Windows下的Nginx.md
Original file line number Diff line number Diff line change
@@ -1,22 +1,25 @@
# Windows 下的 nginx

[已知问题](#已知问题)
[以后可能的发展](#以后可能的发展)

Nginx 的 Windows 版本使用了本地的 Win32 API(而不是 Cygwin 模拟层)。目前仅使用 `select()` 和 `poll()` (1.15.9) 连接处理方式。由于此版本和其他存在已知的问题的 Nginx Windows 版本都被认为是 beta 版本,因此您不应该期望它具有高性能和可扩展性。现在,它提供了与 Unix 版本的 nginx 几乎相同的功能,除了 XSLT 过滤器、图像过滤器、GeoIP 模块和嵌入式 Perl 语言。

<!-- more -->

要安装 nginx 的 Windows 版本,请 [下载](http://nginx.org/en/download.html) 最新的主线发行版(1.15.10),因为 nginx 的主线分支包含了所有已知的补丁。之后解压文件到 `nginx-1.15.10` 目录下,然后运行 `nginx`。以下是 `C盘` 的根目录:
要安装 nginx 的 Windows 版本,请 [下载](http://nginx.org/en/download.html) 最新的主线发行版(1.17.2),因为 nginx 的主线分支包含了所有已知的补丁。之后解压文件到 `nginx-1.17.2` 目录下,然后运行 `nginx`。以下是 `C盘` 的根目录:

```bash
cd c:\
unzip nginx-1.15.10.zip
cd nginx-1.15.10
unzip nginx-1.17.2.zip
cd nginx-1.17.2
start nginx
```

运行 `tasklist` 命令行工具查看 nginx 进程:

```bash
C:\nginx-1.15.10>tasklist /fi "imagename eq nginx.exe"
C:\nginx-1.17.2>tasklist /fi "imagename eq nginx.exe"

Image Name PID Session Name Session# Mem Usage
=============== ======== ============== ========== ============
Expand All @@ -25,7 +28,7 @@ nginx.exe 1332 Console 0 3 112 K
```
其中有一个是主进程(master),另一个是工作进程(worker)。如果 nginx 未能启动,请在错误日志 `logs\error.log` 中查找原因。如果日志文件尚未创建,可以在 Windows 事件日志中查找原因。如果显示的页面为错误页面,而不是预期结果,也可以在 `logs\error.log` 中查找原因。

Nginx 的 Windows 版本使用运行目录作为配置文件中的相对路径前缀。在上面的例子中,前缀是 `C:\nginx-1.15.10\`。在配置文件中的路径必须使类 Unix 风格的正斜杠:
Nginx 的 Windows 版本使用运行目录作为配置文件中的相对路径前缀。在上面的例子中,前缀是 `C:\nginx-1.17.2\`。在配置文件中的路径必须使类 Unix 风格的正斜杠:

```nginx
access_log logs/site.log;
Expand Down
18 changes: 17 additions & 1 deletion 介绍/服务器名称.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
# 服务器名称

- [通配符名称](#通配符名称)
- [正则表达式名称](#正则表达式名称)
- [其他名称](#其他名称)
- [国际化名称](#国际化名称)

服务器名称是使用 [server_name](http://nginx.org/en/docs/http/ngx_http_core_module.html#server_name) 指令定义的,它确定了哪一个 [server](http://nginx.org/en/docs/http/ngx_http_core_module.html#server) 块被给定的请求所使用。另请参见 [nginx 如何处理请求](nginx如何处理请求)。可以使用精确的名称、通配符或者正则表达式来定义他们:

```nginx
Expand Down Expand Up @@ -151,8 +156,19 @@ server {
}
```

## 国际化名称
应使用 [server_name](http://nginx.org/en/docs/http/ngx_http_core_module.html#server_name) 指令中的ASCII(Punycode)表示来指定国际化域名([IDN](https://en.wikipedia.org/wiki/Internationalized_domain_name))

```nginx
server {
listen 80;
server_name xn--e1afmkfd.xn--80akhbyknj4f; # пример.испытание
...
}
```

## 优化
确切的名称、以星号开头的通配符名称和以星号结尾的通配符名称被存储在绑定到监听端口的三种哈希表中。哈希表的大小可以在配置阶段优化,因此可以在 CPU 缓存未命中的最低情况下找到名称。设置哈希表的具体细节在单独的文档中提供
确切的名称、以星号开头的通配符名称和以星号结尾的通配符名称被存储在绑定到监听端口的三种哈希表中。哈希表的大小可以在配置阶段优化,因此可以在 CPU 缓存未命中的最低情况下找到名称。设置哈希表的具体细节在单独的 [文档](http://nginx.org/en/docs/hash.html) 中提供

首先搜索确切的名称哈希表。如果为找到名称,则会搜索以星号开头的通配符名称的哈希表。如果还是没有找到名称,则搜索以星号结尾的通配符名称哈希。

Expand Down