Nginx开始向导
Nginx拥有一个主(master)进程和几个工作(worker)进程,主进程主要用于读取与评估配置,维护工作进程。工作进程则负责请求的实际操作。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,可执行如下命令:
nginx -s quit
比如如果修改了配置文件,想要生效就要重启Nginx或者重新加载配置,重新加载配置的命令如下:
nginx -s reload
一量master主进程接收到重新加载配置的信号,它会检查新配置文件的语法下确性和试图应用新的配置,如果成功,主进程就会开始创建新的工作进程并且向老的工作进程发送关闭命令,否则,主进程将会回滚到老的配置继续运行。而老的工作进程在接收到一个关闭命令后,停止接收新的连接,继续为当前请求提供服务,直到完事后退出。
也可以通过Unix工具向Nginx进程发送信号,比如kill命令。这种情况下是通过进程ID发送到进程的。默认情况下,Nginx主进程的进程ID被写入/usr/local/nginx/logs或者/var/run/目录下的nginx.pid文件中。例如,如果Nginx主进程的进程ID为1628,那么要将QUIT信号发送给Nginx主进程,可执行如下命令:
kill -s QUIT 1628
要查看所有的Nginx进程列表,可执行如下命令:
ps -ax | grep nginx
配置文件结构
Nginx由配置配置文件中指定的指令控制的模块组成,其指令可分为简单指令和块指令。一个简单指令由名字和参数组成,以空格分隔,以分号结束。一个块指令同简单指令拥有同样的结构,但是并不是以分号结尾,而是以花括号包括的其他指令集结尾。如果一个块指令在其花括号中包含其他指令,被称作上下文(context),比如events,http,server和location.
配置文件中放在所有上下文(context)之外的指令被认为是放置在main上下文中(context)。events和http指令属于main上下文,server指令属于http上下文,location属于server上下文。
配置文件中以#开始的为注释。
提供静态内容服务
一个web服务重要的任务就是向外提供文件,比如图片和静态HTML页面,你可以通过配置Nginx实现比不同本地目录向外提供文件服务(编辑配置文件配置一个server块,在server内http块和location块)。
比如/data/www目录下放置一个叫index.html的HTML文件,/data/image目录下放置一些图片,首先打开配置文件编辑一个server块如下:
http {
server {
}
}
通常情况下,配置文件中会包含多个以它们监听的端口号或者它们的服务名称区别的server块。一旦Nginx决定哪个server操作请求,它会拿请求头中的URI与定义在server块中的location指令的参数匹配,如下是在server块中添加location块:
http {
server {
location / {
root /data/www;
}
}
}
上面location块指定以/匹配请求的URI(匹配所有的请求),如果请求能够匹配,则追加到root指令后面的路径的后面。
如果请求URI能够同时匹配location块,Nginx选择最多匹配那一个,即匹配最长那个。
然后在server块中添加第二个location块如下:
http {
server {
location / {
root /data/www;
}
location /images/ {
root /data;
}
}
}
这已经就是一个简单的监听默认端口80的简单服务配置了,且可通过http://localhost/访问,对于以/images/开头的URI请求,服务器将会从/data/images/目录下返回相应的文件,比如http://localhost/images/example.png,Nginx后返回/data/iamges/example.png文件。如果此文件不存在,则显示404错误。同样的,不以/images/开头的URI请求,将会被映射到/data/www目录,比如,http://localhost/som/exmaple.html,Nginx将发送/data/www/some/example.html文件。
当然需要使此新的配置生效则要得启或者如下命令:
nginx -s reload
注:如果一些配置没能如期待中那样工作,可查看/usr/local/nginx/logs或者/var/log/nginx目录下的access.log和error.log文件以查找原因。
配置一个简单代理服务
Nginx的另一大使用场景即作为代理服务使用,即接收请求,然后将请求转发给被代理的服务器并从被代理的服务器取回响应,最后将取回的响应发送给客户端。
下面我们将配置一个基本的代理服务,对于图片文件的请求由本地目录提供,所有其他的请求转发给被代理的服务器。在此示例中,将会在一个Nginx实例中定义两个server块。
如下是第一个server块:
server{
listen 8080;
root /data/up1;
location / {
}
}
这即是一个简单的监听8080端口的服务配置,如果不指令listen指令表示监听80端口。其匹配所有的请求到本地文件系统的/data/up1目录下,创建此目录并在其中创建一个叫做index.html的文件。注意,此处root指令属于server上下文中,这种root指令在被选择用于向请求提供服务的location指令没有自己的root指令时使用。
然后,修改如上配置使其成为代理服务的server配置如下:
server {
location / {
proxy_pass http://localhost:8080;
}
location /images/ {
root /data;
}
}
proxy_pass指令用于指定被代理服务的协议、主机名称、和端口号。
如果修改第二个location如下:
location ~ \.(gif|jpg|png)$ {
root /data/images;
}
则表示匹配所有URI以.gif或者.jpg或者.png结尾的请求。此时location参数为一正则表达式,~即表示其参数为正则表达式。
当Nginx选择提供服务的location时,首先检查location指定的前缀,然后才检查正则表达式。如果存在正则表达式匹配的location,Nginx就会选择这个location,如果不存在,则Nginx则选择其最早检测那个正则表达式所在的location。
一般Nginx的代理服务配置如下般模样:
server {
location / {
proxy_pass http://localhost:8080/;
}
location ~ \.(gif|jpg|png)$ {
root /data/images;
}
}
同样要注意要应用新的配置,需重启服务或者重新加载配置文件。
配置FastCGI代理
Nginx同样可用于FastCGI服务的代理。FastCGI为可运行多种框架或者语言的服务器。
如果Nginx作为FastCGI服务器的代理服务,最基本的配置要包含fastcgi_pass指令,以替代proxy_pass指令,同时fastcgi_pass指令需包含fastcgi_param指令,以设置传递给FastCGI服务的参数。
假如一个FastCGI服务在localhost:9000是可访问的,以上面区域中的代理配置作为基础,将proxy_pass指令替换为fastcgi_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/iamges;
}
}