概述
译文。参考官方文档
这篇指南描述了如何启动、停止nginx,重新加载配置,并且解释了配置文件的结构,描述了如何设置nginx去服务静态内容,如何配置nginx作为代理服务器等。
nginx有一个主进程和若干个工作进程。主进程的主要目的就是读取和评估配置,并且维护工作进程。工作进程实际上是处理请求。nginx使用以事件为基础的模型并且依赖操作系统的机制去描述在工作进程中的请求。工作进程的数量定义在配置文件中,对于一个特定的配置,这个数量可能是固定的,或者根据CPU的线程数来自动调整。
nginx和它的模块的工作方式是由配置文件决定的。默认情况下,配置文件是以nginx.config
命名的,并且在/usr/local/nginx/conf
目录,/etc/nginx
目录,或者/usr/local/etc/nginx
目录
开始,停止和重新加载
启动nginx,运行可执行文件。一旦nginx已经启动,它就可以通过调用带有-s
的参数来控制。使用语法:nginx -s signal
singal
可以被下面任意一个替换
-
stop
– 快速停止 -
quit
– 优雅的停止 -
reload
– 重新加载配置文件 -
reopen
– 重新打开日志文件
例如,等所有工作进程完成服务器的当前请求时,停止nginx进程,用如下命令nginx -s quit
重新加载配置文件的命令发送到nginx或者nginx重启的时候,配置文件改变的内容才会生效。重新加载执行nginx -s reload
一旦主进程接收到重新加载的信号,它会检查新的配置文件的语法是否合法,并且试着去执行配置文件里的内容。如果成功了,主进程会开始新的工作进程并且发送信息给老的工作进程,请求它们停止。否则主进程就会回滚配置并继续执行老的工作进程。老的工作进程接收到停止的命令,停止接收新的请求连接并且继续执行当前的请求直到所有的请求都处理完成。
查看正在执行的nginx进程列表,用这个方式:ps -ax | grep nginx
配置文件结构
nginx是由定义在配置文件中的指令所控制的模块组成。这些指令被分成简单的指定和成块的指令。一个简单的指令由名称和用空格、分号分隔开的参数组成。块指令和简单的指令有着相同的结构,但是替代分号的是,它是由一系列环绕在括号花括号周围的附加的指令结尾。如果一个块指令在内部的括号里有其他的指令,它被称为内容(列如:events
,http
,server
,location
)
处在配置文件中所有内容之外的指令被认为是main
内容。events
和http
指令存在main
内容中,server
在http
,location
在server
提供静态内容
Web服务器一个重要的任务就是提供外部文件(比如像图片或者静态的HTML请求)。你可以实现一个例子,根据请求文件将会从不同的目录中提供:/data/www
里面包含了HTML文件,/data/images
包括了图片。这需要编辑配置文件并且要在http
块中设置带有两个location
块的服务块。
首先,创建/data/wwww
文件夹并且在文件夹里面放一个带有一些文字内容的index.html
文件,然后创建/data/images
文件夹把一些图片放进去。
下一步,打开配置文件,默认的配置文件已经包括了一些server
块的例子,大多数是注释掉了。现在注释掉所有的块,并开始一个新的server
块。
http {
server {
}
}
通常来说,配置文件可能包含一些通过监听的端口或者服务名称进行区分的server
块。一旦nginx决定了哪一个server去处理一个请求,它根据服务器块中定义的位置指令的参数测试请求头中指定的URI。
添加如下location
块到server
块中
location / {
root /data/www;
}
location
块定义了“/”前缀同来自请求中的URI做比较。对于匹配的请求,这个URI会被添加到定义在root
指令的路径中,也就是说,对于/data/www
,会在本地文件系统上形成被请求的路径。如果有许多匹配的location
块,nginx会选择最长前缀的一个。上面的location
块提供了长度是一的最短的前缀,所以只有其他的location
块无法提供匹配是,才会使用这个位置块。
下一步,添加第二个位置块
location /images/ {
root /data;
}
对于以/images
开始的请求将会有一个匹配(location /当然也配置这些请求,但是这是更短的前缀)
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错误。没有以/images/
开头的URI请求将会匹配到/data/www
目录。例如,响应http://localhost/some/example.html
的请求,nginx会发送/data/www/some/example.html
文件。
为了让新的配置生效,启动nginx如果还没有启动,如果启动了就执行reload命令:nginx -s reload
以防事情没有像预期那样工作,你可以试着在access.log和error.log找原因,文件在/usr/local/nginx
或者/var/log/nginx
设置一个简单的代理服务器
nginx使用最频繁之一的就是把它设置为代理服务器,这也就意味着服务接收请求,并把他们传递到代理服务器,然后从代理服务器取回响应并发送到客户端。
我们将配置一个基本的代理服务器,它使用本地目录中的文件来处理图像请求,并将所有的请求发送到一个代理服务器。在这个示例中,两个服务器都定义在一个nginx实例。
首先,通过在nginx配置文件中添加一个包含如下内容的Server块来定义代理服务器
server {
listen 8080;
root /data/up1;
location / {
}
}
这将是一个监听8080端口的简单的服务器(很明显,由于使用了标准的80端口,所以listen
指定没有被指定)并且将所有的请求映射到本地的/data/up1/
目录。创建这个目录然后把index.html
文件放到这个目录下。注意的是root
指令被放在了server
内容里。当为处理请求选定的location
块不包括自己的根指令的时候,使用这样的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;
}
这个参数是一个匹配所有以.gif
,.jpg
,或者是.png
结尾的URI的正则表达式。所有的正则表达式都应该以~
开始。符合响应的请求将会映射到/data/images/
文件夹。
当nginx选择一个location
块去处理一个请求的时候,它首先要检查指定前缀的location
指令,用最长前缀记住位置,然后检查正则表达式。如果有匹配的正则表达式,nginx会挑选这个位置,否则的话会选择之前记住的一个。
一个代理服务器的配置结果像这样
server {
location / {
proxy_pass http://localhost:8080/;
}
location ~ \.(gif|jpg|png)$ {
root /data/images;
}
}
服务器会过滤以.gif
,.jpg
,.png
结尾的请求并且映射到/data/images/
文件夹下面(通过添加root
指令的URI参数),然后将其他的请求分配给上面配置的代理服务器。
为了使新的配置文件生效,发送relaod信号给nginx