Web开发

首页 » 常识 » 预防 » NGINX开发指南Part2
TUhjnbcbe - 2022/5/31 17:30:00

前文请戳:NGINX开发指南(Part)

nginx提供了ngx_slab_pool_t来分配共享内存。对每个zone,slabpool会自动创建用来分配内存。这个池在共享zone的开头,并且通过表达式(ngx_slab_pool_t*)shm_zone-shm.addr访问。共享内存的分配通过调用ngx_slab_alloc(pool,size)/ngx_slab_calloc(pool,size)函数完成,内存通过调用ngx_slab_free(pool,p)释放。

slabpool将共享zone分成多个页。每个页被用于分配同样大小的对象。大小推荐为的次方,并且不小于8。其它值被四舍五入。对每个页,bitmask被用来表示哪些块是已经使用的和哪些是空闲的。对大小超过半页(通常是字节),将按完整的页大小分配。

为了保护数据不会并发访问,需要有ngx_slab_pool_t的mutex字段。mutex在分配和释放内存里被使用。然后它也可以用来保护其它分配自共享内存的数据。调用ngx_shmtx_lock(shpool-mutex)锁住,调用ngx_shmtx_unlock(shpool-mutex)解锁。

日志

nginx用ngx_log_t对象记录日志。nginx的日志提供以下几种方式:

stderr—记录到标准错误输出

file—记录到文件

syslog—记录到syslog

memory—记录到内部内存用于开发的目的。这块内存可以在debugger时访问。

一个日志实例可以是一个日志对象链接,每个通过next连接起来。每个消息都被写到所有的日志对象。

每个日志对象有错误级别,用于限制消息写到它自己。以下是nginx提供的几种错误级别:

NGX_LOG_EMERG

NGX_LOG_ALERT

NGX_LOG_CRIT

NGX_LOG_ERR

NGX_LOG_WARN

NGX_LOG_NOTICE

NGX_LOG_INFO

NGX_LOG_DEBUG

对于调试日志,有以下几种选项:

NGX_LOG_DEBUG_CORE

NGX_LOG_DEBUG_ALLOC

NGX_LOG_DEBUG_MUTEX

NGX_LOG_DEBUG_EVENT

NGX_LOG_DEBUG_HTTP

NGX_LOG_DEBUG_MAIL

NGX_LOG_DEBUG_STREAM

通常而言,日志是通过error_log指令创建的,并且在各个阶段都有效,cycle,配置解析,客户端连接和其它。

nginx提供以下的日志宏:

ngx_log_error(level,log,err,fmt,...)—记录错误

ngx_log_debug0(level,log,err,fmt),ngx_log_debug(level,log,err,fmt,arg)etc—调试日志,提供最多8个可格式化的参数。

一条日志被存放于栈上大小为NGX_MAX_ERROR_STR(当前为字节)的缓冲区里。日志消息的前缀由错误等级,进程PID,连接id(存储于log-connection)以及系统错误文本组成。对于非调式日志(non-debug),log-handler也会被调用以向日志消息增加更多的具体信息。HTTP模块将ngx_

1
查看完整版本: NGINX开发指南Part2