前言
- nginx有一个主进程和几个工作进程。主进程的主要目的是读取和评估配置,并维护工作进程。工作进程会对请求进行实际处理。nginx采用基于事件的模型和依赖于操作系统的机制来有效地在工作进程之间分发请求。工作进程数在配置文件中定义,可以针对给定配置进行修复,也可以自动调整为可用CPU内核数(请参阅worker_processes)。
配置文件的结构
- nginx由模块组成,这些模块由配置文件中指定的指令控制。指令分为简单指令和块指令。一个简单的指令由名称和参数组成,用空格分隔,以分号(;)结尾。块指令与简单指令具有相同的结构,但它不是以分号结尾,而是以大括号({和})包围的一组附加指令结束。如果块指令在大括号内可以有其他指令,则称为上下文(示例: events, http, server和 location)。
在任何上下文之外放置在配置文件中的指令被认为是在 主上下文中。在events和http指令驻留在main上下文server 中http,并location在 server。
#
标志 后面的其余部分被视为注释。
提供静态内容
-
一个重要的Web服务器任务是提供文件(例如图片或静态HTML页面)。您将实现一个示例,根据请求,将从不同的本地目录
/data/www
(可能包含HTML文件)和/data/images
(包含图片)提供文件。这将需要编辑配置文件并 使用两个位置 块 在http块内设置 服务器块。 -
首先,创建
/data/www
目录并将index.html
包含任何文本内容的 文件放入其中,然后创建/data/images
目录并在其中放置一些图像。 -
接下来,打开配置文件。默认配置文件已经包含了几个
server
块的示例,主要是注释掉了。现在注释掉所有这些块并开始一个新server
块:http { server { } }
-
通常,配置文件可以包括由它们监听的端口和 服务器名称区分的若干
server
块 。一旦nginx决定处理请求,它就会根据块内定义的指令 参数测试请求头中指定的URI 。 -
将以下
location
块添加到server
块中:location / { root /data/www; }
此
location
块指定/
与请求中的URI进行比较前缀。对于匹配的请求,URI将匹配到root 指令中指定的路径 ,即/data/www
,以形成本地文件系统上文件 匹配 所请求文件的路径。如果存在多个匹配location
块,则nginx选择具有最长前缀的块。上面的location
块提供长度为1的最短前缀,因此只有当所有其他location
块都无法提供匹配时,才会使用此块。接下来,添加第二个
location
块:location /images/ { root /data/images; }
它将匹配以
/images
开头的请求(location /
也匹配此类请求,但前缀较短)。生成的
server
块配置应如下所示:server {
location / { root /data/www; }
location /images/ { root /data; }
}- 这已经是服务器的工作配置,它可以侦听标准端口80,并且可以在本地计算机上访问
http://localhost/
。为响应以URI开头的请求/images/
,服务器将从/data/images
目录发送文件。例如,响应http://localhost/images/example.png
请求nginx将发送/data/images/example.png
文件。如果此类文件不存在,nginx将发送指示404错误的响应。不以URI开头的请求/images/
将映射到/data/www
目录。例如,响应http://localhost/some/example.html
请求nginx将发送/data/www/some/example.html
文件。
- 这已经是服务器的工作配置,它可以侦听标准端口80,并且可以在本地计算机上访问
设置简单的代理服务器
-
nginx的一个常见用途是将其设置为代理服务器,这意味着nginx接收请求,将它们传递给代理的服务器,从中检索响应,然后将它们发送给客户端。
-
我们将配置一个基本代理服务器,它使用来自本地目录的文件处理图像请求,并将所有其他请求发送到代理服务器。在此示例中,将在单个nginx实例上定义两个服务器。
-
首先,通过向server nginx的配置文件添加一个以上内容来定义代理服务器,其中包含以下内容:
server{ listen 8080; root /data/up1; location / { } }
-
这将是一个侦听端口8080的简单服务器(之前,listen自使用标准端口80以来尚未指定该指令)并将所有请求映射到/data/up1本地文件系统上的目录。创建此目录并将index.html文件放入其中。请注意,该root指令放在 server上下文中。当location选择用于提供请求的块不包括自己的root指令时,可以使用 这样的指令。
-
接下来,使用上一节中的服务器配置并对其进行修改,使其成为代理服务器配置。在第一个location块中,将 proxy_pass 指令与参数中指定的代理服务器的协议,名称和端口放在一起(在我们的示例中,它是http://localhost:8080):
server { location / { proxy_pass http://localhost:8080; } location /images/ { root /data/images/; } }
-
我们将修改第二个location 块,该块当前将带有/images/ 前缀的请求映射到目录下的/data/images文件,以使其与具有典型文件扩展名的图像请求相匹配。修改后的location块看起来像这样:
location ~ \.(gif|jpg|png)$ { root /data/images; }
-
该参数是一个正则表达式匹配结尾的所有URI .gif,.jpg或.png。应该以正则表达式
~
开头。相应的请求将映射到该/data/images 目录。 -
当nginx选择一个location块来提供请求时,它首先检查 指定前缀的位置指令,记住location 最长的前缀,然后检查正则表达式。如果与正则表达式匹配,则nginx选择此项 location,否则,它会选择之前记住的那个。
-
生成的代理服务器配置如下所示:
server { location / { proxy_pass http://localhost:8080/; } location ~ \.(gif|jpg|png)$ { root /data/images; } }
-
此服务器将过滤以.gif, .jpg或结束的请求,.png 并将它们映射到/data/images目录(通过向root指令的参数添加URI ),并将所有其他请求传递给上面配置的代理服务器。
网友评论