【翻译】nginx初学者指南

时间:2023-03-08 22:40:38

nginx初学者指南

本文翻译自nginx官方网站:http://nginx.org/en/docs/beginners_guide.html#control

该指南会对nginx做一个简要的介绍,同时描述一些使用nginx完成的简单任务。该指南假设读者的机器上已经安装好了nginx。如果没有安装好,请转移到Installing nginx页面完成安装。该指南描述了如何启动和停止nginx,如何重新载入nginx的配置,解释了配置文件的构成以及如何使用nginx来分发静态资源、如何配置nginx来作为一个代理服务器、以及如何使用FastCGI来连接到nginx。

nginx有一个主进程和几个工作者进程。主进程的主要工作是读取和评估配置文件中的值,同时维护工作者进程。工作者进程处理实际的请求。nginx使用基于事件的模型和依赖于操作系统的机制来有效地在工作进程之间分发请求。工作进程的数量在配置文件中定义,可以针对给定的配置进行固定,也可以根据可用CPU内核的数量自动调整(参见worker_processes)。

nginx及其模块的工作方式在配置文件中确定。默认情况下,配置文件名为nginx.conf,并放置在/usr/local/nginx/conf、/etc/nginx或/usr/local/etc/nginx.目录中。

启动、停止nginx和重载配置文件

要启动nginx,运行nginx的可执行文件。一旦nginx启动后,就可以通过调用 -s的命令行参数来配置它。使用一下语法:

nginx -s signal

signal可以是一下列出的一个:

  • stop —快速关闭
  • quit — 优雅的关闭
  • reload — 重新载入配置文件
  • reopen —重新打开日志文件

例如,要停止nginx进程,等待worker进程完成服务当前请求,可以执行以下命令:

nginx -s quit

注释:这个命令应该在启动nginx的同一用户下执行。

在将重新加载配置的命令发送到nginx或重新启动配置之前,不会应用配置文件中所做的更改。要重新加载配置,请执行:

nginx -s reload

一旦主进程接收到重新载入配置文件的信号,它首先检查配置文件中的语法是否有效,然后尝试应用配置文件中提供的配置。如果成功,那么他会创建新的工作者进程,并发送消息到旧的工作者进程中来通知旧的工作者进程关闭。否则,主线程回滚配置并使用旧的配置。同时旧的工作者进程接收到关闭请求,停止接收连接并处理当前请求知道完成当前请求后,旧的工作者进行会关闭并退出。

在一些工具/命令的帮助下也可以想nginx发送信号,比如kill。在本例中,一个信号被直接发送到具有给定进程ID的进程。默认情况下,nginx主进程的进程ID被写入nginx.pid,它位于/usr/local/nginx/logs或/var/run目录中。例如,如果主进程ID是1628,要发送退出信号导致nginx优雅地关闭(quit命令),执行:

kill -s QUIT 

要获得所有运行nginx进程的列表,可以使用ps工具,例如:

ps -ax | grep nginx

关于发送信号到nginx的更多信息,请参阅:Controlling nginx.

配置文件的结构

nginx是由模块组成的,而模块有配置文件中的指令控制。指令分为简单指令和块指令。一个简单的指令由名称和参数组成,它们由空格分隔,并以分号(;)结束。块指令具有与简单指令相同的结构,但它的结尾不是分号,而是一组由大括号({和})包围的附加指令。如果一个块指令可以在大括号中包含其他指令,那么它被称为上下文(例如:events, http, server, and location

放在任何上下文之外的配置文件中的指令被认为是在主上下文中。events和http指令驻留在主上下文中,server驻留在http中,location驻留在server中。

#号后面的会被当作注释。

提供静态内容

个重要的web服务器任务是提供文件(例如图像或静态HTML页面)。接下来你将实现一个示例,根据请求,文件将从不同的本地目录提供:/data/www(可能包含HTML文件)和/data/images(包含图像)。这将需要编辑配置文件,并在带有两个location块的http块中设置server块。

首先,创建一个 /data/www目录并在里面放一个包含任意内容的index.html文件,然后创建一个/data/images目录并在里面放置一些图片。

接下来,打开配置文件。默认配置文件已经包含了server块的几个例子,大部分都被注释掉了。现在注释掉所有这样的块,并开始一个新的server块:

http {
server {
}
}

通常,配置文件可能包含几个server块,这些服务器块由它们侦听的端口和服务器名称来区分(参见这里: distinguished )。一旦nginx决定哪个server处理请求,它就根据server块中定义的location指令的参数测试请求头中指定的URI。

将以下location块添加到server块:

location / {
root /data/www;
}

此location块制定了“/”前缀与来自请求的URI进行比较。为了匹配请求,URI将被添加到根指令中指定的路径,即/data/www,以形成本地文件系统上被请求文件的路径。如果有多个匹配的location块,nginx选择前缀最长的一个。上面的location块提供了长度为1的最短前缀,因此,只有当所有其他location块都不能提供匹配时,才会使用这个块。

下一步,添加另一个location块:

location /images/ {
root /data;
}

它将匹配以/images/开头的请求(location /也匹配此类请求,但前缀更短)。

配置文件中的server块最终看起来像是这个样子:

server {
location / {
root /data/www;
} location /images/ {
root /data;
}
}

上面这个配置完成后,对于像http://localhost这样的请求就能相应了。它默认监听80端口。如果是以“/images/”开头的请求,他会从/data/images这个本地文件夹中提供响应。举个例子:为了响应http://localhost/images/example.png这个请求,nginx会从/data/images/example.png提供响应。如果文件不存在,nginx会返回一个404的错误。没有以/images/这个路径开头的请求会被映射到/data/www这个本地路径上。举个例子,如果请求是http://localhost/some/example.html,那么nginx会发送/data/www/index.html这个文件过去。

为了应用新的配置,需要给nginx的主进程发送reload信号,执行下面的代码:

nginx -s reload

注释:如果发生了其他没有预料到的情况下,你可以查看access.log和error.log来找出原因,这两个文件通常在/usr/local/nginx/logs目录或/var/log/nginx目录下。

建立一个简单的代理服务器

nginx的一个常见用途是将其设置为代理服务器,这意味着服务器接收请求,将请求传递给代理服务器,从代理服务器检索响应,并将响应发送给客户机。

我们将配置一个基本代理服务器,它使用本地目录中的文件来处理图像请求,并将所有其他请求发送到代理服务器。在本例中,这两个服务器将在一个nginx实例上定义。

首先,通过在nginx的配置文件中添加一个包含以下内容的服务器块来定义代理服务器:

server {
listen ;
root /data/up1; location / {
}
}

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

接下来,使用上一节中的服务器配置并修改它,使其成为代理服务器配置。在第一个location块中,将proxy_pass指令与参数中指定的协议、代理服务器的名称和端口放在一起(在我们的例子中,是http://localhost:8080):

server {
location / {
proxy_pass http://localhost:8080;
} location /images/ {
root /data;
}
}

我们将修改第二个location块(还是上一节中的配置中),它当前将带有/images/前缀的请求映射到/data/images目录下的文件,使其匹配具有典型文件扩展名的图像请求。修改后的位置块如下:

location ~ \.(gif|jpg|png)$ {
root /data/images;
}

这个参数是一个正则表达式,他匹配所有以.git,.jpg,.png结尾的url,正则表达式的前面应该加上~。相应的请求将映射到/data/images目录。

当nginx选择一个location块来服务一个请求时,它首先检查指定前缀的位置指令,记住(匹配的)前缀最长的位置,然后检查正则表达式。如果与正则表达式匹配,nginx将选择此位置,否则,它将选择之前记住的位置。

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

server {
location / {
proxy_pass http://localhost:8080/;
} location ~ \.(gif|jpg|png)$ {
root /data/images;
}
}

这个server块将会过滤.gif.jpg, 或者.png结尾的请求, 并将他们映射到/data/images的本地路径下(通过将uri添加到root指令表示的本地路径之后),并将所有其他请求传递到上面配置的代理服务器。

要应用这个配置,和以往一样需要发送reload请求到nginx的主进程中,这里还有很多其他关于代理链接的一些知识: more