本节介绍如何启动和停止nginx,重新加载配置,配置文件的结构,如何配置nginx分配静态内容,如何配置nginx为代理服务器,如何与FastCGI程序相联。
Nginx包含一个主进程和多个工作进程。主进程读取并处理配置,维护工作进程。工作进程负责实际的请求处理。Nginx使用事件驱动和操作系统相关的机制,可以有效的在工作进程间分配请求。工作进程的数量可以在配置文件里设定,可以配置为固定的个数,也可以根据CPU的核心数进行动态适应。
默认情况下,配置文件为nginx.conf,一般路径为/usr/local/nginx/conf
, /etc/nginx
, 或/usr/local/etc/nginx。像上一节我们设置的安装路径,配置文件放在/usr/local/nginx/conf。
启动,停止nginx,更新配置
运行可执行文件启动nginx,如
[[email protected] nginx]# /usr/local/nginx/sbin/nginx
启动后,可以用如下命令操作nginx
nginx -s signal
signal可以是如下命令
stop:快速停止
quit:安全退出
reload:重新加载配置文件
reopen:打开日志文件
如果要等nginx工作进程处理完当前的所有请求后才停止,应该使用如下命令:
nginx –s quit
配置文件修改后,需要重新加载或重启nginx才会起作用,重新加载配置执行如下命令:
nginx –s reload
主进程接收到重新加载配置的命令后,先检查新配置的语法是否有效,并尝试应用新的配置。如果新配置应用成功,主进程启动新的工作进程,并发送消息通知旧的进程停止工作。如果新配置应用失败,则回滚所有更改,并继续使用旧的配置,旧的进程放弃新的配置,继续使用旧的进程处理当前请求。
也可以通过Unix的命令工具直接发送信号给nginx的进程ID,如kill命令。Nginx的主进程ID默认配置在/usr/local/nginx/logs或/var/run目录下的nginx.pid文件中。假设主进程ID是1628,要使用QUIT命令让nginx安全退出,执行如下命令:
kill –s quit 1628
使用ps命令获取nginx所有运行的进行
ps -ax | grep nginx
配置文件结构
nginx的各模块由配置文件中的指令集控制。指令集分为简单指令和块指令,简单指令由名称和参数组成,中间以空格分格,以分号(;)结束,块指令的结构和简单指令相同,但以大括号包围的附加指令集结束。块指令的大括号里可以包含其它指令,称作上下文(例如:events,http,server和location)。
放置在所有上下文以外的指令都被认为是在主上下文中。主上下文包含events和http指令,http包含server,server包含location。
注释每行使用#开头。
静态文件
Web服务器的一个重要作用就是分配静态文件(如图片和html文件)。可以实现一个示例,根据请求从不同的目录分配文件:/data/www和/data/images。修改配置文件,在http块中设置一个server块,在server块包含两个locaton块。
首先,创建/data/www目录,添加html.index文件,内容自己定义,再创建/data/images目录,放几张图片。
接着打开配置文件,默认已经包含一些已注释的示例。先不管注释的内容,新添加一个server块,
http{
server{
}
}
配置文件可以包含多个server块,通过监听端口(listen)和服务名称(server_name)区分,通过请求消息头中的URI匹配server中loation的参数来确定哪个server块处理请求。
在server块中添加如下指令:
location /{
root /data/www
}
location块定义”/”前缀与请求的URI作比较,匹配的请求URI会被添加到root指令定义的路径之后,也就是/data/www,组成请求文件的本地路径。如果有多个location块匹配,nginx选择其中前缀最长的一个。上边的locatoin块使用了长度最短的前缀,所以如果其它location无法匹配,都会使用这个location块。
添加第二个location块:
location /images/{
root /data;
}
匹配以/images/开头的所有请求。
配置文件server的最终内容如下:
server{
location /{
root /data/www;
}
location /images/{
root /data;
}
}
配置监听80端口,并且可以通过http://localhost/访问。URIs以/images/开头的请求,服务器从/data/images发送文件,例如对应请求http://localhost/images/example.png,nginx会发送文件/data/images/example.png,如果文件不存在,nginx发送一个404的响应异常。不以/images/开头的请求会映射到/data/www目录。例如请求http://localhost/some/example.html会发送文件/data/www/some/example.html。
重启nginx或发送reload命令以使新配置生效:
nginx –s reload
如果出现异常,可以在access.log和error.log中查找原因,它的目录是/usr/local/nginx/logs或/var/logs/nginx
配置简单的代理服务
Nginx经常用作代理服务器。代理服务器接收请求,把它们传递到被代理服务器,获取响应,并返回到客户端。
我们将要配置一个代理服务器,从本地目录处理图片文件的请求,其它请求发送到被代理服务器处理。在本例中,两个服务器都被定义在同一个nginx实例中。
首先,定义被代理服务器,在配置文件中再添加一个server块,内容如下:
server{
listen 8080;
root /data/up1;
location /{
}
}
这个服务配置监听80端口,映射所有请求到/data/up1目录。这里的root指令放在server上下文中,当location指令中没有root指令时,可以像这样配置root指令。
然后,修改上一节的配置为代理服务器的配置。在第一个location块配置代理服务器的协议,名称,端口设置proxy_pass的参数值:
server{
location /{
proxy_pass http://localhost:8080;
}
location /images/{
root /data;
}
}
修改第二个location块,让它只匹配特定扩展名的图片。
location ~\.(gif|jpg|png)${
root /data/images;
}
参数是一个正则表达式,匹配所有以.gif,.jpg或.png结尾的URIs,正则表达式必须以~开始,与该配置匹配的请求会被映射到/data/images目录。
nginx处理请求时,首先检查location指令定义的最长前缀,与正则表达式比较,如果匹配,nginx使用这个location,否则使用其它指令定义。
代理服务器的最终配置如下:
server{
location /{
proxy_pass http://localhost:8080//;
}
location ~\.(gif|jpg|png)${
root /data/images;
}
}
服务器会过滤以.gif,.jpg或.png结尾的请求,把它们映射到/data/images目录,传递其它请求到代理服务器。
设置FastCGI代理
Nginx可以将请求路由到各种框架和语言开发的FastCGI应用服务器,如PHP。
最基本的,将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/images;
}
}
通过该配置,除了静态文件,所有请求都通过FastCGI协议被路由到代理服务器上localhost:9000。