一些杂笔记

http://tengine.taobao.org/book/chapter_04.html nginx模块开发工具书

https://www.kancloud.cn/digest/understandingnginx/202597nginx基础知识

https://blog.csdn.net/chaoyu168/article/details/49906145 客户端服务端简单认证

https://www.cnblogs.com/xuyh/p/3273082.htmlfcntl函数

https://blog.csdn.net/drdairen/article/details/53896354网络编程epoll

 

https://segmentfault.com/a/1190000009237425 nginx location配置详解

(比如使用无正则表达式匹配 location /hello {},会出现实际访问时hello后面随便输什么字符都可以进入那个网页,但使用精确匹配“=” location = /hello{} 就不会出现这种情况)

 

https://blog.csdn.net/simongeek/article/details/45271089 Ubuntu 常用指令

https://blog.csdn.net/dcrmg/article/details/78000961 Ubuntu中搜索文件或文件夹的方法

 

https://man.linuxde.net/curl curl命令

https://ec.haxx.se/usingcurl-tls.html using curl tls

 

https://blog.csdn.net/kofiory/article/details/5790409 linux errno意义

https://tonydeng.github.io/rfc8040-zh/section-4/ RFC8040中文翻译

https://blog.csdn.net/qing101hua/article/details/53516583设置LD_LIBRARY_PATH变量

 

https://oi-wiki.org/math/bit/ 一些知识点

 

一些nginx模块开发实例

https://www.cnblogs.com/breg/p/4043642.html hello module解析

https://haobook.readthedocs.io/zh_CN/latest/periodical/201608/haoyankai.html

http://www.freecls.com/a/2712/ea

http://www.freecls.com/a/2712/d9

https://blog.csdn.net/qq_27443505/article/details/83351694

https://www.nginx.com/resources/wiki/modules/index.html

https://blog.csdn.net/for_tech/article/details/51436466nginx指令模块示意

https://www.docs4dev.com/docs/zh/nginx/current/reference/dev-development_guide.html模块开发指导

 

Nginx + fastcgi

https://blog.csdn.net/allenlinrui/article/details/19419721

https://www.yangyu.club/p-214.html fastcgi文档

 

tls相关

https://colobu.com/2016/06/07/simple-golang-tls-examples/使用go实现tls客户端和服务器

http://www.ruanyifeng.com/blog/2014/02/ssl_tls.html SSL/TLS协议运行机制

https://dyn.im/2017/04/03/30/ nginx+tls1.3

https://liqiang.io/post/secure-nginx-with-bidirect-with-self-cert-keysNginx SSL 双向认证,key 生成和配置

https://github.com/TanNang/tls-proxy tls配置

https://github.com/ptonlix/MQTTWithTLS TLS客户端

https://blog.csdn.net/ptonlix/article/details/79866925

https://blog.csdn.net/ptonlix/article/details/79869756

 

tcpdump相关

https://www.cnblogs.com/lchb/articles/5545345.html tcp通信数据流分析--tcpdump

https://www.jianshu.com/p/df62ac76ec5b tcpdump使用和分析

 

nginx相关

https://xnow.me/ops/Nginx-url-and-pass-header.html Nginx中的url参数获取和header传递方法

http://blog.sina.com.cn/openresty nginx变量相关

https://xnow.me/ops/best-curl-cmd.html curl命令

https://xnow.me/ops/nginx-log-http-header-in-access-log.htmlNginx记录用户请求Header到access log

https://blog.daliansky.net/an-nginx-405-not-allowed-error-solution.html

Nginx 405错误

https://www.bbsmax.com/A/gAJG6eQXzZ/nginx模块编程之获取客户ip及端口号

https://blog.csdn.net/larryliuqing/article/details/7846366Ngx_connection_s 结构体分析报告

https://ialloc.org/blog/ngx-notes-prerequisite/#ngx-http-finalize-connection nginx一些函数解释

http://chinaunix.net/uid-28541347-id-4700074.htmlsocket编程服务器客户端交互与重定向

 

vim中使用shift+insert粘贴。 推荐使用ctrl+insert复制,shift+insert粘贴

vi中大写锁定+g直接到文件尾

 

Linux中可以使用man查看命令参数

 

可以使用Ctrl r搜索之前的命令,如果不是继续按Ctrl r即可

 

Linux中实时显示文档(logtxt等)内容

tail -f ***.log

 

Ps -ef|grep xxx查看进程

Netstat -an|grep xxx查看端口

netstat -ntulp|grep 4001 查看端口占用情况

Find / -name *** 在根目录中寻找名字为***的所有路径

 

 

Gdb ./

Fs src

Fs cmd

Start

R

N

 

 

 

 

MIME type 该资源的媒体类型。

 

超文本标记语言文本 .html,.html text/html

普通文本 .txt text/plain

RTF文本 .rtf application/rtf

GIF图形 .gif image/gif

JPEG图形 .ipeg,.jpg image/jpeg

au声音文件 .au audio/basic

MIDI音乐文件 mid,.midi audio/midi,audio/x-midi

RealAudio音乐文件 .ra, .ram audio/x-pn-realaudio

MPEG文件 .mpg,.mpeg video/mpeg

AVI文件 .avi video/x-msvideo

GZIP文件 .gz application/x-gzip

TAR文件 .tar application/x-tar

 

 

 

 

 

ngx_pool_t

提供了一种机制,帮助管理一系列的资源(如内存,文件等),使得对这些资源的使用和释放统一进行,免除了使用过程中考虑到对各种各样资源的什么时候释放,是否遗漏了释放的担心。(智能指针?)

使用ngx_pool_t这个数据结构的时候,所有的资源的释放都在这个对象被销毁的时刻,统一进行了释放。比如,我们需要依次使用A,B,C三个资源,且使用完B的时候,A就不会再被使用了,使用C的时候A和B都不会被使用到。如果不使用ngx_pool_t来管理这三个资源,那我们可能从系统里面申请A,使用A,然后在释放A。接着申请B,使用B,再释放B。最后申请C,使用C,然后释放C。但是当我们使用一个ngx_pool_t对象来管理这三个资源的时候,A,B和C的释放是在最后一起发生的,也就是在使用完C以后。

 

ngx_pool_t *ngx_create_pool(size_t size, ngx_log_t *log);

创建一个初始节点大小为size的pool,log为后续在该pool上进行操作时输出日志的对象。 需要说明的是size的选择,size的大小必须小于等于NGX_MAX_ALLOC_FROM_POOL,且必须大于sizeof(ngx_pool_t)。

 

选择大于NGX_MAX_ALLOC_FROM_POOL的值会造成浪费,因为大于该限制的空间不会被用到(只是说在第一个由ngx_pool_t对象管理的内存块上的内存,后续的分配如果第一个内存块上的空闲部分已用完,会再分配的)。

 

选择小于sizeof(ngx_pool_t)的值会造成程序崩溃。由于初始大小的内存块中要用一部分来存储ngx_pool_t这个信息本身。

 

ngx_array_t

 

 

 

 

Nginx 模块有三种角色:

 

处理请求并产生输出的 Handler 模块;

处理由 Handler 产生的输出的 Filter(滤波器)模块;

当出现多个后台服务器时,Load-balancer (负载均衡器)模块负责选择其中一个后台服务器发送请求;

 

 

 

现一个handler的步骤:

  1. 编写模块基本结构。包括模块的定义,模块上下文结构,模块的配置结构等。
  2. 实现handler的挂载函数。根据模块的需求选择正确的挂载方式。
  3. 编写handler处理函数。模块的功能主要通过这个函数来完成。

 

struct ngx_command_s {

    ngx_str_t             name; 

    ngx_uint_t            type;

    char               *(*set)(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);

    ngx_uint_t            conf;

    ngx_uint_t            offset;

    void                 *post;

};

参考http://tengine.taobao.org/book/chapter_03.html

 

typedef struct {
    ngx_int_t   (*preconfiguration)(ngx_conf_t *cf);
    ngx_int_t   (*postconfiguration)(ngx_conf_t *cf);

void       *(*create_main_conf)(ngx_conf_t *cf);
    char       *(*init_main_conf)(ngx_conf_t *cf, void *conf);

void       *(*create_srv_conf)(ngx_conf_t *cf);
    char       *(*merge_srv_conf)(ngx_conf_t *cf, void *prev, void *conf);

void       *(*create_loc_conf)(ngx_conf_t *cf);
    char       *(*merge_loc_conf)(ngx_conf_t *cf, void *prev, void *conf);
} ngx_http_module_t;

preconfiguration:

         在创建和读取该模块的配置信息之前被调用。

 

postconfiguration:

         在创建和读取该模块的配置信息之后被调用。

 

create_main_conf:

         调用该函数创建本模块位于http block的配置信息存储结构。该函数成功的时候,返回创建的配置对象。失败的话,返回NULL。

 

init_main_conf:        调用该函数初始化本模块位于http block的配置信息存储结构。该函数成功的时候,返回NGX_CONF_OK。失败的话,返回NGX_CONF_ERROR或错误字符串。

 

create_srv_conf:

         调用该函数创建本模块位于http server block的配置信息存储结构,每个server block会创建一个。该函数成功的时候,返回创建的配置对象。失败的话,返回NULL。

 

merge_srv_conf:        因为有些配置指令既可以出现在http block,也可以出现在http server block中。那么遇到这种情况,每个server都会有自己存储结构来存储该server的配置,但是在这种情况下http block中的配置与server block中的配置信息发生冲突的时候,就需要调用此函数进行合并,该函数并非必须提供,当预计到绝对不会发生需要合并的情况的时候,就无需提供。当然为了安全起见还是建议提供。该函数执行成功的时候,返回NGX_CONF_OK。失败的话,返回NGX_CONF_ERROR或错误字符串。

 

create_loc_conf:

         调用该函数创建本模块位于location block的配置信息存储结构。每个在配置中指明的location创建一个。该函数执行成功,返回创建的配置对象。失败的话,返回NULL。

 

merge_loc_conf:        与merge_srv_conf类似,这个也是进行配置值合并的地方。该函数成功的时候,返回NGX_CONF_OK。失败的话,返回NGX_CONF_ERROR或错误字符串。

 

 

ngx_module_t ngx_http_hello_module = {
    NGX_MODULE_V1,
    &ngx_http_hello_module_ctx,    /* module context */
    ngx_http_hello_commands,       /* module directives */
    NGX_HTTP_MODULE,               /* module type */
    NULL,                          /* init master */
    NULL,                          /* init module */
    NULL,                          /* init process */
    NULL,                          /* init thread */
    NULL,                          /* exit thread */
    NULL,                          /* exit process */
    NULL,                          /* exit master */
    NGX_MODULE_V1_PADDING
};

 

按需挂载

以这种方式挂载的Handler 也被称为content handler。当一个请求进来以后,Nginx 从NGX_HTTP_POST_READ_PHASE 阶段开始依次执行每个阶段中所有 Handler。执行到  NGX_HTTP_CONTENT_PHASE 阶段时,如果这个location 有一个对应的content handler 模块,那么就去执行这个content handler 模块真正的处理函数。否则继续依次执行NGX_HTTP_CONTENT_PHASE 阶段中所有content phase handlers,直到某个函数处理返回NGX_OK 或者NGX_ERROR。但是使用这个方法挂载上去的handler 有一个特点是必须在NGX_HTTP_CONTENT_PHASE 阶段才能被执行。如果你想自己的handler 更早的阶段被执行,那就不要使用这种挂载方式。

 

 

 

typedef struct ngx_chain_s ngx_chain_t;

struct ngx_chain_s {
                ngx_buf_t    *buf;
                ngx_chain_t  *next;
        };

 

struct ngx_buf_s {
        u_char          *pos;       /* 当前buffer真实内容的起始位置 */
        u_char          *last;      /* 当前buffer真实内容的结束位置 */
        off_t            file_pos;  /* 在文件中真实内容的起始位置   */
        off_t            file_last; /* 在文件中真实内容的结束位置   */

u_char          *start;    /* buffer内存的开始分配的位置 */
        u_char          *end;      /* buffer内存的结束分配的位置 */
        ngx_buf_tag_t    tag;      /* buffer属于哪个模块的标志 */
        ngx_file_t      *file;     /* buffer所引用的文件 */

/* 用来引用替换过后的buffer,以便当所有buffer输出以后,
         * 这个影子buffer可以被释放。
         */
        ngx_buf_t       *shadow;

/* the buf's content could be changed */
        unsigned         temporary:1;

/*
         * the buf's content is in a memory cache or in a read only memory
         * and must not be changed
         */
        unsigned         memory:1;

/* the buf's content is mmap()ed and must not be changed */
        unsigned         mmap:1;

unsigned         recycled:1; /* 内存可以被输出并回收 */
        unsigned         in_file:1;  /* buffer的内容在文件中 */
        /* 马上全部输出buffer的内容, gzip模块里面用得比较多 */
        unsigned         flush:1;
        /* 基本上是一段输出链的最后一个buffer带的标志,标示可以输出,
         * 有些零长度的buffer也可以置该标志
         */
        unsigned         sync:1;
        /* 所有请求里面最后一块buffer,包含子请求 */
        unsigned         last_buf:1;
        /* 当前请求输出链的最后一块buffer         */
        unsigned         last_in_chain:1;
        /* shadow链里面的最后buffer,可以释放buffer了 */
        unsigned         last_shadow:1;
        /* 是否是暂存文件 */
        unsigned         temp_file:1;

/* 统计用,表示使用次数 */
        /* STUB */ int   num;
};

 

 

 

 

typedef struct {

    struct iovec  *iovs;

    ngx_uint_t     count;      //当前所使用的iovs的个数

    size_t         size;       //当前存放的总的字节数

    ngx_uint_t     nalloc;     //总的iovs个数

} ngx_iovec_t;

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值