本文摘自PHP中文网,作者零下一度,侵删。
Nginx配置文件结构
nginx配置文件由指令(directive)组成,指令分为两种形式,简单指令和区块指令。
一条简单指令由指令名、参数和结尾的分号(;)组成,例如: listen 80 backlog 4096; ,其中“listen”是指令名,“80”、“backlog”、“4096”都是参数,“;”表示指令结尾。
区块指令由指令名、参数和花括号({})组成,例如: location /imag {} ,其中“location”是指令名,“/imag”是参数,“{}”用于包括其它指令和表示结尾。如果一个区块指令中的大括号可以包括其它简单指令或区块指令,那么这种区块指令称为“语境(context)”,大部分常用的区块指令都是“语境”。
不被任何其它区块指令包含的指令被认为处于main语境中,即main语境是nginx配置文件中最外层语境,任何指令都位于main语境或main语境的子级语境中。请看下面的配置文件例子:
1 2 3 4 |
|
上例中,worker_processes、event、http指令处于main语境中,use、worker_connections指令位于event语境中,include、upstream、server指令位于http语境中,两条server指令位于upstream语境中……
nginx软件是由各种不同功能的模块组成的,因此配置文件也遵照这种模块化的结构,nginx核心模块提供一些全局的配置指令,功能配置指令则由其他的功能模块提供。上例中的worker_processes、event指令都由nginx的核心模块提供,而http指令由http功能模块提供,proxy_pass指令则由http模块的一个子模块提供。
在安装nginx时,默认包含了一些常用功能模块,使用者也可以通过源码编译安装的方式自由选择安装其他功能模块,在配置nginx时可以查找功能模块的文档,文档中会说明这个功能模块包括哪些指令,以及这些指令应该在哪些语境下配置,而从语境(指令)查找它包含哪些可以配置的指令却是不靠谱的,因为安装的模块不同,包含的指令也不一样,因此配置nginx需要有一些经验,初入门者只能先从参考他人的示例着手。
功能模块除了http外,还有mail(邮件代理)、stream(TCP、UDP代理,v1.9.0以后)这两个功能模块。
全局配置指令
语法:include file | mask;
默认值:无
语境:任意
可在任意语境中使用,将其他配置文件中的指令引入到使用include指令的语境中。被引入的指令需要符合语法和引入的语境要求。举例:
1 2 3 4 |
|
将mime.types和vhosts目录下以“.conf”结尾的文件引入到http语境中。
语法:deamon on | off;
默认值:deamon on
语境:main
指定nginx是否以守护进程运行。
语法:debug_points abort | stop;
默认值:无
语境:main
用于debug,判断nginx内部错误,特别是判断工作中进程的socket溢出问题。nginx代码中包含了一些调试点,如果debug_points设置为abord,当运行到调试点时会产生一个核心运行信息dump文件,当设置为stop时会停止进程。
语法:error_log file [level]
默认值:error_log logs/error.log error;
语境:main, http, mail(v1.9.0后), stream(v1.7.11后), server, location
指定日志文件和日志级别。
file可以是指定的文件,也可以是标准错误输出文件stderr、syslog服务器或内存。输出到syslog服务器使用“syslog:”前缀,输出到循环内存缓冲区使用“memory:”前缀和缓冲区大小。
level参数指定输出日志的级别,高于指定级别的日志将被输出。支持的级别从低到高依次有:debug、info、notice、warn、error、crit、alert、emerg。
指定debug级别需要编译时安装了debug模块。
语法:env variable[=value];
默认值:env TZ;
语境:main
默认情况下,nginx只会继承TZ这个环境变量,这条指令可以将环境变量传递到nginx进程中,也可以定义新的变量传递到nginx进程中。
语法:load_module file;
默认值:无
语境:main
载入动态模块。例如:
1 |
|
语法:lock_file file;
默认值:lock_file logs/nginx.lock;
语境:main
nginx使用锁的机制来实现accept_mutex功能和共享内存,大多数操作系统中锁都是一个原子操作,这种情况下这条指令无效,还有一些操作系统中使用“锁文件”的的机制来实现锁,此命令用来指定锁文件前缀名。
语法:master_process on | off;
默认值:master_process on;
语境:main
是否启用worker进程,如果设置为off,则不启用worker进程,由master进程处理请求。
语法:pcre_jit on | off;
默认值:pcre_jit off;
语境:main
在解析配置文件时对正则表达式启用或禁用实时编译(PCRE JIT)。
RCRE JIT能显著提升正则表达式的处理速度。
JIT依赖PCRE库8.20以后版本,并且在编译时需要指定--enable-jit参数。也可以将PCRE库作为nginx的模块编译安装(编译nginx指定--with-pcre=参数),并在编译时指定--with-pcre-jit参数启用JIT功能。
语法:pid file;
默认值:pid nginx.pid;
语境:main
指定pid文件。pid文件存放了master进程的进程号。
语法:ssl_engine device;
默认值:无
语境:main
如果使用了硬件ssl加速设备,使用此指令指定。
语法:thread_pool name threads=number [max_queue=number];
默认值:thread_pool default threads=32 max_queue=65535;
语境:main
在使用异步IO的情况下,定义命名线程池,并设置线程池大小和等待队列大小。当线程池中所有线程都繁忙时,新任务会放在等待队列中,如果等待队列满了,任务会报错退出。
命名线程池可以定义多个,供http模块的异步线程指令(aio)调用。
此指令在v1.7.11中出现。
语法:timer_resolution interval;
默认值:无
语境:main
设置时间精度,减少worker进程调用系统时间函数的次数。默认情况下,每个核心事件都会调用gettimeofday()接口来获得系统时间,以便nginx计算连接超时等工作,此指令指定更新时间的间隔,nginx在间隔时间内只调用一次系统时间函数。
语法:user user [group];
默认值:user nobody nodoby;
语境:main
指定master启动worker进程使用的linux用户和组。如果组(group)没有指定,那么会默认用一个和user同名的组名。
相关阅读 >>
更多相关阅读请进入《nginx》频道 >>