Nginx 新手村
某位天皇巨星曾经说过:信心比黄金更重要。深以为然,我们学习一门技术,首要的是要对其建立信心。如何建立信心?没有什么比拿到一个能跑起来的例子更能建立起坚挺的信心了。
对于 Nginx,官方的入门文档还不错。今天就让我们一起学习一下 Nginx 官网的新手指南。
以下为 Google 翻译 + 人工校正的结果。
本指南给出了对 nginx 的基本介绍,并描述了一些 nginx 能做的简单任务。我们假设你已经安装好了 nginx,如果没有,请参阅安装页面。本指南介绍如何启动和停止 nginx、重新加载配置,说明配置文件的结构,并介绍如何通过设置 nginx 提供静态内容,如何将 nginx 配置为代理服务器,以及如何将 nginx 连接到一个 FastCGI 应用程序。
Nginx 有一个 master 进程和几个 worker 进程。Master 进程的主要目的是读取和评估配置,并维护 worker 进程。Worker 进程对请求进行实际处理。Nginx 使用基于事件的模型和依赖于操作系统的机制来高效地在 worker 进程间分配请求。Worker 进程的数量在配置文件中定义,在给定的配置中可能已经设置为一个固定值,或者自动调整为和可用 CPU 核心数一样的数值(请参阅 worker_processes)。
配置文件规定了 nginx 及其各模块的工作模式。默认情况下,配置文件名称为 nginx.conf,存放路径为 /usr/local/nginx/conf 或 /etc/nginx 或 /usr/local/etc/nginx。
Starting, Stopping, and Reloading Configuration
首先通过运行可执行文件来启动 nginx,如 sudo /etc/init.d/nginx start/stop/restart
。启动之后,所有的控制就可以通过 nginx -s <signal>
来进行。
Signal 可以是这几个值:
+ stop —— 快速关闭
+ quit —— 正常关闭
+ reload —— 重载配置文件
+ reopen —— 重新打开日志文件
例如,要等待 worker 进程处理完当前请求后再停止 nginx,就执行这条命令:
nginx -s quit # 应使用启动 nginx 的用户来执行
更改配置文件之后,需要重新加载配置或重启 nginx 才会生效。重载配置命令为:
nginx -s reload
一旦 master 进程接收到重新加载配置的信号,它将检查新配置文件的语法有效性,并尝试应用其中提供的配置。如果成功,则 master 进程启动新的 worker 进程,并发送消息给旧 worker 进程,请求关闭进程。否则,master 进程回滚更改并继续使用旧配置。旧 worker 进程接收到关闭命令,则停止接受新的连接,并继续服务当前的请求,直到服务完毕,旧 worker 进程才退出。
也可以通过 Unix 工具发信号给 nginx 进程,比如 kill。在这种情况下,信号直接发送给具有给定进程 ID 的进程。Nginx master 进程的进程 ID 默认写入 /usr/local/nginx/logs 或 /var/run 下的 nginx.pid 文件中。例如,如果 master 进程 ID 是1628,要发送 QUIT 信号来关闭 nginx ,执行:
kill -s QUIT 1628
可以通过 ps 命令来获取到所有运行中的 nginx 进程。
ps -ax | grep nginx
关于发送 signal 给 nginx 的更详细内容,请查看 Controlling nginx。
Configuration File’s Structure
Nginx 包含在配置文件中指定的指令控制的模块。指令分为简单指令和块指令。简单指令由用空格分隔的名称和参数组成,并以分号(;)结束。块指令与简单指令有相同的结构,但不是以分号结束,而是以一系列由大括号({和})包围的附加指令结束。如果一个块指令在大括号内可以有其他的指令,它就被称为一个上下文(例如:events,http,server 和 location)。
配置文件中处于任何上下文之外的指令被认为是在主上下文中。event 和 http 指令在主上下文中,server 在 http 上下文中,而 location 在 server 上下文中。
一行中 # 之后的部分为注释。
Serving Static Content
一个重要的 Web 服务器功能是提供文件(如图像或静态 HTML 页面)。下面实现一个示例,根据请求从不同的本地目录中提供文件: /data/www(可能包含 HTML 文件)和 /data/images(包含图像)。这需要修改配置文件,在 http 块中添加一个包含两个 location 块的 server 块。
首先,创建 /data/www 目录,放一个包含了任意文本内容的 index.html 文件在里面,创建 /data/images 目录,放一些图片在里面。
然后,修改配置文件。配置文件中默认已经包含了一些被注释掉的样例 server 块。注释掉所有的 server 块,新建一个我们自己的:
http {
server {
}
}
一般来说,配置文件可能包含几个 server 块,这些 server 块通过不同的侦听端口和名称来区分。一旦 nginx 决定哪个 server 块处理请求,就会根据 server 块内定义的位置指令的参数来匹配请求头中指定的 URI。
添加以下的 location 块到 server 块中:
location / {
root /data/www;
}
该 location 块使用 / 与请求中的 URI 进行比较。为了匹配请求,URI 将被拼接到根指令中指定的路径后,即 /data/www 后面,以形成本地文件系统上所请求文件的路径。如果有几个匹配的 location 块,nginx 会选择最长的前缀。上面的 location 块提供了最短的前缀,长度为1,所以只有当所有其他 location 块都不能提供匹配时,才会使用这个块。
接着添加第二个 location 块:
location /images/ {
root /data;
}
该 location 块 匹配以 /images/ 开始的请求(location / 也可以匹配,但它比 /images/ 要短)。
最后 server 块的配置就是这样:
server {
location / {
root /data/www;
}
location /images/ {
root /data;
}
}
这已经是一个在标准80端口上侦听的服务器的工作配置,可以在本地机器上访问http://localhost/。为了响应以 /images/ 开头的 URI 的请求,服务器将从 /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 文件。
现在,重载配置文件以使我们的配置生效,如果 nginx 还没有启动,启动即可生效。
nginx -s reload
如果 nginx 没有按我们的设想工作,可以通过 access.log 和 error.log 查找原因,两个日志文件路径为 /usr/local/nginx/logs 或 /var/log/nginx。
Setting Up a Simple Proxy Server
Nginx 常被用作代理服务器,这意味着 nginx 服务器接收请求并转发给被代理的服务器,然后从被代理的服务器获取响应转发给客户端。
我们将配置一个基本的代理服务器,为图像请求返回本地目录的文件,并将其他请求转发给被代理的服务器。在这个例子中,我们在一个 nginx 实例上定义这两个服务器。
首先,通过在配置文件中添加一个 server 块来定义被代理的服务器:
server {
listen 8080;
root /data/up1;
location / {
}
}
这是一个简单的侦听端口8080的服务器(以前,因为使用标准端口80,listen 指令没有被指定),并将所有请求映射到本地文件系统上的 /data/up1 目录。创建这个目录,并把 index.html 文件放进去。请注意,root 路径放置在 server 上下文中。当选中用于响应请求的 location 块没有自己的根路径时,使用这个根路径。
接下来,使用上一节中的 server 配置并对其进行修改,使其成为代理服务器配置。在第一个 location 块中,将 proxy_pass 指令与参数中指定的代理服务器协议、名称和端口(在本例中为 http://localhost:8080)相加:
server {
location / {
proxy_pass http://localhost:8080;
}
location /images/ {
root /data;
}
}
我们将修改第二个 location 块,该块当前使用 /images/ 前缀将请求映射到 /data/images 目录下的文件,以使其与具有典型文件扩展名的图像请求匹配。修改后的 location 块如下所示:
location ~ \.(gif|jpg|png)$ {
root /data/images;
}
该参数是一个匹配以 .gif,.jpg 或 .png 结尾的所有 URI 的正则表达式。这里正则表达式应该以〜开头。相应的请求将被映射到 /data/images 目录。
当 nginx 选择一个 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 指令的参数后面),并将所有其他请求传递到上面配置的被代理服务器。
重载配置文件,以应用代理配置。
还有更多的指令可以被应用到代理服务器配置中。
Setting Up FastCGI Proxying
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 参数用于传递请求参数。由此产生的配置将是:
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;
}
}
应用了该配置的服务器将把除了图片请求以外的请求通过 FastCGI 协议路由到被代理的服务器(这里是 localhost:9000)。