新人指导
这是一个关于Nginx的基本介绍以及你能用它做一些简单的工作的描述。现在假定你已经把Nginx安装到你的机器上了。如果你还没有安装的话,请参考下面这篇文章(CentOs环境下安装Nginx)或者Nginx的官方安装指导。通过这个指导,你可以了解到如何启动、暂停、以及重新启动Nginx,这个指定也会讲解配置文件的结构、如何设置Nginx来为外部静态资源提供服务、如何设置Nginx来作为一个代理服务器,以及怎么通过一个FastCGI来连接Nginx。
Nginx有一个主进程(master process)和几个工作进程(worker process)。主进程的主要目的是用来读取加载配置文件维护工作进程。工作进程用来处理真正的请求。Nginx利用事件驱动模型和基于操作系统的机制在工作进程之间高效的分配请求。工作进程的数量是在配置文件中定义的(conf/nginx.conf)。它可能是不变也可以调整到空闲的CPU的核心数(最大不超过CPU的)核心数。
Nginx的工作方式和运行模块是在配置文件中定义的。通常默认的配置文件名为nginx.conf。这个文件可能在/user/local/nginx/conf、/etc/nginx、或者/user/local/etc/nginx目录下(默认情况下是在/usr/local/nginx/conf这个目录下)启动、暂停、或者重新加载配置文件你需要运行可执行文件来启动Nginx(即:命令)。一旦Nginx被启动了,你就可以通过带
-s 参数的命令来控制Nginx。语法如下:
./nginx -s signal(信号) 或者 nginx -s signal(信号)
信号(命令)可以是如下几种:
stop 快速关闭
quit 优雅的关闭
reload 重新启动
reopen 重新打开日志文件
例如:如果你需要等工作进程处理完当前请求之后再关闭Nginx,你可以使用下面这个命令:
./nginx -s quit 或者 nginx -s quit
注意:这个命令需要在启动nginx的用户下面执行。
如果你更改了配置文件的话,你可以通过执行下面这个命令来重启Nginx来使更改生效。
./nginx -s reload
一旦主进程接收到重新加载配置文件的信号(命令)之后,它会检查配置文件的正确性,如果无误的话,主进程就会尝试运行新的配置。如果运行成功的话,主进程会启动新的工作进程并向旧的工作进程发送信息,旧的进程会在处理完请求之后关闭。否则,主进程会回滚配置文件的改变,继续在旧的配置文件上工作。旧的工作进程将会收到一个关闭的信号(命令),它将不在接收新的连接并在处理完所有的请求之后退出。
你也可以用Unix的方式来给Nginx进程来发送信息(命令),例如:杀死程序。在下面的这个例子中,将会直接向给定的进程号发送信号
(命令)。通常主进程的进程号被写在/usr/local/nginx/logs 或者 /var/runn目录下的nginx.pid这个文件中。例如:如果主进程的进程号
为1628,优雅退出的命令如下:
kill -s QUIT 1628
你可以用ps指令来得到所有的正在运行的Nginx进程。例如:
ps -ax | grep nginx
更多的信号(命令信息)请参考Controlling nginx(http://nginx.org/en/docs/control.html)。
配置文件的结构
配置文件中的指令指定了nginx包含的模块。这些指令被分为简单指令和块指令。一个简单指令包含名字和参数,它们之间用空格分隔,并已分号(;)结尾。块指令拥有和简单指令相同的结构。不同的是,块指令需要用{}括起来。如果一个块指令中还有其他的带{}的指令,这个块指令被称为一个上下文。例如events、http、server、location。
任何指令都需要经过慎重考虑之后才能放到main上下文中。events和http指令在main上下文中,server在http的上下文中,location在server的上下文中。#号之后的是重要的一些注释。
服务静态资源
Web服务器的一个重要任务是为外部文件(例如:图片、静态页面)提供服务。下面你将会看到这样一个例子:在一个请求中,一些文件将会从不同的本地目录(/data/www用来提供静态html页面 /data/images包含图片)中被提供。要想实现这样的功能,你需要设置配置文件。在一个http块中包含一个server块,server块中包含两location块。
首先创建/data/www这样的一个目录,在这个目录中放一个index.html文件,在这个文件中随便写一些内容即可。然后创建一个/data/images目录,在这里面随便放入一些图片。
接下来打开配置文件,你会发现在配置文件中有一些默认的server块的例子。这些大部分都被注释掉了。现在把所有的这样的块都给注释掉,然后自己新建一个server块:
http{ server{ } }
通常,配置文件中包含几个server块,他们用来监听的不同的端口和不同的服务名。nginx中server处理一个请求的时候,它将会测试请求的URI是否和server中location的参数是否匹配。下面我们来在server块中加入一个location块。
location / { root /data/www; }
在这个location块中,指定带"/"的前缀来和请求中URI来匹配。为了匹配请求文件,URI将会被添加到根指令上。也就是,会添加到/data/www上。在本地文件系统中找到请求的文件。如果这里存在几个匹配上的location块的话,nginx会选择最精确的那一个。上面的例子中提供的是最短的前缀,它只有一个字符,只有当所有的其他的location都匹配失败的时候,才会使用这个location。
接下来我们来写第二个location块。
location /images/ { root /data; }
它将会匹配以/images/开头的请求。现在的server块应该是下面这样的:
server { location / { root /data/www; } location /images/ { root /data; } }
现在配置文件中有一个已经正在运行的server,它在监听80端口,你可以通过http://localhost/来访问它。现在我们用nginx -s reload来重新加载Nginx。如果一个以"/images/"开头的请求,服务器将会从/data/images目录中发送文件到响应头。例如:如果有这样一个请求ttp://localhost/images/example.png,nginx将会把/data/images/example.png这个文件发送到响应头。如果这个文件不存在的话,将会报404.如果请求中的URI不是以"/images"开头的话,将会在/data/www目录下寻找对应的文件。例如:有这样一个请求:http://localhost/some/example.html,ngnix将会发送/data/www/some/example.html中的文件到相应头。如果Nginx没有按照你预想的那样工作的话,你可以到/usr/local/ngxin/logs或者/var/log/nginx这两个目录下的access.log和error.log文件中来查找原因。
设置代理服务器
Nginx最常用的一个用途是作为代理服务器。我们将会配置一个很基础的代理服务器,这个服务器是用来代理一个从本地目录请求图片的服务。在这个例子中,你将会看到两种代理方式的运用。
首先,在nginx的配置文件中新增几个server块,内容如下:
server { listen 8080; root /data/up1; location / { } }
这个简单的服务器监听8080端口,并且映射所有的请求到/data/up1这个本地目录下。如果这个目录不存在的话,请先创建这个目录,并在这个目录中放入index.html文件。请注意:根指令要放到服务器的上下文中。如果被选中的location中没有根指令的话,将会使用这个根指令。
接下来,在上面的server块中的第一个location块里添加proxy_pass指令,这个指令包含协议、host、端口。
server { location / { proxy_pass http://localhost:8080; } location /images/ { root /data; } }
我们可以修改第二个location块,它原来是映射"/images"开头的请求到/data/images目录下。但是这个和我们常规的需求可能不太一样,所以我们需要这样修改它:
location ~ \.(gif|jpg|png)$ { root /data/images; }
这是一个正则表达式,用来匹配所有以.gif、.jps和.png结尾的请求。一个正则表达式应该以~开头。现在所有符合的请求将会映射到/data/images这个目录下面。
当Nginx选择一个location块来服务一个请求的时候,它会先检查location指令的前缀,然后记住最长的一个前缀,然后检查正则表达式。如果一个正则表达式匹配上的话,它会选择这个location,否则的话,它会选择之前记住的那个。
最后的代理服务器的配置是这样的:
server { listen 8080; root /data/up1; location / { proxy_pass http://localhost:8080/; } location ~ \.(gif|jpg|png)$ { root /data/images; } }
这个server将会过滤所有的以.gif、
.jpg、和
.png结尾的请求,并映射到/data/images这个目录下。当然,别忘了在根指令下添加URI。其他的请求将通过代理服务器来处理。