【nginx】新手手册(翻译)


注:本文为nginx官网 Beginner's Guide 的译文。翻译不易,转载请注明。


本手册介绍了有关nginx的基础知识,并描述了nginx可以完成的几项简单任务。读者在阅读本手册前请确保自己的机器上已经安装好nginx。未安装好的读者可参考如何安装nginx。本手册将介绍以下内容:

  • 如何启动、停止nginx
  • 如何重新载入其配置文件
  • nginx配置文件的结构
  • 如何配置将nginx设置为静态资源服务器
  • 如何将nginx设置为代理服务器
  • 如何使nginx关联FastCGI应用

nginx拥有一个主进程和数个工作进程。主进程的主要任务是读取配置文件、评估配置文件的合理性和维护工作进程。工作进程的任务是处理具体的请求。nginx采用事件驱动模型和OS强相关机制确保能够高效地将请求分配给各个工作进程。工作进程的数量可在配置文件中设置,可以将数量定为某个数值,也可以使nginx按照CPU核心数自动调整。(见工作进程)

nginx和其各个模块的工作方式由配置文件决定。默认情况下,配置文件的名称为nginx.conf,位于 /usr/local/nginx/conf/etc/nginx/usr/local/etc/nginx文件夹中。

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

运行nginx可执行文件即可启动nginx。nginx启动后,可通过在nginx可执行文件后增加-s参数来控制nginx服务器。语法如下:

nginx -s signal

signal为下列任一值:

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

例如,若要停止nginx各个进程,但停止之前须等待工作进程处理完当前的请求,则可运行以下命令:

nginx -s quit

执行该命令的用户应与启动nginx的用户一致

命令nginx重新载入配置文件或重启nginx之后,配置文件中做出的改变才会生效。运行以下命令即可命令nginx重新载入配置文件:

nginx -s reload

主进程收到重新载入配置文件的信号后,该进程会先检查新配置文件的语法,然后尝试应用其中提供的配置。若成功,主进程会启动新的工作进程,并向旧工作进程发送信息,要求其停止工作。若不成功,主进程回滚其做出的改变,继续使用旧配置。主进程收到停止命令后将不再接受新的连接,同时继续处理当前请求直至完成。之后,旧工作进程退出。

可以通过kill命令之类的Unix工具向nginx进程发送信号。在这种情况下,信号会直接送至指定进程ID下的进程。nginx主进程的进程ID默认被写入/usr/local/nginx/logs/var/run文件夹内的nginx.pid文件。例如,假设主进程的ID是1628,若需要向nginx发送QUIT信号使其优雅关闭,则可执行以下命令:

kill -s QUIT 1628

若需要列出所有运行中的nginx进程,可与下面的方式使用ps命令:

ps -ax | grep nginx

获取与向nginx发送信号相关的更多信息,访问控制nginx。

配置文件的结构

nginx由各个模块组成,这些模块由配置文件中的控制指令控制。指令分为简单指令和块指令。简单指令由名称、被空格隔开的参数、结尾的分号(;)组成。块指令与简单指令的结构相同,但结尾不是分号,而是被花括号({})括住的一组额外的指令。若块指令内可嵌套被花括号括住的其他指令,则可将该块指令称为一个上下文(events、http、server和location链接的网页给出了示例)。

在配置文件之内、各上下文之外定义的指令处于main上下文中。eventshttp 指令处于main上下文中,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块,各个块的端口和服务器名称 不同。一旦nginx确定了当前请求应该由那个server处理,它会根据server块中location指令的参数比对请求头中的URI。

将下面的location块写入server块中:

location / {
    root /data/www;
}

location 块规定应以/前缀比对请求中的URI。若请求吻合,其中的URI将被拼接到root指令给出的路径后,即拼接到 /data/www后,以生成被请求的文件在本地文件系统中的路径。如果匹配的 location 块有多个,nginx会优先选择前缀最长的那个。 上面给出的location 块定义的前缀长度为1,最短,因此只有在其他所有location块都不匹配的情况下,nginx才会选择该location块。

接着将第二个location块写入server块中:

location /images/ {
     root /data;
}

location块将匹配以/images/ 开头的请求(location /也匹配这样的请求,但是其定义的前缀更短)。

此时,配置后的server块是这样的:

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

这样就已经配置了一个可用的nginx服务器了,该服务器监听80端口,在本机可通过http://localhost/访问。当请求中的URI以/images开头时,服务器将从/data/images目录解析文件。例如,对 http://localhost/images/example.png 请求进行回应时,nginx将返回/data/images/example.png 文件。如果该文件不存在,nginx将返回404错误。不以/images/开头的URI将被映射到 /data/www目录。例如,对http://localhost/some/example.html 请求,nginx将返回/data/www/some/example.html 文件。

启动nginx(若还未启动)或通过以下命令向nginx主进程发送reload信号可使配置文件中所做修改生效:

nginx -s reload

若执行命令时出现错误,你可在 /usr/local/nginx/logs/var/log/nginx的目录下的access.logerror.log文件中找到出错的原因。

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

nginx最广泛的应用场景就是代理服务器。代理服务器的工作流程通常是:接收请求、将请求转发给被代理的服务器、从被代理的服务器接收回应、将回应发送给客户端。

我们接下来将配置一个基础的代理服务器。若是图片请求,则该服务器会从本地目录解析文件,否则将会将请求发送给一个被代理的服务器。本示例中的两个服务器将在单个nginx实例中定义。

首先,在nginx的配置文件中增添一个server块来充当被代理的服务器,server块中的内容如下:

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

这样就配置好一台监听8080端口的服务器(之前因为使用了标准的80端口,所以不需要使用listen指令),并将所有请求映射到本地文件系统的/data/up1目录。创建该目录,然后将index.html放到该目录中。注意,root指令位于server上下文中。若选中的location块没有包含自己的root指令,系统就会自动使用在server上下文中定义的root指令。

接下来,将上一节中用到的服务器配置修改为代理服务器的配置。在第一个location块中加入proxy_pass指令,指令的参数中应声明代理服务器的协议、名称和端口。

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

第二个 location 块指令目前将以/images/开头的请求映射到/data/images目录下的文件。我们将修改该指令,使其参数可以匹配带有典型图片文件扩展名的图片请求。修改后的 location 快是这样的:

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

location指令的参数是正则表达式,可匹配所有以 .gif.jpg.png结尾的URI。使用正则表达式作为参数时应先在前输入~。相应的请求将被映射到 /data/images 目录。

当nginx根据请求选择location块时,它首先检查参数为前缀的location指令,记住前缀最长的location块,然后再检查正则表达式。如果某个正则表达式匹配成功,nginx会选择这个location块,否则使用先前记住的location块。

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

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

该服务器会过滤以.gif.jpg.png结尾的请求,并将它们映射到/data/images目录(通过将URI拼接到root指令的参数后), 然后所有其他请求传递给之前配置的被代理服务器。

为使新的配置文件生效,按照之前介绍的方式将reload信号发送给nginx。

除上面用到的指令外,可以使用很多其他的指令对代理服务器进行深度配置。

配置 FastCGI 代理

可以使用nginx将请求路由到FastCGI服务器,在这种服务器上运行的程序通常由多种框架和编程语言(例如PHP)写成。

最基础的FastCGI服务器配置中会用到fastcgi_pass指令(而非proxy_pass 指令)以及fastcgi_param 指令(用于声明需传递给FastCGI服务器的参数)。假设可通过localhost:9000访问FastCGI。以之前的代理服务器配置为模板,用fastcgi_pass指令替代proxy_pass指令,然后将fastcgi_pass的参数指定为 localhost:9000。在PHP中,SCRIPT_FILENAME 参数用于确定脚本名称,QUERY_STRING 参数用于传递请求参数。最终的配置文件将会是这样:

 server {
     location / {
         fastcgi_pass  localhost:9000;
         fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
         fastcgi_param QUERY_STRING    $query_string;
     }
 
     location ~ \.(gif|jpg|png)$ {
         root /data/images;
     }
 }

这样就配置了一个可将所有请求(静态图片请求除外)路由到 localhost:9000处使用 FastCGI协议的被代理服务器。


欢迎到 作者github主页交流

你可能感兴趣的:(【nginx】新手手册(翻译))