Nginx 入门手册 (Beginner’s Guide)
翻译来自官方文档,首先感谢nginx 的作者,然后感谢官方文档吧。以下是官网地址,英文还可以的直接去看原文吧。
http://nginx.org/en/docs/beginners_guide.html
------------------------------------------------------------------------------------
这篇手册给出了nginx的基本介绍,并且介绍了一些基本任务的实践。本文假设nginx已经安装到你的机器上了,如果没有请参考nginx安装手册。本手册还介绍了如何启动和停止nginx,reload配置,解析配置文件的结构,以及如何配置nginx去服务静态内容,如何配置nginx作为一个代理服务,如何使用fastcgi连上。
注:CGI是Common Gateway Interface 公共网关接口,Http 服务器与你的或者其他机器上的程序进行‘交谈’ 的一种工具。而 FastCGI 则像是一个常驻的(long-live)CGI。
Nginx有一个主进程和几个工作进程,主进程的目的是读取和评估配置,同时维护和管理工作进程。工作进程处理实际的请求。Nginx利用基于事件的模型和系统依赖的机制在工作进程中高效的分发任务。工作进程的数量可以配置成固定的或者是根据可用CPU核的数量来动态调整。
Nginx和模块工作的方法由配置文件决定,默认情况下,配置文件的名字为nginx.conf,它被放置在目录/usr/local/nginx/conf,/etc/nginx 或者/usr/local/etc/nginx下。
启动,停止和重新加载配置文件
通过运行nginx可执行程序来启动nginx服务,一旦启动成功,可以通过调用可执行程序后面跟上-s的参数来得到控制。命令如下:
nginx -s signal
signal 有下面几种选择
stop, 快速停止
quit,优雅,柔和的停止 (好难,一个强制停止,一个不强制停止不就得了)
reload,重新加载配置
reopen,重新打开日志文件
例如,如果想在工作进程完成当前请求之后再停止nginx进程,name下面的命令可以用的上:
nginx -s quit
上面停止的命令需要和启动的命令是同一个用户。
配置的修改需要调用reload命令或者重启才能够被使用。
nginx -s reload
主进程接收到上面的命令,会检查语法的有效性并且尝试去应用这些配置。如果成功主进程将会启动新的工作进程,并且给之前的工作进程发送消息,告诉他们可以停止了。如果失败了,会回滚配置,工作进程用的仍然是旧的配置。之前的工作进程,接收到停止的命令后,会停止接收新的连接,并且把当前的连接的任务都做完后才会真正的停止。
像kill这样的命令调用时也会在unit的工具的帮助下发送一个命令给linux的进程,这种情况下一个信号会直接以之前给定的进程ID发送给进程,这个进程ID是nginx事先已经写好了的,默认情况下,nginx在目录/usr/local/nginx/logs 或者/var/run下。举个例子,如果住进程的ID为1628,发送quit命令最后会转换成执行
kill -s quit 1628
想得到正在运行的nginx进程列表,像下面的方式使用PS命令
ps -ax | grep nginx
配置文件的结构
nginx包含有哪些模块,以及模块的控制被制定在配置文件的指令中。这些指令分为简单的指令和成块的指令,简单的指令由名字和参数组成,它们由空格隔开,指令最后由分号表示结束。块指令有着和简单指令一样的结构,与简单指令不一样的是他们的内容是由双花括号括起来的,而不是分号。如果块指令由其他的指令,他们被叫做一个上下文(a context) , 例如events, http, server 和location。
在配置文件中但是不在任何context中的指令被认为主上下文(main context),event 和 http 制定在主上下文中,server在http上下文中,location 在server上下文中。
剩下以井号表示的表示为注释。
为静态内容提供服务
Web服务的一个重要任务是向客户端提供文件,比如说图片或者静态的html,你可能要实现下面一种情况,根据请求不同,需求提供不同本地目录的文件:/data/www 这里保存html文件,/data/image 这里保存图片,这种情况下需要编辑配置文件,配置http上下文中的server指令块以支持http的服务,以及两个location块。
首先,创建/data/www的目录,然后放入index.html文件,其它的类型的文本文件也可以放入这个文件夹,然后创建另外一个目录/data/images 然后放一些图片入内。
接着打开配置文件,默认的配置文件已经包含了一些配置server块例子,大部分的是注释,现在去掉这些注释,开始一个新的server块,如下
http { server { } }
一般情况,配置文件包含了一些server块,这些块以监听的端口(port)和服务名称(server name)来区分。一旦确认用哪一个server 块,需要制定请求头的url,并且在http上下文中的location中添加相应的参数入内。
location / { root /data/www; }
这个location块,指明了处理前缀为‘/’的URI请求,如果到请求,URI将会添加到制定的root指令的指后面,就是说在/data/www 后面以形成本地的路径名称。如果有好几个都匹配到请求的路径了,nginx会选择一个最长的一个。上面的配置一个最最短的,长度为一,所以只有其他的都配置不了的情况下才会被使用。
接下来,添加第二个location块。
location /images/ {
root /data;
}
这个配置会匹配到以/images/开头的请求, / 当然也可以匹配到,但是比这个短,所以会使用这个。
最终的server块配置如下
server { location / { root /data/www; } location /images/ { root /data; } }
这已经是一个可用的服务配置,它监听80端口,接收本机的请求htt://localhost/。当请求中的路径包含/images/,将从/data/imags/ 获取文件响应给调用端, 比如说,http://localhost/images/example.png这样路径的请求,nginx或范松/data/imags/example.png文件给调用端,如果文件不存在,则响应404表示没有找到此类文件,请求如果不以/images开头,则会被路由到/data/www目录,即 http://localhost/some/example.html将会发送/data/www/some/example.html文件.
为了应用新的配置,如果没有启动的话,可以调用start命令,如果启动了可以使用reload指令来告诉nginx主进程重新加载配置。
nginx -s reload
如果启动的结果和设想的不一致,你可以在access.log和error.log来查看原因,这些文件在/usr/local/nginx或者/var/log/nginx目录中。
设置一个简单的代理服务器
使用nginx一个比较常用情况是作为一个代理服务器。就是说一个nginx的server可以接收请求,解析他们到一个代理服务,并且获取返回值,并且返回给客户端。
接下来我们配置一个代理服务器,它会提供一个本地目录的图片文件服务和发送其它的请求到一个被代理的服务商,在这个例子中,每个nginx实例只有一个server 模块。
首先,添加一个server模块在被代理的nginx配置中,如下
server { listen 8080; root /data/up1; location / { } }
这个配置将会是一个监听8080端口的简单服务,所有的请求都会被映射在本地目录的/data/up1下(之前的配置没有添加端口,所以会使用默认端口80),创建这个目录,然后放入index.html文件,注意root指令配置在server上下文中,这样只要location中没有root,任何与location 匹配的请求都会到server下root中去。
.
接下来,使用之前的配置,修改它使之成为一个代理服务器,在第一个location块中,添加proxy_pass指令,同时制定被代理服务的协议,名字和端口,目前来说是http://localhost:8080。
server { location / { proxy_pass http://localhost:8080; } location /images/ { root /data; } }
我们将修改第二个location上下文,目前来说会映射含有/images/的请求到/data/image 目录下,为了让映射匹配典型的文件扩展名的请求,修改成如下内容。
location ~ \.(gif|jpg|png)$ {
root /data/images;
}
参数为一个正则表达式,它匹配了所有的url中后缀为.gif,.jpg,.png的请求,将他们映射到/data/images下。其它的请求将被映射到上面的location中。
这样当nginx选择一个location 提供服务是,会先检查前缀,然后检查正则表达式,记住nginx将会找最长的一个前缀,所以如果是通过正则表达式来匹配成功的,将会使用正则表达式匹配的location中的地址,否则会选择之前的一个。
最终的配置如下
server { location / { proxy_pass http://localhost:8080/; } location ~ \.(gif|jpg|png)$ { root /data/images; } }
这个服务会过滤以.gif ,.jpg,.png结尾的请求,将它们映射到/data/imags本地目录下,其它的请求会发送到之前配置的被代理的服务器上。
同样为了是这些配置可用,需要使用前面提到的命令reload。
配置FastCGI 代理
Nginx可以被用来路由请求到FastCGI服务上去,这些服务有建好的不同的框架和编程语言比如说,PHP。
与FastCGI服务工作的最基本的nginx配置包括用fastcgi_pass代理proxy_pass指令,和使用fastcgi_param指令同时设置指向FastCGI服务。假设FastCGI服务localhost:9000是可用的,拿走之前配置中的代理部分作为一个基础,然后将proxy_pass换成factcgi_pass指令同时将参数修改为localhost:9000。在PHP中,SCRIPT_FILENAM参数被用来确定脚本名称,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; } }
这个服务将把除了带有后缀.gif,.jpg,.png的请求路由到/data/imags下之外,其它所有的请求都会被映射到fastcgi服务localhost:9000上。
-----------------------------------------------------------------------------------------------------------------------------
后记,看这篇文章大概10分钟,写这篇文章却花了整整四个小时。