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中实时显示文档(log、txt等)内容
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的步骤:
- 编写模块基本结构。包括模块的定义,模块上下文结构,模块的配置结构等。
- 实现handler的挂载函数。根据模块的需求选择正确的挂载方式。
- 编写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;