nginx初学者指南
启动,停止和重载配置
配置文件的组成结构
发布静态内容
搭建一个简单的代理服务器
搭建一个FastCGI代理
本指南提供了一个关于nginx的基本介绍,并描述里一些可以用它来做的简单事务。首先,你的机器上需要已经安装里nginx,如果没有,请前往安装nginx页面。这个指南描述了如何去启动和停止nginx,和重载它的配置文件,介绍了它的配置文件的组成结构,和如何搭建nginx去发布静态内容,如何配置nginx为一个代理服务器,和如何用它连接一个FastCGI应用。
nginx拥有一个主进程和多个工作进程,主进程的主要功能是加载和测试配置文件,和保证工作进程的正常运行。工作进程对请求做实际的处理,nginx采用基于事件的模型和依赖于操作系统的机制来高效的在工作进程之间分发请求,工作进程的数量可以在配置文件中指定,或者默认为有效的CPU核心数。(查看工作进程)
工作进程的工作模式由配置文件指定。默认的,配置文件名为nginx.conf
,位于/usr/local/nginx/conf/
,/etc/nginx
或/usr/local/etc/nginx
目录。
启动,停止和重载配置文件
启动nginx可直接运行nginx可执行文件即可。一旦nginx启动,可通过调用带有-s
参数的执行命令来控制它。使用以下格式:
nginx -s signal
signal
可以是以下几种:
stop 快速关闭
quit 优雅的关闭
reload 重载配置文件
reopen 重新打开工作日志
例如,需要等工作进程完成当前的请求后再关闭nginx,可以执行:
nginx -s quit #这个命令需要启动nginx时的用户才能够执行
在配置文件中做的改变不会立即生效,除非用重载命令或者重启nginx。重载配置文件可以执行:
nginx -s reload
一旦主进程接收到重载配置文件的信号,它将会检查新的配置文件的有效性,并尝试去应用其中的配置。如果成功,主进程将开启一个新的工作进程,并给老的工作进程发送一个消息,请求它们关闭。否则,主进程将回滚改变,继续使用老的配置进行工作,同时老的工作进程会收到一个关闭命令,停止接收新的连接,并继续当前的请求直至所有的请求处理完毕,然后关闭进程。
一个信号也可以在unix工具(如kill)的帮助下发送至nginx,在本例中信号将直接通过指定的ID发送至nginx进程,nginx主进程的ID默认在nginx.pid
文件中,在/usr/local/nginx/logs
或者/var/run
目录下。例如一个主进程的ID是1628,给nginx主进程发送quit
信号使其优雅的退出可以执行:
kill -s quit 1628
可以通过ps
命令来获取所有正在运行的nginx进程:
ps aux | grep nginx
更多关于给nginx发送信号的信息,请看控制nginx
配置文件的结构
nginx由配置文件中指定的指令所控制的模块组成。指令分为简单指令和块指令两种,一个简单指令由名字和参数组成,中间用空格分割,末尾用分号;
结尾,一个块指令有和简单指令一致的结构,但是末尾的分号被一套被{}
包括的附加说明所取代。如果一个块指令可以在{}
内包含其他的指令,则被成为上下文(如:events
,http
,server
和location
)。
配置文件中在所有上下文之外的指令被称为主要上下文。events
和http
指令属于主要上下文,server
在http
中,location
在server
中。
一行中#
后的部分是注释内容。
发布静态内容
web服务器一个重要的事务就是发布文件(如图片和静态HTML页面)。接下来你将会进行一个示例,根据请求,文件将在不同的本地目录内被发布:/data/www
(包含一些HTML文件)和/data/images
(包含一些图片)。接下来需要在配置文件http
块中建立一个server
块,然后在server
块中包含两个location
块。
首先,建立/data/www
目录,并放入一个index.html
文件和其他的一些文本文件,建立一个/data/images
目录,并放入一些图片文件。
接下来打开配置文件,默认的配置文件已经包含了几个server
块的示例,且大多都已经被注释掉,现在注释掉所有的这些块,并新建一个server
块:
http {
server {
}
}
通常的,配置文件会包含多个server
块,根据它们的监听端口和服务名进行区分。一旦nginx确定由那个服务处理请求,它将会根据server
块中定义的location
指令的参数对请求的头部指定的URI进行测试。
将location
块加入到 server
块中:
location / {
root /data/www;
}
这个location
块指定/
与请求的URI头部进行对比。匹配到的请求,URI将会被添加到root
指令指定的目录,也就是/data/www
目录,并在本地系统中组成请求的路径。如果匹配到了多个location
块,则nginx将选择拥有最长前缀的一个location
块。上面的location
块提供了最短的前缀,所以只有其他的location
块都不匹配的时候才会使用它。
接下来添加第二个location
块:
location /images/ {
root /data/images;
}
它将会与以images
开头的请求相匹配(location /
也会匹配到这些请求,不过它前缀较短)。
最终的server
块的配置看起来像是这样:
server {
location / {
root /data/www;
}
location /images/ {
root /data/images;
}
}
这已经是一个可以工作的服务器配置了,监听80
端口,在本机可以通过http://localhost/
进行访问。响应以images
开头的请求时,服务器会从data/images
目录调取发送文件。例如:响应http://localhost/images/example.png
请求时,nginx会发送/data/images/example.png
文件,如果这个文件不存在,则nginx会发送一个响应提示404错误。不以images
开头的请求将会被映射到/data/www
目录。例如:响应http://localhost/some/example.html
请求时,nginx将会发送/data/www/some/example.html
文件。
如果要使用这个配置的话,如果nginx还未启动的话则启动nginx即可,否则可以执行以下命令给nginx主进程发送reload
信号:
nginx -s reload
(如果一些事情没有如预期一样正常工作的话,你可以尝试去access.log
和error.log
文件中查找原因,通常在/usr/local/nginx/logs
或者/var/log/nginx
目录下。)
搭建一个代理服务器
nginx被用来做的最多的一个用途就是作一个代理服务器:接收客户端的请求,并通过它到达被代理的服务器,并从被代理的服务器取回响应,将响应发送给客户端。
我们将会配置一个基础的代理服务器:从本地目录响应所有的images
请求,并发送其它的所有请求到一个被代理的服务器。在这个例子中,两个服务器将会在同一个nginx实例中定义。
首先,在nginx配置文件中添加一个server
块来定义被代理的服务器:
server {
listen 8080;
root /data/up1;
location / {
}
}
这将是一个监听8080的简单服务器(假设8080端口还未被使用),并将所有的请求映射到本地/data/up1
目录下。创建这个目录,并放入一个index.html
文件。请注意,root
指令已经被放在里server
上下文中,这个指令将会被使用,当location
块被选择服务于一个请求却没它自己的root
指令时。
接下来,修改上一节的服务配置使其成为一个代理服务器。在第一个location
块,加入proxy_pass指令和参数中指定的协议,即被代理服务器的域名和端口(在我们的例子中,他是http://localhost:8080
):
server {
locat / {
proxy_pass http://localhost:8080;
}
location /images/ {
root /data/images;
}
}
我们将会修改第二个location
块——它将当前带有images
前缀的请求映射到本地/data/images
目录下的文件。通过修改使它可以匹配到带有图片典型文件扩展名的请求。修改后的location
块看起来像是这样:
location ~ \.(gif|jpg|png)$ {
root /data/images;
}
这个参数是一个正则表达式,它会匹配到所有以.gif
,jpg
或者.png
结尾的URI。一个正则表达式应该以~
开头。相对应的请求会被映射到本地/data/images
目录。
当nginx选择一个location
块去处理请求时,会先检查location
块指令中指定的前缀,并记录与之匹配的拥有最长前缀的location
,然后去检查正则表达式,如果一个正则表达式能与其匹配上,则nginx将会使用该正则表达式所在的location
块,否则,它将会使用之前记录的与之匹配且拥有最长前缀的location
块。
一个代理服务器最后的配置看起来像是这样:
server {
location / {
proxy_pass http://localhost:8080/;
}
location ~ \.(gif|jpg|png)$ {
root /data/images;
}
}
这个服务器将会匹配到所有的以'git
,jpg
或者png
结尾的请求,并将他们映射到本地/data/images
目录(通过在root
指令的参数后面追加URI),并且传递其他所有的请求到上面配置的被代理的服务器上。
让一个新的配置生效,可以用上一节介绍的向nginx发送reload
信号的命令。
这里有更多的指令,可能会在更进一步的配置代理连接中用到。
设置FastCGI代理
nginx可用来将请求路由到FastCGI服务器(可运行由各种框架和编程语言(如PHP)构建的应用程序)上。
一个与FastCGI服务器可正常工作的最基本的nginx配置,包括使用fastcgi_pass
指令而不是proxy_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_para QUERY_STRING $query_string;
}
location ~ \.(gif|jpg|png)$ {
root /data/images;
}
}
这将建立一个服务器,将除了静态图像请求之外的所有请求都路由到localhost:9000
,即一个通过FastCGI协议运行的被代理的服务器上去。
网友评论