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

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

第三章示例源代码:

chapter3

第四章示例源代码:

chapter4

第五章示例源代码:

chapter5

第六章示例源代码:

chapter6

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

17 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
    }

  6. 第一版 408页:
    3)。。。“如果一个事件的读写标志同时为1时,仅write_event_handler方法会被调用,即可写事件的处理优先于可读事件”。。。
    —我对这句话有点疑问,一个事件对象(ngx_event_t)不是非读即写的吗?怎么会读写标志同时为1呢?

  7. 11.6 处理HTTP请求
    “ngx_http_request_handler方法的执行流程”解读的 步骤3)— 调用read_event_handler方法

  8. 陶老师,您好,那个您给的书中第五章的例子代码,upstream模块的nginx.conf配置文件如下所示:
    #user nobody;
    worker_processes 1;

    error_log logs/error.log debug;

    events {
    worker_connections 1024;
    }

    http {
    include mime.types;
    default_type application/octet-stream;

    #log_format main ‘$remote_addr – $remote_user [$time_local] “$request” ‘
    # ‘$status $body_bytes_sent “$http_referer” ‘
    # ‘”$http_user_agent” “$http_x_forwarded_for”‘;

    #access_log logs/access.log main;

    keepalive_timeout 65;

    server
    {
    listen 8080;
    location /test
    {
    mytest;
    }
    }
    }
    是不是有问题呢?我这样配置的话,访问http://180.76.57.247:8080/test 会返回
    403 Forbidden的,难道是我使用错了还是配置文件有问题呢?

    1. debug日志已经打开了,那么看一下debug日志,你搜一下403 Forbidden,它之前的日志会告诉你为什么会这样的

  9. 下载了第5章的源代码,编译到ngxin中,好像没返回google的网页.为了排除GFW问题换成了baidu,也不行.
    nginx 版本: 1.15.2

Leave a Reply

Your email address will not be published. Required fields are marked *

浙公网安备 33010802009076号