日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

Nginx的error_log和Access_log分析 nginx access log( 三 )


typedef struct {
ngx_array_t *lengths;
ngx_array_t *values;
} ngx_http_log_script_t;
4、不管是error_log還是access_log,nginx都是通過保存文件句柄來進行快速寫日志文件的 。但是因為access_log支持根據(jù)變量指令路徑,如果按照request或者ip來分隔不同的access日志,那么可想而至,若還按照保存文件句柄的方式來寫日志文件,會造成系統(tǒng)fd的大量占用 。nginx在此進行了優(yōu)化:
1)如果用常量指定acess日志路徑:
access_log logs/access.log main;
那么和error_log一樣,將文件路徑名稱放到cycle->open_files中去,這是個list,在路徑加入這個list的時候會進行除重操作的 。在所有的模塊初始化完畢,會依次打開這些文件路徑,獲取到fd,以備打印日志使用 。
打印日志的時候調用函數(shù):ngx_write_fd
2)如果用變量指定acess日志路徑:
使用script標記日志文件為變量文件名的 。
打印日志的時候調用函數(shù):ngx_http_log_script_write
在這個函數(shù)里,體現(xiàn)出了對緩存fd的管理 。這些和指令open_file_log_cache的配置是息息相關的(后面會詳細介紹) 。
打日志的函數(shù):
static void
ngx_http_log_write(ngx_http_request_t *r, ngx_http_log_t *log, u_char *buf,
size_t len)
{
u_char *name;
time_t now;
ssize_t n;
ngx_err_t err;
if (log->script == NULL) {
name = log->file->name.data;
n = ngx_write_fd(log->file->fd, buf, len);
} else {
name = NULL;
n = ngx_http_log_script_write(r, log->script, &name, buf, len);
}
......
}
5、說到緩存文件描述符,nginx有兩個指令是管理緩存文件描述符的
一個就是本文中說到的ngx_http_log_module模塊的open_file_log_cache;
一個是ngx_http_core_module模塊的 open_file_cache;
前者是只用來管理access變量日志文件 。
后者用來管理的就多了,包括:static,index,tryfiles,gzip,mp4,flv,看到了沒,都是靜態(tài)文件哦!
這兩個指令的handler都調用了函數(shù) ngx_open_file_cache_init ,這就是用來管理緩存文件描述符的第一步:初始化
ngx_open_file_cache_t *
ngx_open_file_cache_init(ngx_pool_t *pool, ngx_uint_t max, time_t inactive)
{
ngx_pool_cleanup_t *cln;
ngx_open_file_cache_t *cache;
cache = ngx_palloc(pool, sizeof(ngx_open_file_cache_t));
if (cache == NULL) {
return NULL;
}
ngx_rbtree_init(&cache->rbtree, &cache->sentinel,
ngx_open_file_cache_rbtree_insert_value);
ngx_queue_init(&cache->expire_queue);
cache->current = 0;
cache->max = max;
cache->inactive = inactive;
cln = ngx_pool_cleanup_add(pool, 0);
if (cln == NULL) {
return NULL;
}
cln->handler = ngx_open_file_cache_cleanup;
cln->data = http://www.ljsggw.cn/internet/cache;
return cache;
}
可以看到nginx管理緩存文件描述符,使用了紅黑樹和隊列,這個后續(xù)還是作為一篇文章來敘述吧,涉及的內容有點多,本文還是以分析日志模塊為主 。
6、說一下指令 open_file_log_cache
1)nginx下默認這個指令的配置是:open_file_log_cache off;
也就是說不對access變量日志文件的fd做緩存,每寫一個文件就打開,然后寫日志 。那么這個文件fd什么時候關閉呢 。
這就涉及到nginx內存管理的cleanup了,cleanup可以注冊,在內存池被銷毀的時候,調用cleanup鏈表中各個cleanup的handler(詳細可以去翻閱nginx內存池管理)
而此時的文件fd就是在request完畢后,銷毀內存池的時候,關閉fd 。
配置open_log_file_cache off; 時的運行
這是獲取access變量文件fd的函數(shù),返回值應該是access日志的fd 。

推薦閱讀