nginx源码分析(13)-运维与配置(1)

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

你可能感兴趣的:(nginx,timer,server,Module,user,File)