这里要提到的上下文是针对HTTP请求的, 每个HTTP请求对应于每一个HTTP模块都可以有一个独立的上下文结构体.(可以看出, 并不是一个HTTP请求的上下文由所有HTTP模块共享)
之所以使用上下文, 是因为 Nginx是一个全异步处理的Web服务器, 1个请求并不会在epoll的一次调度中处理完成, 甚至会在成千上万的HTTP模块后才能完成请求的处理.
既然上下文是针对某请求的某模块的, 那么可以根据前文中, 存储某模块存储create_main_conf函数返回的结构体的方式了解到, 其实所有模块在每个请求中都对应了数组的一个元素, 所以可以根据数组下标来找到对应模块的数据.
使用上下文的方式就是调用下面这两个宏:
每个请求对于每个模块的上下文结构体一般是在刚开始处理请求时在内存池分配它. 之后经过epoll, HTTP框架再次调用到HTTP模块的处理方法时, 这个HTTP模块可以由请求的上下文结构中获取信息. 在请求结束后, 其对应的内存池被释放, 申请的上下文也就被释放了. 因为上下文是针对某请求的某一个模块的, 所以如果某模块不需要上下文, 完全可以不理会.
之所以使用上下文, 是因为 Nginx是一个全异步处理的Web服务器, 1个请求并不会在epoll的一次调度中处理完成, 甚至会在成千上万的HTTP模块后才能完成请求的处理.
既然上下文是针对某请求的某模块的, 那么可以根据前文中, 存储某模块存储create_main_conf函数返回的结构体的方式了解到, 其实所有模块在每个请求中都对应了数组的一个元素, 所以可以根据数组下标来找到对应模块的数据.
使用上下文的方式就是调用下面这两个宏:
#define ngx_http_get_module_ctx(r, module) (r)->ctx[module.ctx_index]
#define ngx_http_set_ctx(r, c, module) r->ctx[