前文请戳: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_