Skip to content
Closed
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
22 changes: 13 additions & 9 deletions 介绍/初学者指南.md
Original file line number Diff line number Diff line change
Expand Up @@ -53,24 +53,28 @@ ps -ax | grep nginx

## 配置文件结构

nginx 是由配置文件中指定的指令控制模块组成。指令可分为简单指令和块指令。一个简单的指令是由空格分隔的名称和参数组成,并以分号 `;` 结尾。块指令具有与简单指令相同的结构,但不是以分号结尾,而是以大括号`{}`包围的一组附加指令结尾。如果块指令的大括号内部可以有其它指令,则称这个块指令为上下文(例如:`events`,`http`,`server``location`)。
nginx 是由配置文件中指定的指令控制模块组成。指令可分为简单指令和块指令。一个简单的指令是由空格分隔的名称和参数组成,并以分号 `;` 结尾。块指令具有与简单指令相同的结构,但不是以分号结尾,而是以大括号`{}`包围的一组附加指令结尾。如果块指令的大括号内部可以有其它指令,则称这个块指令为上下文(例如:[events](http://nginx.org/en/docs/ngx_core_module.html#events),[http](http://nginx.org/en/docs/http/ngx_http_core_module.html#http),[server](http://nginx.org/en/docs/http/ngx_http_core_module.html#server)[location](http://nginx.org/en/docs/http/ngx_http_core_module.html#location))。

配置文件中被放置在任何上下文之外的指令都被认为是主上下文。`events` 和 `http` 指令在主上下文中,`server` 在 `http` 中,`location` 又在 `server` 中。
配置文件中被放置在任何上下文之外的指令都被认为是主上下文 [main](http://nginx.org/en/docs/ngx_core_module.html)。`events` 和 `http` 指令在主 `main` 上下文中,`server` 在 `http` 中,`location` 又在 `server` 中。

井号 `#` 之后的行的内容被视为注释。

## 提供静态内容服务

Web 服务器的一个重要任务是提供文件(比如图片或者静态 HTML 页面)服务。您将实现一个示例,根据请求,将提供来自不同的本地目录的文件: `/data/www`(可能包含 HTML 文件)和 `/data/images`(包含图片)。这需要编辑配置文件,在 `http` 中配置一个包含两个 `location` 块的 `server` 块指令。

首先,创建 `/data/www` 目录将包含任何文本内容的 `index.html` 文件放入其中,创建 `/data/images` 目录然后放一些图片进去。

其次,打开这个配置文件, 默认配置文件已经包含几个服务器块示例,大部分是已经注释掉的。现在注释掉这些块并且启动一个新的 `server` 块。

```nginx
http {
server {
}
}
```

通常,配置文件可以包含几个由监听端口和服务器域名区分的 `server` 块指令。一旦 nginx 决定由哪个 `server` 来处理请求,它会根据 `server` 块中定义的 `location` 指令的参数来检验请求头中指定的URI。
通常,配置文件可以包含几个由监听 [listen](http://nginx.org/en/docs/http/ngx_http_core_module.html#listen) 端口和服务器域名 [server names](http://nginx.org/en/docs/http/server_names.html) 区分的 `server` 块指令 [distinguished](http://nginx.org/en/docs/http/request_processing.html)。一旦 nginx 决定由哪个 `server` 来处理请求,它会根据 `server` 块中定义的 `location` 指令的参数来检验请求头中指定的URI。

添加如下 `location` 块指令到 `server` 块指令中:

Expand All @@ -80,7 +84,7 @@ location / {
}
```

该 `location` 块指令指定 `/` 前缀与请求中的 URI 相比较。对于匹配的请求,URI 将被添加到根指令中指定的路径,即 `/data/ www`,以形成本地文件系统上所请求文件的路径。如果有几个匹配上的 `location` 块指令,nginx 将选择具有最长前缀的 `location` 块。上面的位置块提供最短的前缀,长度为 1,因此只有当所有其它 `location` 块不能匹配时,才会使用该块。
该 `location` 块指令指定 `/` 前缀与请求中的 URI 相比较。对于匹配的请求,URI 将被添加到根指令 [root](http://nginx.org/en/docs/http/ngx_http_core_module.html#root) 中指定的路径,即 `/data/ www`,以形成本地文件系统上所请求文件的路径。如果有几个匹配上的 `location` 块指令,nginx 将选择具有最长前缀的 `location` 块。上面的位置块提供最短的前缀,长度为 1,因此只有当所有其它 `location` 块不能匹配时,才会使用该块。

接下来,添加第二个 `location` 指令快:

Expand Down Expand Up @@ -114,7 +118,7 @@ server {
nginx -s reload
```

> 如果运行的效果没有在预期之中,您可以尝试从 `/usr/local/nginx/logs` 或 `/var/log/ nginx` 中的access.log和error.log日志文件中查找原因
> 如果运行的效果没有在预期之中,您可以尝试从 `/usr/local/nginx/logs` 或 `/var/log/ nginx` 中的 `access.log` 和 `error.log` 日志文件中查找原因

## 设置一个简单的代理服务器

Expand All @@ -134,9 +138,9 @@ server {
}
```

这是一个监听 8080 端口的简单服务器(以前,由于使用了标准 80 端口,所以没有指定 listen 指令),并将所有请求映射到本地文件系统上的 `/data/up1` 目录。创建此目录并将 `index.html` 文件放入其中。请注意,`root` 指令位于 `server` 上下文中。当选择用于处理请求的 `location` 块不包含 `root` 指令时,将使用此 `root` 指令。
这是一个监听 8080 端口的简单服务器(以前,由于使用了标准 80 端口,所以没有指定 listen 指令),并将所有请求映射到本地文件系统上的 `/data/up1` 目录。创建此目录并将 `index.html` 文件放入其中。请注意,`root` 指令位于 `server` 上下文中。当选择用于处理请求的 `location` 块自身不包含 `root` 指令时,将使用此 `root` 指令。

接下来,在上一节中的服务器配置基础上进行修改,使其成为代理服务器配置。在第一个 `location` 块中,使用参数指定的代理服务器的协议,域名和端口(在本例中为 `http://localhost:8080`)放置在 proxy_pass 指令处:
接下来,在上一节中的服务器配置基础上进行修改,使其成为代理服务器配置。在第一个 `location` 块中,使用参数指定的代理服务器的协议,域名和端口(在本例中为 `http://localhost:8080`)放置在 [proxy_pass](http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_pass) 指令处:

```nginx
server {
Expand All @@ -160,7 +164,7 @@ location ~ \.(gif|jpg|png)$ {

该参数是一个正则表达式,匹配所有以`.gif`,`.jpg` 或 `.png` 结尾的 URI。正则表达式之前应该是 `~`。相应的请求将映射到 `/data/images` 目录。

当 nginx 选择一个 `location` 块来提供请求时,它首先检查指定前缀的 `location` 指令,记住具有最长前缀的 `location`,然后检查正则表达式。如果与正则表达式匹配,nginx 会选择此 `location`,否则选择更早之前记住的那一个。
当 nginx 选择一个 `location` 块来提供请求时,它首先检查指定前缀的 [location](http://nginx.org/en/docs/http/ngx_http_core_module.html#location) 指令,记住具有最长前缀的 `location`,然后检查正则表达式。如果与正则表达式匹配,nginx 会选择此 `location`,否则选择更早之前记住的那一个。

代理服务器的最终配置如下:

Expand All @@ -186,7 +190,7 @@ server {

nginx 可被用于将请求路由到运行了使用各种框架和 PHP 等编程语言构建的应用程序的 FastCGI 服务器。

与 FastCGI 服务器协同工作的最基本的 nginx 配置是使用 `fastcgi_pass` 指令而不是 `proxy_pass` 指令,以及 `fastcgi_param` 指令来设置传递给 FastCGI 服务器的参数。假设 FastCGI 服务器可以在 localhost:9000 上访问。以上一节的代理配置为基础,用 `fastcgi_pass` 指令替换 `proxy_pass` 指令,并将参数更改为 `localhost:9000`。在 PHP 中,`SCRIPT_FILENAME` 参数用于确定脚本名称,`QUERY_STRING` 参数用于传递请求参数。最终的配置将是:
与 FastCGI 服务器协同工作的最基本的 nginx 配置是使用 [fastcgi_pass](http://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_pass) 指令而不是 `proxy_pass` 指令,以及 `fastcgi_param` 指令来设置传递给 FastCGI 服务器的参数。假设 FastCGI 服务器可以在 localhost:9000 上访问。以上一节的代理配置为基础,用 `fastcgi_pass` 指令替换 `proxy_pass` 指令,并将参数更改为 `localhost:9000`。在 PHP 中,`SCRIPT_FILENAME` 参数用于确定脚本名称,`QUERY_STRING` 参数用于传递请求参数。最终的配置将是:

```nginx
server {
Expand Down