2.3 Nginx服务的基本配置

Nginx在运行时,至少必须加载几个核心模块和一个事件类模块。这些模块运行时所支持的配置项称为基本配置——所有其他模块执行时都依赖的配置项。

下面详述基本配置项的用法。由于配置项较多,所以把它们按照用户使用时的预期功能分成了以下4类:

❑用于调试、定位问题的配置项。

❑正常运行的必备配置项。

❑优化性能的配置项。

❑事件类配置项(有些事件类配置项归纳到优化性能类,这是因为它们虽然也属于events{}块,但作用是优化性能)。

有这么一些配置项,即使没有显式地进行配置,它们也会有默认的值,如daemon,即使在nginx.conf中没有对它进行配置,也相当于打开了这个功能,这点需要注意。对于这样的配置项,作者会在下面相应的配置项描述上加入一行“默认:”来进行说明。

2.3.1 用于调试进程和定位问题的配置项

先来看一下用于调试进程、定位问题的配置项,如下所示。

(1)是否以守护进程方式运行Nginx

语法:daemon on|off;

默认:daemon on;

守护进程(daemon)是脱离终端并且在后台运行的进程。它脱离终端是为了避免进程执行过程中的信息在任何终端上显示,这样一来,进程也不会被任何终端所产生的信息所打断。Nginx毫无疑问是一个需要以守护进程方式运行的服务,因此,默认都是以这种方式运行的。

不过Nginx还是提供了关闭守护进程的模式,之所以提供这种模式,是为了方便跟踪调试Nginx,毕竟用gdb调试进程时最烦琐的就是如何继续跟进fork出的子进程了。这在第三部分研究Nginx架构时很有用。

(2)是否以master/worker方式工作

语法:master_process on|off;

默认:master_process on;

可以看到,在如图2-1所示的产品环境中,是以一个master进程管理多个worker进程的方式运行的,几乎所有的产品环境下,Nginx都以这种方式工作。

与daemon配置相同,提供master_process配置也是为了方便跟踪调试Nginx。如果用off关闭了master_process方式,就不会fork出worker子进程来处理请求,而是用master进程自身来处理请求。

(3)error日志的设置

语法:error_log/path/file level;

默认:error_log logs/error.log error;

error日志是定位Nginx问题的最佳工具,我们可以根据自己的需求妥善设置error日志的路径和级别。

/path/file参数可以是一个具体的文件,例如,默认情况下是logs/error.log文件,最好将它放到一个磁盘空间足够大的位置;/path/file也可以是/dev/null,这样就不会输出任何日志了,这也是关闭error日志的唯一手段;/path/file也可以是stderr,这样日志会输出到标准错误文件中。

level是日志的输出级别,取值范围是debug、info、notice、warn、error、crit、alert、emerg,从左至右级别依次增大。当设定为一个级别时,大于或等于该级别的日志都会被输出到/path/file文件中,小于该级别的日志则不会输出。例如,当设定为error级别时,error、crit、alert、emerg级别的日志都会输出。

如果设定的日志级别是debug,则会输出所有的日志,这样数据量会很大,需要预先确保/path/file所在磁盘有足够的磁盘空间。

注意 如果日志级别设定到debug,必须在configure时加入—with-debug配置项。

(4)是否处理几个特殊的调试点

语法:debug_points[stop|abort]

这个配置项也是用来帮助用户跟踪调试Nginx的。它接受两个参数:stop和abort。Nginx在一些关键的错误逻辑中(Nginx 1.0.14版本中有8处)设置了调试点。如果设置了debug_points为stop,那么Nginx的代码执行到这些调试点时就会发出SIGSTOP信号以用于调试。如果debug_points设置为abort,则会产生一个coredump文件,可以使用gdb来查看Nginx当时的各种信息。

通常不会使用这个配置项。

(5)仅对指定的客户端输出debug级别的日志

语法:debug_connection[IP|CIDR]

这个配置项实际上属于事件类配置,因此,它必须放在events{……}中才有效。它的值可以是IP地址或CIDR地址,例如:


events{

debug_connection 10.224.66.14;

debug_connection 10.224.57.0/24;

}


这样,仅仅来自以上IP地址的请求才会输出debug级别的日志,其他请求仍然沿用error_log中配置的日志级别。

上面这个配置对修复Bug很有用,特别是定位高并发请求下才会发生的问题。

注意 使用debug_connection前,需确保在执行configure时已经加入了—with-debug参数,否则不会生效。

(6)限制coredump核心转储文件的大小

语法:worker_rlimit_core size;

在Linux系统中,当进程发生错误或收到信号而终止时,系统会将进程执行时的内存内容(核心映像)写入一个文件(core文件),以作为调试之用,这就是所谓的核心转储(core dumps)。当Nginx进程出现一些非法操作(如内存越界)导致进程直接被操作系统强制结束时,会生成核心转储core文件,可以从core文件获取当时的堆栈、寄存器等信息,从而帮助我们定位问题。但这种core文件中的许多信息不一定是用户需要的,如果不加以限制,那么可能一个core文件会达到几GB,这样随便coredumps几次就会把磁盘占满,引发严重问题。通过worker_rlimit_core配置可以限制core文件的大小,从而有效帮助用户定位问题。

(7)指定coredump文件生成目录

语法:working_directory path;

worker进程的工作目录。这个配置项的唯一用途就是设置coredump文件所放置的目录,协助定位问题。因此,需确保worker进程有权限向working_directory指定的目录中写入文件。