本文共 4416 字,大约阅读时间需要 14 分钟。
说明:“Nginx烂笔头”系列Blog是自己对Nginx官方文档的的翻译,用作阅读笔记便于日后查阅的成分居多,无关重要内容会删减,也可能会加入自己的理解。囿于个人水平,一些专业的名称翻译不会太准确,推荐查看。翻译内容如果有错误,欢迎指正。
本文翻译自Nginx官网网页文档。
指引描述了如何启动、停止nginx和重新加载nginx,解释了配置文件的结构并且说明使用nginx做静态文件服务器该如何设置、如何把nginx配置成一个代理服务器和如何把它作为一个fastCGI应用连接。
Nginx有一个主线程和若干个服务线程(Worker Process)。主线程的功能是读取并验证配置文件。服务线程处理各个请求。Nginx采用了事件驱动和依赖系统的架构来通高效地分发请求给各个服务线程。服务线程的数量定义在配置文件上,可以通过配置文件修改或者根据可用的CPU核心数来自动调整(参看)。
Nginx和nginx的模块是由配置文件决定的。配置默认名称为nginx.conf,一般放在/usr/local/nginx/conf、/etc/nginx或者/usr/local/etc/nginx路径下。
启动nginx,执行ngiinx可执行文件就行。
./nginx
当nginx启动之后,它可以通过调用-s参数的方式控制。用下面的语法:
./nginx -s [signal]
signal可选项可以是
例如,要等待所有服务线程完成现在正在处理的请求后再关闭nginx可以使用
./nginx -s quit
这个命令需要使用启动nginx服务时的用户执行
在reload命令和重启nginx之前,修改配置文件不会应用到nginx上。使用下面命令重新加载配置文件
./nginx -s reload
当nginx的主线程收到重新加载信号时,先验证新配置文件的语法是否正确,然后尝试在主线程中应用新的配置。如果应用成果,主线程会开启新的服务线程并发送关闭信号给旧的访问线程。否则,主线程会回滚到原来的配置并继续使用旧的服务线程去工作。旧的服务线程接到关闭信号后会停止接受新的请求并且会继续处理线程中所有的请求导结束。然后,旧线程关闭。
信号也可以通过Unix的一些工具例如kill
命令。在这种情况下,信号直接发送给指定ID的线程。Ngix的主线程id一般会被记录在/usr/local/nginx/logs
或者/var/run
的nginx.id
文件中。例如,主线程id是1268,发送quit信号:
kill -s QUIT 1628
Nginx由不同的模块组成,这些模块是有配置文件中的指令(Directives)控制的。指令分为简单指令和快指令。简单指令由名字和参数组成,用空格分割分号结尾。快指令和简单指令的结构一样,不同的是它是以大括号包围的一组简单指令结束的。如果一个快指令里面包含有其他的快指令,它叫上下文(例如:events,http,server和location)。
放置在任何上下文之外的指令被称为主上下文(main context)。events和http块指令(上下文)在主上下文中(是否可以理解为主上下文就只有这两个指令?),server块指令在http上下文中,location指令在server指令块中。
以#号开头的一行在配置文件中是注释。
Web服务器的一个重要任务就是提供文件(比如图片或者静态Html页面)。你可以写一个根据不同请求返回不同本地路径文件的例子:/data/www
(里面有HTML页面)和/data/images
(里面有图片)。这需要在配置文件的http上下文中配置server上下文并且在server上下文中添加两条location块指令。
先创建好两个路径,放置一个index.html和图片在对应目录。
然后,打开配置文件,默认的配置文件已经包含了server,大部分被注释掉了。添加一个新的server指令块。
http { server { }}
通常,配置文件都会包含几个server块指令,用server监听的端口和server names来区分。当nginx决定了那个server进程去处理请求时,它会尝试对比请求头中的url和server快指令中的location块指令定义的url参数。
添加下面的location块指令到server块指令。
location / { root /data/www;}
这个location块指令指定了“/”前缀来对比请求中的url。对于匹配上url的请求,请求的url会被加上root指令中指定的地址,就是/data/www
,来组成本地文件系统的访问路径。如果同时有多个location块指令匹配满足,nginx会选择哪个最长的前缀。上面配置的location块指令是最短的前缀,只有长度1,所以,nginx会在其他location没有匹配上的时候才使用它。
接下来,添加一个如下的locatin块指令
location /images/ { root /data;}
他会匹配请求url以/images/
开头的请求(location /同样匹配,但是长度比这里短)
server { location / { root /data/www; } location /images/ { root /data; }}
上面的配置已经可以在一个标准的80端口下使用的配置了,并且可以在本地机器上使用http://localhost
地址访问。处理以/images
开头的url时,nginx会把/data/images
目录下的文件放回给请求。例如:一个请求为http://localhost/images/example.png
,nginx会返回/data/images/example.png
这个文件。如果文件不存在,nginx会返回一个404错误。没有以/images
开头的url会被定位到/data/www
目录。例如,请求http://localhost/some/example.html
会返回/data/www/some/example.html
文件。
想要应用新写的配置文件,启动nginx或者重启nginx用reload信号。
./nginx -s reload
如果有些没有按照你的期望来运行,你可以在路径
/usr/local/nginx/logs
或者/var/log/nginx
查看access.log和error.log文件来寻找原因。
nginx的一个常用功能就是用作代理服务器,所谓代理服务器就是一个接受请求,转发请求到代理的服务器中,接受服务器的返回并把这个返回发送会客户端的一个服务器。(这里的描述说的实际上是反向代理服务器,但是原文用的是Proxy Server而不是Reverse Proxy)
来配置一个简单的反向代理服务器,提供返回本地图片服务器的功能和反向代理的服务。在这个例子中,所有的服务都会被定义在一台nginx实例服务器中。
首先,给nginx的配置文件添加多一个server块指令用来定义代理服务:
server { listen 8080; root /data/up1; location / { }}
这个会称为一个监听8080端口的服务(先前,listen
指令没有设置,这样的话就会默认使用80端口)并且把所有请求映射到本地文件的/data/up1
路径。创建这个路径并准备一些html文件。注意,root
指令是放在server上下文中的。这样的root指令会用在哪些没有包含root指令的location块指令中。(这里就是模拟一个其他服务器的功能)
接下来,修改上一节的配置来实现代理服务的配置。在第一个location块指令中,增加proxy_pass指令并在参数中指定需要代理的服务器的协议、名称和端口。
server { location / { proxy_pass http://localhost:8080; } location /images/ { root /data; }}
修改第二个location块指令,原来这个块指令会把请求Url带有/images
前缀的请求映射到/data/images
目录,把它修改成匹配一些典型的文件拓展名的请求。修改后如下所示:
location ~ \.(gif|jpg|png)$ { root /data/images;}
这个参数是一个正则表达式,匹配url以.gif,.jpg或者.png结尾的请求。一个正则表达式需要以~
符号开头。对应的请求会被映射到/data/images
目录。
当nginx选择一个location块指令来处理一个请求的时候,首先会检查指定的前缀,先记录location指令中的最长前缀,然后检查正则表达式。如果一个正则表达式匹配了这个请求,nginx会用正则表达式的这个location,否则,使用之前记录下的最长前缀的location。
配置文件的结果如下所示:
server { location / { proxy_pass http://localhost:8080/; } location ~ \.(gif|jpg|png)$ { root /data/images; }}
这部分不常用就省略了。
nginx -s stop
快速停止nginx -s quit
流畅停止nginx -s reload
重新加载配置nginx -s reopen
重新打开日志文件转载地址:http://ptsni.baihongyu.com/