原文地址:Beginner`s Guide
参考文档:Nginx原理
本文翻译自上述地址(Nginx官网新手指引),我自己感觉到不能表达正确的地方使用了原文,可能还存在其他我没有意识到的转述错误,文章仅供参考。
入门手册
这份手册将给出关于 nginx 的一个基本指引,和一些基于这些指引可以完成的简单应用。这份手册将假设阅读者现在已经安装了 nginx。如果没有,出门左转。这份手册将会描述 nginx 的启动、停止、配置重载,解释配置文件,同时怎么应用 nginx 作文件服务,怎么将nginx 配置成一个代理服务器,怎么通过 FastCGI Application 连接 nginx。
nginx 有一个主进程(master process)和若干个子进程(worker process)。主进程的作用是为了方便对配置文件进行管理,同时可以管理子进程。是子进程在真正的处理请求(nginx employs event-based model and os-dependent mechanisms to efficiently distribute requests among worker process,漏了翻译这句),子进程的数量是在配置文件中定义的。
配置文件描述了 nginx 及其模块的运行。一般情况下,配置文件叫做 nginx.conf,被放置在目录 /usr/local/nginx/conf,/etc/nginx,或者 /usr/local/etc/nginx 下面。
执行、停止和重载配置
运行可执行的文件,就能开启 nginx(to start nginx, run the executeable file)。一旦 nginx 被开启,就可以通过调用 -s 参数来控制 nginx,像下面这个样子
nginx -s signal
signal 可以为:
- stop —— 快速关闭
- quit —— 安全关闭
- reload —— 重载配置
- reopen —— 重载日志
比如,当一个子进程正在处理请求,而你想停止它,可以使用
nginx -s quit
该命令应该由开启 nginx 的用户下达。
只有当 nginx 收到重载的指令后(或者 nginx 被重启),之前配置文件中的修改才会生效。重载配置,使用
nginx -s reload
一旦当主进程收到重载配置的指令,新配置文件中的语法合法性将会被检查,新的配置也将被尝试使用。如果成功,主进程将开启新的子进程,并且给旧的子进程发送指令,关闭旧的子进程。如果新的配置失败,主进程将会回滚,并且继续使用旧的配置。旧的子进程会接收到指令,停止接收新的请求,在处理完当前请求后关闭。
在一些 unix 工具的帮助下,一些像 kill 这样的指令也会被发送到 nginx。在这种情况下,指令通过进程 id 直接作用于 nginx 进程。默认情况下,nginx 的主进程 id 会被写在 /usr/local/nginx/logs 或者 /var/run 目录下的 nginx.pid 文件中。例如,假设主进程的 id 是 1628,使用 QUIT 命令可以进行安全的关闭
kill -s QUIT 1628
可以通过使用 ps 命令来查看正在运行的 nginx 进程,比如
ps -ax | grep nginx
获取更多关于发送指令给 nginx 的信息,请查看 Controlling Nginx。
配置文件结构
nginx 由模块组成,这些模块通过配置文件中一些特定准则来进行控制。这些准则被划分为单准则和准则块。单准则由名字和参数组成,名字和参数之间通过空格进行区分,单准则以分号(;)结尾。准则块和单准则具有相同的结构,但不同于分号,准则块使用一堆花括号结尾({ })。如果一个准则块内部包含了其他准则,这些准则被称为 context(比:events,http,server 和 location)。
Directives placed in the configuration file outside of any contexts are considered to be in the main context...
以井号(#)开始的行是注释。
文件服务(serving static content)
WEB服务器很重要的一个功能就是提供文件服务(图片,静态HTML页面)。下面将提供一个实例,这个实例将会根据请求,从服务器的不同目录提供文件。(/data/www,HTML目录,/data/images,图片目录)。为了完成这个实例,将需要修改配置文件,并将一个包含两个 location块 的 server块 放置到 http块 中。
首先,创建 /data/www 目录,将 index.html(随便写点东西) 放到里面,然后再创建 /data/images 目录,并往目录里面塞一些图片。
接下来,打开配置文件。默认的配置文件已经包含了一些 server块 的示例,大部分以注释的形式呈现。现在去掉 server块 的注释,并添加如下一个 server块:
http {
server {
}
}
总的来说,配置文件中可以包含很多 server块,这些 server块 通过监听端口和服务名(server name)进行区分。一旦 nginx 决定了使用哪个 server 处理请求,nginx 将会拿到请求头中的 URI 与server块 中的 location准则块 进行参数比较。
在上面的 server块 中添加下列 location块。
location / {
root /data/www;
}
这个 location块 指定了当请求中的 URI 以 “/” 为前缀的时候的 nginx 处理规则。如果请求匹配了规则,URI 将会添加到 root规则 中声明的路径,也就是说会从/data/www
路径获取请求文件。如果 location块 中有多个地方可以匹配请求的 URI,nginx 将选择最长的那个。上面的 location块 提供了最短的前缀,如果其他的 location块 对URI的匹配都失败了,这个最短的将会被使用。
接下来,添加第二个 location块:
location /images/ {
root /data/images;
}
这个规则将匹配以 /images/ 开始的请求(“/” 规则也可以匹配同样请求,但 nginx 将选取最长的)。
最终的 server块 将是下面这个样子:
server {
lcation / {
root /data/www;
}
location /images/ {
root /data/images;
}
}
这就是一个在地址 http://localhost 监听标准端口 80,可以生效的一个 server 配置。作为对以 /images/ 开头请求 URI 的回应,服务器将会发送 /data/images 目录的文件。比如,作为对 http://localhost/images/example.png 的回应,nginx 将会发送 /data/images/example.png 文件,如果不存在上述文件,nginx 将会发送一个 404。不以 /images/ 开头的请求将会去匹配 /data/www 目录。比如,作为对 http://localhost/some/exmaple.html 的回应,nginx 将发送 /data/www/some/example.html 文件。
想要让新的配置生效,如果没有开启 nginx,那就开启 nginx,或者再开启了 nginx 的情况下使用 nginx -s reload
。
当结果并没有像期待的那样时,你可以去 /usr/local/nginx/logs 或者 /var/log/nginx 目录中的 access.log 和 error.log 文件寻找原因。
简单代理服务(setting up a simple proxy server)
ngixn 的一个广泛用途是作为一个代理服务器,这意味着 nginx 作为一个获取请求,转发给被代理的服务器,从被代理的服务器获取内容,然后转发给客户端的代理服务器。
接下来将配置一个基本的代理服务器,这个代理服务器将会从本地目录获取请求中的图片,并将其他请求转发给被代理的服务器。在这个例子中,两个服务器都将是 nginx 服务器(both servers will be defined on a single nginx instance)。
首先,在被代理的服务器的配置中添加一个 server块,内容如下:
server {
listen 8080;
root /data/up1;
location / {
}
}
这是一个监听了 8080 端口的简单服务器(如果标准 80 端口没有被使用的话,这里是不用进行特别指定的),这个服务器将会去本地文件系统中的 /data/up1 目录处理所有请求。创建 /data/up1 目录,并放置 index.html。请注意 root 规则被放置到了 server 中。这种 root 规则将会在下面情况被使用,如果被匹配的 location块 没有自己的 root 规则。
接下来,使用之前的配置,并稍作修改就能使之成为一个代理服务器配置。在第一个 location块 中,将被代理服务器的协议、名称和端口号作为参数写到 proxy_pass规则(这个例子中被代理的服务器时 http://localhost:8080):
server {
location / {
proxy_pass http://localhost:8080;
}
location /images/ {
root /data/images;
}
}
我们将修改当前从 /data/images/ 目录匹配 /images/ 前缀第二个 location块,使之可以匹配常见图片后缀,像下面这样:
location ~ \.(gif|jpg|png)$ {
root /data/images;
}
这是一个用来匹配以 .gif,.jpg,.png 结尾的 URI 的常用表达。一个常用的表达应该使用 ~ 开头。被匹配的请求将会到 /data/images 目录。
当 nginx 选择一个 location块 来处理请求时,首先会检查可以匹配请求 URI 的 location规则,记住最长的那个 location,然后才去匹配正则表达式的。如果有一个正则表达式匹配成功,nginx 将会选取这个 location,或者选取之前记住的那个。
最终的代理配置将会像下面这个样子:
server{
location / {
proxy_pass http://localhost:8080/;
}
location ~ \.(gif|jpg|png)$ {
root /data/images;
}
}
这个服务器将匹配以 .gif,.jpg,.png 结尾的请求,并将其 map 到 /data/images 目录(通过在 root规则 中添加参数),同时将其他所有请求转发到上面配置中被代理的服务器。
关于代理服务器配置,有以下更多规则可供参考。
FastCGI 代理配置
ngixn 可以用来为很多建立在不同框架和语言(比如PHP)的 FastCGI 应用提供 route requests。(nginx can be used to route requests to FastCGI servers which run applications built with various frameworks and programming laguages such as PHP)。
nginx 作为一个 FastCGI 服务器时最基本的配置包括 fastcgi_pass规则。fastcgi_param规则 可以为 FastCGI 服务器配置参数。假设可以通过 localhost:900 访问 FastCGI 服务。使用之前的段落作为一个基本的代理配置,使用 fastcgi_pass 规则替代 proxy_pass规则,并且将参数更改为 localhost:9000。在PHP中,参数 SCRITP_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;
}
}
This will set up a server that will route all requests except for requests for static images to the proxied server operating on localhost:9000 througn the FastCGI protocol.