关于nginx的描述,哪一种是错误的,access
发布网友
发布时间:2022-02-27 01:31
我来回答
共1个回答
热心网友
时间:2022-02-27 03:00
nginx配置中有关日志的配置主要是围绕着下面两个指令:
1、error_log
2、access_log:记录访问日志
首先要强调的一点是,如果access日志和error日志都是常量文件名(因为access支持变量文件名,后续会讲到),那么nginx进程会缓存文件描述符直到进程结束。
什么时候日志的fd会改变呢?
1)进程重启
2)收到了NGX_REOPEN_SIGNAL信号,会产生新的日志文件
其他情况下,日志的fd不变,所以当进程运行中,删除了日志文件的话,并不会生成新的日志文件,且日志都会丢失
下面详细讲一下这两个指令的来龙去脉
一:先说error_log:
nginx有两个模块支持error_log指令:
一个是 ngx_errlog_mole ,这个模块只有一个指令,就是error_log ,配置类型为:NGX_MAIN_CONF,回调函数为:ngx_error_log;
另一个是 ngx_http_core_mole,这个模块中也有指令:error_log ,配置类型为:NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF,回调函数为:ngx_http_core_error_log。
static ngx_command_t ngx_errlog_commands[] = {
{ngx_string("error_log"),
NGX_MAIN_CONF|NGX_CONF_1MORE,
ngx_error_log,
0,
0,
NULL},
ngx_null_command
};
static ngx_command_t ngx_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_mole 模块是先于 ngx_http_core_mole 模块注册的 。
在nginx在解析配置文件的时候 ,见到 error_log,会按照注册模块的顺序查找指令,这样,会先找到ngx_errlog_mole模块,如果此时,error_log是在main配置的,那么和ngx_errlog_mole模块error_log的NGX_HTTP_MAIN_CONF match,执行ngx_error_log。
如果error_log是在http{}配置的,也会按照注册模块的顺序查找指令,找到ngx_errlog_mole模块的error_log,发现type是NGX_HTTP_MAIN_CONF,不match,继续往下找,找到ngx_http_core_mole的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_mole存储在cycle->new_log,ngx_http_core_mole存储在http core模块数据结构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,如下:
static char *
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;
}
}
。。。。。。
}
那为什么不把两个指令合并到一起呢。
首先看一下模块注册顺序:
ngx_mole_t *ngx_moles[] = {
&ngx_core_mole,
&ngx_errlog_mole,
&ngx_conf_mole,
&ngx_events_mole,
&ngx_event_core_mole,
&ngx_rtsig_mole,
&ngx_epoll_mole,
&ngx_regex_mole,
&ngx_http_mole,
&ngx_http_core_mole,
&ngx_http_log_mole,
......
}
可见ngx_errlog_mole 和 ngx_http_core_mole中间有n多模块。这些模块是独立于http的,而且需要日志的打印,这些日志肯定是需要记录的。
则此模块不可省,那么考虑把ngx_http_core_mole的error_log合并过来呢,想想也不行,为什么呢?
想想ngx_errlog_mole将error_log信息存在哪里,想想ngx_http_core_mole的error_log信息存在哪里。
在调用ngx_error_log时候,把针对不同server或者location的error_log信息存储在哪里。(模块之间不能深度耦合)
为了两个模块互不影响,这是个好办法呀!
二:access_log
接下来看一下access_log,access_log指令是属于ngx_http_log_mole模块。
ngx_http_log_mole有三个指令:
static ngx_command_t ngx_http_log_commands[] = {
{ ngx_string("log_format"),
NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_2MORE,
ngx_http_log_set_format,
NGX_HTTP_MAIN_CONF_OFFSET,
0,
NULL },
{ ngx_string("access_log"),
NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF
|NGX_HTTP_LMT_CONF|NGX_CONF_TAKE123,
ngx_http_log_set_log,
NGX_HTTP_LOC_CONF_OFFSET,
0,
NULL },
{ ngx_string("open_log_file_cache"),
NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1234,
ngx_http_log_open_file_cache,
NGX_HTTP_LOC_CONF_OFFSET,
0,
NULL },
ngx_null_command
};
每个block都可以配置上面的指令 ,这些指令对应着各个block配置中的loc[ngx_http_log_mole.index](要理解这个,需要知道配置文件的整个解析过程和block对应关系),即下面这个数据结构:
typedef struct {
ngx_array_t *logs; /* array of ngx_http_log_t */
ngx_open_file_cache_t *open_file_cache;
time_t open_file_cache_valid;
ngx_uint_t open_file_cache_min_uses;
ngx_uint_t off; /* unsigned off:1 */
} ngx_http_log_loc_conf_t;
关于access_log主要有以下几个点:
1、ngx_http_log_mole是属于nginx状态机最后一个阶段NGX_HTTP_LOG_PHASE的处理模块,即一个http请求结束时执行的,它的任务就是打印这次request的访问情况。
2、access_log支持根据变量指令路径,如:
access_log logs/'$remote_addr'access.log main;
3、不管是变量路径还是常量路径,都将信息放入了 ngx_http_log_loc_conf_t的logs这个数组里进行管理,logs数组的元素是ngx_http_log_t。
关于nginx的描述,哪一种是错误的,access
一:先说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_...
ZESTRON表界面分析
在Dr. O.K. Wack Chemie GmbH,我们高度重视ZESTRON的表界面分析技术。该技术通过深入研究材料表面与界面的性质,为提升产品质量与可靠性提供了有力支持。ZESTRON的表界面分析不仅涵盖了相变化、化学反应、吸附与解吸等关键领域,还通过高精度仪器如固体表面Zeta电位分析仪等,确保数据准确可靠。这些分析手段对于优化产品配方、改进生产工艺、预防失效问题等具有重要意义,是我们不断提升产品性能与质量的重要工具。表面污染分析包括评估表面上存在的颗粒、残留物或物质。通过利用显微镜、光谱学和色谱法等技术,分析人员可以识别和表征污染物,以确定其成分和来源。这种分析在电子、制药和制造等各个行业中至关重要,以确保产品质量、性能和安全性。了解表面...
linux nginx 经常自己关闭是什么问题
nginx 日志分为 错误日志和访问日志 错误日志是 error.log 访问日志是 access.log 假死应该看错误日志 该日志的位置 /usr/local/nginx-1.7.8/logs
nginx不得不说的参数之 为什么nginx error
nginx proxy 启用自定义错误页面:语法:proxy_intercept_errors on | off;默认值:proxy_intercept_errors off;上下文:http, server, location 当被代理的后端服务器的响应状态码大于等于300时,决定是否直接将响应发送给客户端,亦或将响应转发给nginx由error_page指令来处理。
nginx的Status Code 499是什么错误Site
打开Nginx的access.log发现在最后一次的提交是出现了HTTP1.1 499 0 -这样的错误,在百度搜索nginx 499错误,结果都是说客户端主动断开了连接。但经过我的测试这显然不是客户端的问题,因为使用端口+IP直接访问后端服务器不存在此问题,后来测试nginx发现如果两次提交post过快就会出现499的情况,看来是nginx...
nginx的access.log日志怎样看
状态码,200表示成功,404表示页面不存在,301表示永久重定向等,具体状态码含义可以在网上找);来源页面(即从哪个页面转到本页,专业名称叫做“referer”);浏览器版本。其实nginx access日志的格式不是一成不变的,是可以自定义的。在nginx的nginx.conf配置文件找到:log_format 这里就是日志的格式 ...
Nginx的配置指令执行的顺序 11 个阶段
Nginx的配置指令执行不是按照配置的先后顺序执行,二十分为11 个阶段post-read、server-rewrite、find-config、rewrite、post-rewrite、preaccess、access、post-access、try-files、content 以及 log , Nginx配置文件中的所有指令是按照上面11个阶段的顺讯执行。 set_real_ip_from的值可以是一个ip,也可以是一个ip段...
真心求助.nginx错误
Nginx服务器错误一般有以下几点原因:1、请求的header过大。nginx默认的header长度上限是4k,如果超过了这个值,nginx会直接返回400错误.解决方法:配置nginx.conf相关设置。可以通过以下2个参数来调整header上限:client_header_buffer_size 16k;large_client_header_buffers 4 16k。2、上传文件过程中出现错误...
Nginx遇上Access Denied提示怎么解决
文件/usr/local/nginx/logs/error.log FastCGI sent in stderr: "Access to the script '/var/www/html//phpmyadmin/setup/styles.css' has been denied (see security.limit_extensions)"打开日志发现会出现security.limit_extensions 这样的错误。经过查找资料发现从5.3.9开始,php官方加入了一个...
502 bad gateway nginx 错误日志在哪
一般在你配置的 server 里面的 location 里面配置的access_log 所指定的路径的日志文件里面。
Nginx遇上Access Denied提示怎么解决
使用的nginx安装版安装的,对吧?是不是权限配置问题?看一下事件查看器,报什么错!