nginx设置中有关日志的设置主要是环绕着下面两个指令:
1、error_log
序列号 | CPU | RAM | HDD | 带宽 | 售价(美元) | 免费试用 |
---|---|---|---|---|---|---|
香港服务器1 | E5-2620 | 32G | 1T HDD | 50M/无限流量 | $196.00 | 立即申请 |
香港服务器2 | E5-2650 | 32G | 1T HDD | 50M/无限流量 | $256.00 | 立即申请 |
香港服务器3 | E5-2680 | 32G | 1T HDD | 50M/无限流量 | $316.00 | 立即申请 |
香港服务器4 | E5-2690 | 32G | 1T HDD | 50M/无限流量 | $336.00 | 立即申请 |
香港服务器5 | E5-2697 | 32G | 1T HDD | 50M/无限流量 | $376.00 | 立即申请 |
香港服务器6 | E5-2620*2 | 32G | 1T HDD | 50M/无限流量 | $376.00 | 立即申请 |
香港服务器7 | E5-2650*2 | 32G | 1T HDD | 50M/无限流量 | $436.00 | 立即申请 |
香港服务器8 | E5-2680*2 | 32G | 1T HDD | 50M/无限流量 | $476.00 | 立即申请 |
香港服务器9 | E5-2690*2 | 32G | 1T HDD | 50M/无限流量 | $556.00 | 立即申请 |
香港服务器10 | E5-2697*2 | 32G | 1T HDD | 50M/无限流量 | $596.00 | 立即申请 |
香港服务器11 | E5-2680v4*2 | 32G | 1T HDD | 50M/无限流量 | $696.00 | 立即申请 |
香港服务器12 | E5-2698v4*2 | 32G | 1T HDD | 50M/无限流量 | $796.00 | 立即申请 |
2、access_log:记录会见日志
首先要强调的一点是,假如access日志和error日志都是常量文件名(因为access支持变量文件名,后续会讲到),那么nginx历程会缓存文件描写符直到历程竣事。
什么时候日志的fd会改变呢?
1)历程重启
2)收到了NGX_REOPEN_SIGNAL信号,会发生新的日志文件
其他环境下,日志的fd稳定,所以当历程运行中,删除了日志文件的话,并不会生成新的日志文件,且日志城市丢失
下面具体讲一下这两个指令的来龙去脉
一:先说error_log:
nginx有两个模块支持error_log指令:
一个是 ngx_errlog_module ,这个模块只有一个指令,就是error_log,设置范例为:NGX_MAIN_CONF,回调函数为:ngx_error_log;
另一个是 ngx_http_core_module,这个模块中也有指令:error_log,设置范例为:NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF,回调函数为:ngx_http_core_error_log。
staticngx_command_tngx_errlog_commands[]={{ngx_string("error_log"),NGX_MAIN_CONF|NGX_CONF_1MORE,ngx_error_log,0,0,NULL},ngx_null_command};staticngx_command_tngx_http_core_commands[]={{ngx_string("error_log"),NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,ngx_http_core_error_log,NGX_HTTP_LOC_CONF_OFFSET,0,NULL},}
这样会发生几个疑问:
1:为什么需要两个沟通的指令实现沟通的成果。
2:两个指令的范例均支持NGX_HTTP_MAIN_CONF,那么在main中设置的error_log到底利用的是哪一个
3:两者的浸染干系。
下面来表明一下:
nginx在举办模块注册时,会发明 ngx_errlog_module 模块是先于 ngx_http_core_module模块注册的 。
在nginx在理会设置文件的时候 ,见到error_log,会凭据注册模块的顺序查找指令,这样,会先找到ngx_errlog_module模块,假如此时,error_log是在main设置的,那么和ngx_errlog_module模块error_log的NGX_HTTP_MAIN_CONFmatch,执行ngx_error_log。
假如error_log是在http{}设置的,也会凭据注册模块的顺序查找指令,找到ngx_errlog_module模块的error_log,发明type是NGX_HTTP_MAIN_CONF,不match,继承往下找,找到ngx_http_core_module的error_log,type是NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF,match后执行ngx_http_core_error_log。
上面提到了ngx_error_log 和ngx_http_core_error_log两个函数,这两个函数的成果根基一致,可是因为两个设置浸染域差异,所以设置存储位置差异:ngx_errlog_module存储在cycle->new_log,ngx_http_core_module存储在httpcore模块数据布局ngx_http_core_loc_conf_s的error_log(在此简写成:clcf->error_log)。
clcf->error_log是http模块中的,其主要记录和http请求相关的日志。
cycle->new_log主要记录如历程启动,event等。
可是主历程启动的时候,此时还没有读取设置文件,即没有指定日志打印在那边。nginx这时候固然可以将一些堕落内容可能功效输到尺度输出,可是假如要记录一些系统初始化环境,socket监听状况,照旧需要写到日志文件中去的。在nginx的main函数中,首先会挪用ngx_log_init函数,默认日志文件为:安装路径/logs/error.log,假如这个文件没有权限会见的话,会直接报错退出。在mian函数末了处,在ngx_master_process_cycle函数挪用之前,会close掉这个日志文件。
假如只在main设置了error_log,http{}中没有配置,那么clcf->error_log赋值为clcf->error_log,如下:
staticchar*ngx_http_core_merge_loc_conf(ngx_conf_t*cf,void*parent,void*child){ngx_http_core_loc_conf_t*prev=parent;ngx_http_core_loc_conf_t*conf=child;。。。。。。if(conf->error_log==NULL){if(prev->error_log){conf->error_log=prev->error_log;}else{conf->error_log=&cf->cycle->new_log;}}。。。。。。}
那为什么不把两个指令归并到一起呢。