《深入理解Nginx:模块开发与架构解析》示例代码下载

《深入理解Nginx:模块开发与架构解析》示例代码下载

第三章示例源代码:

chapter3

第四章示例源代码:

chapter4

第五章示例源代码:

chapter5

第六章示例源代码:

chapter6

(转载本站文章请注明作者和出处 陶辉笔记 ,请勿用于任何商业用途)



10 thoughts on “《深入理解Nginx:模块开发与架构解析》示例代码下载

  1. 一口气看完本书第2版前7章,Very enlightening!
    不过个人再从鸡蛋里挑点骨头,主要是第7章hash表这里有2个疑问(主要是第2个):

    1. 书中提到nginx用的是开放地址法来处理冲突,个人认为从定义看其实应该还是分离链接法,只不过用的是数组而非链表来存放hash到同一个bucket的key;因为nginx的hash表是只读的,而通常用链表是为了方便支持插入删除等操作.

    对应到 章节配图7-10 “ngx_hash_t基本散列表的结构示意图”,buckets指针其实是指向一个存”链表头”的bucket数组,而不是直接指向elt存储. 当然这里已明确指明了仅仅是”示意图”.

    2. 在7.7.3使用例子这一节,如果作为一个独立完整的例子,在调用ngx_hash_wildchard_init之前应当对key数组做个排序,否则可能会有问题:
    //sort first
    ngx_qsort(ha.dns_wc_head.elts, (size_t) ha.dns_wc_head.nelts,
    sizeof(ngx_hash_key_t), ngx_http_cmp_dns_wildcards);

    //wildcard_init
    hash.hash = NULL;
    hash.temp_pool = ha.temp_pool;
    if (ngx_hash_wildcard_init(&hash, ha.dns_wc_head.elts, ha.dns_wc_head.nelts) != NGX_OK) {…}
    后面的wc_tail也是同样的. ngx_http_cmp_dns_wildcards就是简单地将key的data按字符串排序.

    具体Case:
    假如TestNode中存放的如下servername数据:
    *.example.com
    *.test.com
    *.woofy.cn
    *.com
    *.taohui.com
    如果不做上面的排序,则查询”www.taohui.com”时会返回NULL,无法匹配*.taohui.com,查询”www.qq.com”也不会命中”*.com”, 但 “*.example.com” 和 “*.test.com”能够被正常的匹配到,原因是递归地构造通配符hash表示代码默认是排好序的,但实际上不一定,造成最终构造出的hash表会存在重复key,每个key下只有部门不完整的value(子表),而查询时只会查询并跟进第一个key的子表,导致丢失.

    看了下其他官方模块也是有事先保证有序的逻辑. 测试版本用的与本书对应的1.0.14的代码.

    Terrific Book! Reading on!

  2. 您好,看完了书中第五章使用subrequest来请求上游数据到内存中加以处理,我有个疑问:如果上游的数据量比较大,一个buffer放不下,在subrequest的post handler里该如何处理呢?我试着将数据处理后调整buf->pos和buf->last为buf->start,然后返回NGX_DONE期待框架继续调用post handler。然后框架并没有继续调用,在error_log中出现upstream buffer is too small to read response while reading response header from upstream错误。请问该如何处理?或者有类似的模块代码可以参考一下吗?谢谢

  3. 第4章的代码有个bug。
    void traversal(ngx_conf_t *cf, ngx_http_location_tree_node_t* node)
    函数里,仅递归遍历了node->left, node->right,还缺一个node->tree。
    在traversal(cf, node->right)后面还应该加上 traversal(cf, node->tree)。

  4. 最近看subrequest部分的内容,执行subrequest demo发现nginx会报一个错误
    2017/09/20 17:30:05 [alert] 34037#0: *1 http request count is zero while sending to client, client: 192.168.56.4, server: localhost, request: “GET /query HTTP/1.1”, host: “192.168.56.1”
    也就是r->main->count等于0了。
    这是一个可以忽略的错误吗?或者是demo没有兼容nginx.

  5. 第二版218页
    如果遍历dynamicArray的代码好像有问题
    for (; arraySeq nelts; arraySeq++) {
    a = nodeArray + arraySeq; // 这里未考虑每个元素的大小,感觉应该是a = nodeArray + arraySeq * dynamicArray->size
    }

发表评论

电子邮件地址不会被公开。 必填项已用*标注

浙公网安备 33010802009076号