关于nginx的描述,哪一种是错误的,access
日志文件的话, 一般人看不懂, 不过可以用程序处理一下, 能让你看得懂。能看看wo 的网名吗?能解决这个问题一下的 !!
你的问题呢
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_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。
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_module 模块是先于 ngx_http_core_module 模块注册的 。
在nginx在解析配置文件的时候 ,见到 error_log,会按照注册模块的顺序查找指令,这样,会先找到ngx_errlog_module模块,如果此时,error_log是在main配置的,那么和ngx_errlog_module模块error_log的NGX_HTTP_MAIN_CONF match,执行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存储在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_module_t *ngx_modules[] = {
&ngx_core_module,
&ngx_errlog_module,
&ngx_conf_module,
&ngx_events_module,
&ngx_event_core_module,
&ngx_rtsig_module,
&ngx_epoll_module,
&ngx_regex_module,
&ngx_http_module,
&ngx_http_core_module,
&ngx_http_log_module,
......
}
可见ngx_errlog_module 和 ngx_http_core_module中间有n多模块。这些模块是独立于http的,而且需要日志的打印,这些日志肯定是需要记录的。
则此模块不可省,那么考虑把ngx_http_core_module的error_log合并过来呢,想想也不行,为什么呢?
想想ngx_errlog_module将error_log信息存在哪里,想想ngx_http_core_module的error_log信息存在哪里。
在调用ngx_error_log时候,把针对不同server或者location的error_log信息存储在哪里。(模块之间不能深度耦合)
为了两个模块互不影响,这是个好办法呀!
二:access_log
接下来看一下access_log,access_log指令是属于ngx_http_log_module模块。
ngx_http_log_module有三个指令:
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_module.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_module是属于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配置之WSS
现象描述: 在 https 协议下访问网站时,客户端浏览器控制面板异常信息:这种情况,毫无疑问我们就需要使用 wss:\/\/ 安全协议了,需要将客户端浏览器获取的页面中 webscoket 的形式由 ws:\/\/ 改为 wss:\/\/ WebSocket 可以使用 ws 或 wss 来作为 统一资源标志符 ,类似于 HTTP 或 ...
Nginx实现高并发及原理
4.epoll上面链表中获取文件描述,这里使用内存映射(mmap)技术, 避免了复制大量文件描述符带来的开销 内存映射(mmap):内存映射文件,是由一个文件到一块内存的映射,将不必再对文件执行I\/O操作 (1)nginx相对于apache的优点 1.轻量级,同样起web 服务,比apache 占用更少的内存及资源 2.抗并发,...
nginx与epoll
要了解Nginx中epoll的应用,首先要了解nginx的请求处理机制 为了响应客户端或者对端服务器的请求,服务器一般需要拥有并行或者并发能力,即同时或者同时段可以响应客户端的请求,一般的做法有:多进程的方式,缺点是进程数量过多的时候,内存等系统资源开销过大,可能会导致系统奔溃。多线程的方式,缺点是线程...
服务器nginx永久运行
是的Nginx同Apache一样都是一种Web服务器,基于REST的架构风格,以统一资源描述符(Uniform Resources Identifier)URI或统一资源定位符(Uniform Resources Locator)URL 作为沟通依据,通过HTTP协议提供的网络服务。然而这些服务器在设计之初收到当时环境的局限性,例如当时的用户规模、网络带宽和产品特点_局限...
nginx有几种类型
当描述符多的时候也只是会占用较多的内存而已,而不会造成占用大量cpu时间。以上说的就是Nginx的进程模型和事件模型,事件模型中处理的情况主要有三种,分别是网络事件,如HTTP请求等,网络事件使用异步非阻塞模式就可以很好的解决;还有信号,定时器,信号和定时器还不是很明白。Nginx处理进程间争夺系统资源...
为什么要使用Nginx
不管怎样,这篇文章不是做基准测试来让人们争论(如果你喜欢,可以在Google上找到那样的文章),相反,下面的引述来自人们在现实世界中使用Nginx,在真实的负载下,服务于真正的应用和网站。引述 我们投资的一些公司把web平台切换到Nginx后,可以显著的解决扩展问题。Nginx明显有效的实现了今天互联网上最大...
如何理解Nginx,WSGI,Flask之间的关系
uwsgi 同 wsgi 一样也是一种协议,uWSGI服务器正是使用了 uwsgi 协议 2. uWSGI 实现了 uwsgi 和 WSGI 两种协议的web服务器。注意 uWSGI 本质上也是一种 web服务器,处于上面描述的三层结构中的 web服务器层。3. CGI 通用网关接口,并不限于 Python 语言,定义了 web服务器是如何向客户端提供动态...
nginx能完全卸载吗?
Nginx 是一个高性能的HTTP和 反向代理 服务器,也是一个 IMAP\/POP3\/SMTP 服务器。Nginx是一款面向性能设计的HTTP服务器,相较于Apache、lighttpd具有占有内存少,稳定性高等优势。Nginx 具有很多的优点:1、处理静态文件,索引文件以及自动索引,打开文件描述符缓冲。2.无缓存的反向代理加速,简单的负载均衡...
通过nginx进行wss和ws协议转换
问题描述:提示:发现微信小程序在正式阶段只支持wss协议,由于通信采用https,所以ws协议无法直接使用,测试开发阶段可以采用ws协议进行 原因分析:原因在于https和http不能混合使用,wss和ws也是对应的,https下无法使用http和ws协议 解决方案:于是想到采用nginx代理的方式进行协议转换,解决通信问题,这样既不...
apache和nginx的区别
nginx相对于apache的区别是:轻量级,同样起web 服务,比apache 占用更少的内存及资源 抗并发,nginx 处理请求是异步非阻塞的,而apache 则是阻塞型的,在高并发下nginx 能保持低资源低消耗高性能 高度模块化的设计,编写模块相对简单 社区活跃,各种高性能模块出品迅速 apache 相对于nginx 的优点:rewrite...
危彼艾米: nginx的错误状态码的定义位于ngx_core.h文件中,在1.5.4版本中,定义的状态码有7种,分别是:#define NGX_OK 0#define NGX_ERROR -1#define NGX_AGAIN -2#define NGX_BUSY -3#define NGX_DONE -4#define NGX_DECLINED -5#define NGX_ABORT -6 另外,在ngx_conf_file.h文件中还有配置文件的错误码定义,在ngx_log.h文件中有和log相关的错误码的定义,在ngx_http_request.h文件中有对http相关状态码的定义.
余杭区13854398275: nginx的Status Code 499是什么错误 - ?
危彼艾米: 499这个状态码并不是http协议中定义的status code,而是nginx自己定义的一个状态码.当客户端主动断开连接的时候,nginx就会返回499的状态码.一般情况下和请求的超时设置有关系,比如用户用浏览器访问某个网页的时候,如果在nginx还没有处理完请求的时候,用户就关闭了网页活着浏览器,则这个时候,nginx就会以499的状态码进行影响,标明客户端主动断开了连接.
余杭区13854398275: 502 bad gateway nginx是网站停了吗 - ?
危彼艾米: nginx属于http反向代理,502错误最通常的出现情况就是后端主机当机.在upstream配置里有这么一项配置:proxy_next_upstream,这个配置指定了 nginx在从一个后端主机取数据遇到何种错误时会转到下一个后端主机,里头写上的就是会出现502的所有情况拉,默认是error timeout.error就是当机、断线之类的,timeout就是读取堵塞超时,比较容易理解.
余杭区13854398275: 502 bad gateway nginx是什么意思 - ?
危彼艾米: 服务器错误. NGINX 502 Bad Gateway是由于php服务响应超时、php进程不足等引起的一类服务器错误. 发生原因: 1、PHP FastCGI进程数不够用 当网站并发访问巨大时,php fastcgi的进程不一定能响应所有的访问,因为cgi是单线程多进程...
余杭区13854398275: nginx报如下错误,不能启动是什么原因 - ?
危彼艾米: nginx启动报错一般有以下原因: 1.监听的端口冲突,一般是有程序已经监听了80端口,需要关闭正在监听80端口的程序,或让nginx监听其他端口 2.配置文件错误,配置文件存在语法错误会导致启动报错,需要根据文档正确的对配置文件进行改正 3.配置文件使用记事本编辑过,导致保存为带BOM头的utf-8文件,报错中可以看到乱码,需要使用其他编辑器将文件编码改为无BOM头的utf-8类型
余杭区13854398275: nginx error中文意思 - ?
危彼艾米: Nginx是一款面向性能设计的HTTP服务器 就是nginx错误的意思
余杭区13854398275: nginx不得不说的参数之 为什么nginx error - ?
危彼艾米: nginx不得不说的参数之 proxy_intercept_errors与fastcgi_intercept_errors 为什么我的error_page 配置没有生效,没有正常跳转?我也遇到过这个问题,所以这才促使我对proxy_intercept_errors与fastcgi_intercept_errors这两个参数做了详细的了...