http://blog.csdn.net/kenbinzhang/article/details/4722359
nginx现在已经支持很多功能,系统内已经实现的模块多达72个,这些模块提供了若干配置指令来设置和控制nginx的相关处理过程。
为了能够更深入的进行接下来的源码分析,利用一些篇幅讨论一下nginx的运维和配置相关的内容,主要参考了nginx的英文wiki资料,按照自己的思路整理成nginx的操作和配置指南,可以作为使用nginx的一个起点。
首先简单介绍一下nginx的编译、启动和控制。
1、编译
nginx的编译没什么好说的,主要是configure可以带一些参数,比如--prefix=/path/file等。这些参数可以设置安装路径,可以屏蔽一些模块的编译,也可以打开默认被屏蔽的模块,./configure --help可以查看具体的明细。
./configure --with-http_stub_status_module
make
make install
其中参数--with-http_stub_status_module打开了nginx的状态查看模块,这样就可以通过配置访问http://localhost/nginx_status查看nginx服务的当前状态。
安装后的目录下有四个子目录:conf、html、logs和sbin。nginx的配置文件是conf/nginx.conf,可执行程序是sbin/nginx。
2、启动
nginx的启动有几个参数可供选择:
-c <config path> : 使用指定的配置文件而不是conf目录下的nginx.conf;
-t : 测试配置文件的正确性,不启动服务,运行期间需要重新加载配置文件,这个参数可以检测所要加载的配置文件的语法正确性;
-v : 显示nginx的版本号并退出;
-V : 显示nginx的版本号和编译时的配置选项(configure参数)并退出;
-p prefix : 设置默认路径(default:/usr/local/nginx);
-g directives : 设置配置文件之外的全局配置指令。
3、控制
对nginx的控制是使用信号通知的方式,例如:
killalll -s XXX nginx或者kill - XXX pid
下面是用于控制的信号说明,前面对进程启动过程的源码分析中已经详细剖析了,这里总结一下:
TERM,INT : 快速关闭程序,中止当前正在处理的请求
QUIT : 处理完当前请求后,关闭程序
HUP : 重新加载配置文件,启动新的工作进程,关闭旧的工作进程,不中断请求
USR1 : 重新打开日志文件,切换新的日志
USR2 : 热代码升级,不重启服务升级二进制程序
WINCH : 从容关闭工作进程,主进程不退出,接着启动新的工作进程
接下来开始介绍nginx的强大灵活的配置。
通过前面的源码分析知道,nginx在实现中把所有内嵌模块分为4种类型,对应着四个不同的上下文结构体:ngx_core_module_t、ngx_event_module_t、ngx_http_module_t和ngx_mail_module_t。nginx是通过配置指令来驱动这些模块工作的,nginx根据模块的分类把指令集也进行了区分,在nginx的英文wiki上,把配置的指令集分为:核心模块配置(包含event模块)、基本http模块配置、可选的http模块配置和邮件模块配置。在配置文件中,这些指令填充下如下的各个区域内:
=====config begin
main section
events {
event section
}
http {
http main section
upstream ... {
http upstream section
}
server {
http server section
location ... {
http location section
if (...) {
if section
}
}
}
}
mail {
mail main section
server {
mail server section
}
}
imap {
imap main section
server {
imap server section
}
}
=====config end
nginx的各个模块的指令都会指定合法的位置,只要按照正确的指令配置语法填充到正确的位置,指令就可以驱动模块了。nginx一般不同时作为web服务器和邮件代理,很少见到配置文件中同时包含了http域和mail域的情况。
接下来按照模块归纳一下nginx的指令集,本篇文章首先介绍核心(core)模块的指令集,这部分指令主要存放于main section位置,这些指令控制基本的nginx功能,配置日志、进程、权限等等信息,这些指令包括:
1、daemon
语法形式:daemon on|off
默认值:on
这个指令出现在配置中就是关闭后台执行方式的:daemon off,生产环境不要使用这条指令,开发的时候才会偶尔使用一下。
2、env
语法形式:env VAR|VAR=VALUE
默认值:TZ
位置:main section
这个指令用来设置环境变量或者为以下用途创建新的变量:
1)热代码更新;
2)嵌入的Perl模块使用;
3)工作进程使用。
例子:
env MALLOC_OPTIONS;
env PERL5LIB=/data/site/modules;
env OPENSSL_ALLOW_PROXY_CERTS=1;
3、debug_points
语法形式:debug_points [stop|abort]
默认值:none
nginx的内部设置了一些断点(一些处理过程中调用了ngx_debug_point函数),这个指令会设置执行断点操作的时候停止nginx去attch调试器或者退出并创建core文件。
4、error_log
语法形式:error_log file [debug|info|notice|warn|error|crit]
默认值:${prefix}/logs/error.log
指定server和fastcgi的错误日志写入的文件。
缺省的error level值为:
1)main section - error
2)http section - crit
3)server section - crit
nginx支持不同的虚拟主机写入独立的错误日志,lighttpd没有提供这个功能。如果编译nginx的时候指定了--witch-debug,还可以进一步使用指令格式:
error_log LOGFILE [debug_core|debug_alloc|debug_mutex|debug_event|debug_http|debug_imap];
注意:error_log off不会禁止写日志,这会使得日志写入名字为off的文件中,禁止写日志要这样指定:
error_log /dev/null crit;
5、log_not_found
语法形式:log_not_found on|off
默认值:on
位置:location section
当请求引起404状态码时,打开或者禁止写请求的失败日志。比如当robots.txt和favicon.ico文件丢失的时候,可以阻止nginx写相关的请求日志:
location = /robots.txt {
log_not_found off;
}
6、include
语法形式:include file|*
默认值:none
这个指令用于包含其他任何另外的配置文件,支持文件名通配符,例如:
include vhosts/*.conf;
注意:0.6.7版本之前,这里的相对路径是关联到--prefix的,而0.6.7版本之后,相对路径是关联到配置文件nginx.conf所在路径的,你可以指定绝对路径。
7、lock_file
语法形式:lock_file file
默认值:编译时指定
nginx使用accpet mutex保护accept(),如果nginx是在i386,amd64,sparc64和ppc64体系结构上使用gcc,Intel C++或者SunPro C++编译器build的话,会使用原子计算机指令实现mutex,其他情况会使用文件上锁。
lock_file /var/log/lock_file;
8、master_process
语法形式:master_process on|off
默认值:on
master_process off只能够在开发的时候使用,这个指令不清楚其目的,源码中只有一个地方使用到,在事件模块的初始化过程中。
9、pid
语法形式:pid file
默认值:编译时指定
pid文件,可以用于kill命令向nginx发送信号,比如重新加载配置的时候可以:kill -HUP `cat /var/log/nginx.pid`。
10、ssl_engine
语法形式:ssl_engine engine
默认值:依赖于系统
这个指令可以用于更换openssl的引擎,查看系统上的openssl引擎可以用命令:openssl engine -t。
11、timer_resolution
语法形式:timer_resolution t
默认值:none
设置时间精度,这个指令可以减少gettimeofday()系统调用的次数,默认情况下每次从kevent(),epoll,/dev/poll,select(),poll()返回就会调用gettimeofday()。
如果在记录变量$upstream_response_time或者$msec的时候需要精确的时间,可以使用timer_resolution。例如:
timer_resolution 100ms;
12、try_files
语法形式:try_files path1 [path2] uri
默认值:none
依次检查文件的存在性,返回存在的第一个文件。路径最后加上一个/表明是目录。如果检查了所有的path未找到文件,则会重定向到备用的uri(最后一个参数),这个uri必须存在,否则会引起一个内部错误。
例1:
# 对任何uri,如果不存在文件也不存在对应的目录,则把请求重定向到fastcgi服务
location / {
try_files $uri $uri/ @drupal;
}
# 在提交一个请求给fastcgi服务之前,try_files测试一下php文件的存在性
location ~ /.php$ {
try_files $uri @drupal;
fastcgi_pass 127.0.0.1:8888;
fastcgi_param SCRIPT_FILENAME /path/to$fastcgi_script_name;
# other fastcgi_param
}
location @drupal {
fastcgi_pass 127.0.0.1:8888;
fastcgi_param SCRIPT_FILENAME /path/to/index.php;
fastcgi_param QUERY_STRING q=$request_uri;
# other fastcgi_param
}
例2:
# 对任何uri,try_files指定的文件都不存在,则重定向到代理服务@mongrel
location / {
try_files /system/maintenance.html
$uri $uri/index.html $uri.html @mongrel;
}
location @mongrel {
proxy_pass http://mongrel;
}
13、user
语法形式:user user [group]
默认值:nobody nobody
如果master进程以root启动,nginx将会调用setuid()和setgid()设置USER和GROUP。如果GROUP没有指定,nginx取和USER同样的名称。默认的情况下是user是nobody或者./configure的--user=USER参数指定,group是nobody或者nogroup或者./configrue的--group=GROUP参数指定。例如:
user www users;
14、worker_cpu_affinity
语法形式:worker_cpu_affinity cpumask [cpumask...]
默认值:none
仅适合于Linux。通过这个选项可以把worker进程绑定到一个cpu,调用了sched_setaffinity()。例如:
worker_processes 4;
worker_cpu_affinity 0001 0010 0100 1000;
每个cpu绑定一个worker进程。
worker_processes 2;
worker_cpu_affinity 0101 1010;
绑定第一个worker到cpu0/cpu2,绑定第二个worker到cpu1/cpu3。
15、worker_priority
语法形式:worker_priority [-] number
默认值:on
这个选项赋予所有的worker进程指定的优先级(nice)。调用了setpriority()。
16、worker_processes
语法形式:worker_processes number
默认值:1
设置工作进程的数量,nginx有几个理由使用多进程:
1)使用SMP
2)当worker阻塞在磁盘IO的时候减少延迟时间
3)当使用select()/poll()的时候,限制每个进程的连接句柄数量
event section的worker_connections指定了每个worker进程的最大连接数量,这样就可以计算出maxclients值:max_clients = worker_processes * worker_connections。
17、worker_rlimit_core
语法形式:worker_rlimit_core size
默认值:
每个worker的core文件的最大尺寸。
18、worker_rlimit_nofile
语法形式:worker_rlimit_nofile limit
默认值:
每个worker能够打开的最大描述字值。
19、worker_rlimit_sigpending
语法形式:worker_rlimit_sigpending limit
默认值:
(Since Linux 2.6.8) Specifies the limit on the number of signals that may be queued for the real user ID of the calling process.
20、working_directory
语法形式:working_directory path
默认值:--prefix
worker进程的工作目录,这个目录主要指定core文件的存放路径。nginx中只使用绝对路径,配置文件中所有的相对路径都是相对于--prefix=PATH的。
除了以上的指令外,core模块还包含三个全局变量:
1、$nginx_version
当前运行的nginx的版本
2、$pid
进程id
3、$realpath_root