Nginx 起步
原文地址:http://nginx.org/en/docs/beginners_guide.html#control
本指南给出了Nginx的基础介绍并且描述了几个用Nginx能解决的简单任务。这里假设读者已经在自己机器上安装好了Nginx,如果没有,请移步安装Nginx页。本指南描述了如何启动和终止Nginx,如何重载它的配置,配置文件的结构,如何建立Nginx来分发静态内容,如何把Nginx配置为代理服务器以及如何与FastCGI应用建立连接。
Nginx拥有一个主进程和几个工作进程。主进程的主要目的是读取和评估配置以及维护工作进程。而工作进程则才是真正做请求的处理。Nginx基于事件模型和OS依赖机制来有效地在工作进程之间分发请求。工作进程的数量定义在配置文件中,并且,可能是由配置文件给定的数量也可能是由CPU核自动调整分配的数量(查看worker_processes)。
Nginx和其模块的工作都是由配置文件中的配置所决定的。默认情况下,配置文件命名为nginx.conf
并且放置在/user/local/nginx/conf
,/etc/nginx
或/user/local/etc/nginx
目录下。
启动,终止和重载配置
执行可执行文件来启动nginx。一旦nginx被启动,就可以执行包含-s
参数的可执行命令控制它。命令格式如下:
nginx -s signal
这里的signal可以是以下值之一:
- stop-快速终止
- quit-平滑终止
- reload-重载配置文件
- reopen-重新打开日志文件
例如,为了等待工作进程完成它当前正在服务的请求后再停止nginx进程,可以执行下面的命令:
nginx -s quit
这个命令应该在启动nginx的相同用户下执行
在nginx重启或者配置重载命令到达nginx之前,配置的更改是不会被应用的。重载配置,执行:
nginx -s reload
一旦主进程接收到了重载配置的指令,它会检查新配置文件的句法是否合法并且试着执行新收到的配置。如果执行成功,主进程会启动新的工作进程并且向旧的工作进程发消息,请求它们关闭。否则,主进程会回滚变更的配置使用旧的配置。旧的工作进程接收到关闭的命令后,停止接受新的连接并且服务完当前的请求和已经接受的请求。这之后,旧的工作进程会退出。
也可以通过Unix工具例如kill
向nginx进程发送指令。在这种情况下,指令是直接通过进程ID来发送的。默认情况下nginx主进程的ID是写在/user/local/nginx/logs
或/var/run
路径的nginx.pid
中。例如,如果主进程的ID是1628,向nginx发送平稳终止命令的,执行:
kill -s QUIT 1628
可以用ps
命令行工具来获取正在运行的nginx进程列表,例如,用如下方式:
ps -ax | grep nginx
获取更多关于向nginx发送命令的信息,看这里。
配置文件结构
nginx由被写在指定配置文件中的指令所控制的模块构成。指令划分为简单指令和模块指令。一个简单指令由名称和参数组成,他们由空格隔开以分号结尾。模块指令和简单指令结构相同,但是它由一组以花括号包裹的附加指令结尾。如果一个模块指令可以包含另外的指令,则该类指令称为一个上下文(例如:events,http,server和location)。
放置在配置文件中的顶层指令被认为是在主上下文中其他任何上下文之外。#events#和#http#指令放置在主上下文中,server放置在http中,location放置在server中。
放置在#符号后的部分是注释。
提供静态内容服务
web服务器的其中一个重要任务就是提供文件输出服务(例如图片或静态HTML页面)。你将要创建一个实例,依靠请求,将收到来自不同本地目录下的文件:/data/www
(可能包含HTML文件的目录)和/data/images
(包含图片)。这需要编写配置文件并且在http模块中建立拥有两个[location]模块(http://nginx.org/en/docs/http/ngx_http_core_module.html#location)的server模块。
第一步,创建/data/www
路径并且放入写有任意内容的index.html
文件,然后创建/data/images
路径并且放入一些图片。
第二步,打开配置文件,在默认的配置文件中早已有server
指令模块其中包含几个示例,大部分是注释掉的。现在把他们都注释掉并启一个新的server
模块:
http {
server {
}
}
通常情况下,配置文件可能包含几个server
模块,根据他们监听的端口和服务器名称来划分。一旦nginx确定了哪个server
处理某个请求,它会依照定义在server
块中的location
指令测试在请求头中的URL。
以下是放置在server
模块中的location
模块:
location / {
root /data/www;
}
location
模块指定的前置“/”是为了与请求中的URL做比对。为了匹配请求,URL会被拼接在root指定的路径后,也就是,在/data/www
后,这样组成对本地文件系统中被请求文件的请求路径。如果存在几个匹配的location模块,nginx会选择前缀最长的那个。上述location块提供了最短的前缀,长度为一,所以当且仅当所有其他的location模块都匹配失败时才会使用这个模块。
接下来,添加第二个location模块:
location /images/ {
root /data;
}
它为以/images/
(*location /*同样能匹配这样的请求,但是它的前缀更短)开头的请求做匹配。
server
块配置的结果应该看起来如下:
server {
location / {
root /data/www;
}
location /images/ {
root /data;
}
}
这已经是一个监听80端口的服务器可以运行的配置并且能通过 http://localhst/ 访问本机。为了响应RULs以/images/
开头的请求,服务器会返回从/data/images
获取的文件。例如,为了响应http://localhost/images/example.png
请求,nginx会发送/data/images/example.png
文件。如果这样的文件不存在,nginx会返回一个包含404错误的响应。没有以/images/
开头的请求URLs会被映射到/data/www
路径。例如,为了响应http://localhost/some/example.html
请求,nginx会返回/data/www/some/example.html
文件。
为了应用最新的配置,如果还没启动nginx则启动nginx,否则,发送reload
指令给nginx主进程,执行:
nginx -s reload
以防有意料之外的事情发生,你可以试着在/user/local/nginx/logs
或/var/log/nginx
路径下的access.log
或error.log
文件中找找原因。
建立一个简单的代理服务器
nginx其中一种常用的用法是将其建成一个代理服务器,这意味着当服务器接收到一个请求时,它会把这个请求转发给代理服务器,取回响应所需,发送给客户端。
我们会配置一个基础的代理服务器,使用本地路径下的文件来响应图片请求并且把其他所有的请求发往代理服务器。在这个例子中,两个服务器都会定义在单个nginx实例上。
首先,通过在nginx的配置文件中添加多个如下内容的server
模块来定义一个代理服务器:
server {
listen 8080;
root /data/up1;
location / {
}
}
这是一个监听8080端口的简单服务器(先前章节中,由于使用的是标准的80端口,listen
指令不必显示指定)并且会把所有的请求都映射到本地文件系统的/data/up1
路径上。创建这个路径并在其中放入index.html
文件。需要注意的是root
指令是放在server
上下文中的,当被选中来服务某个请求的location
模块不包含root
指令时则会使用这个root
指令。
接下来,使用上面章节的服务器配置然后对其进行修改,使其成为代理服务器配置。在第一个location
模块中,放入proxy_pass指令以及在参数中指定的代理服务器协议、名称和端口(在我们的例子中,它是 http://localhost:8080 ):
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结尾的URLs。正则表达式前面需要有~
符号。符合的请求会被映射到/data/images
路径。当nginx选则一个location
模块来服务一个请求时,它首先会检测location指令的指定前缀,然后记住拥有最长前缀的location
,最后检测正则匹配。如果正则匹配成功,nginx则会选择该location
,否则,它会选择前面记住的那个location
。
代理服务器的配置最终像这样:
server {
location / {
proxy_pass http://localhost:8080/;
}
location ~ \.(gif|jpg|png)$ {
root /data/images;
}
}
服务器会过滤以.gig,.jpg或.png结尾的请求并把他们映射到/data/images
路径(通过在root
参数值后拼接URL的方式)并且根据以上配置把所有的其他请求传递给代理服务器。
为了应用新的配置,按照上面章节中描述的方式把reload
命令发送给nginx。
这里有更多在进一步的代理连接中可能用到的命令。
建立快速通用网关接口(FastCGI)代理
nginx可以对FastCGI服务器进行路由请求,FastCGI用于运行用各种框架和各类编程语言例如PHP编写的应用。
与FastCGI服务器一起运作的最基础的nginx配置包含fastcgi_pass命令而不是proxy_pass
命令以及fastcgi_param命令,用于设置传递给FastCGI服务器的参数。假设可以通过localhost:9000
访问到FastCGI服务器。取上面章节中的代理配置,用fastcgi_pass
命令代替proxy_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/images;
}
}
这会根据FastCGI协议建立一个把除了请求静态图片资源的其它请求都映射到运行在localhost:9000
代理服务器的服务器。