深入理解Nginx

陶辉

文学

Nginx 服务器 架构 计算机 编程 网络 网络编程 Programming

2013-4-15

机械工业出版社

目录
前 言 第一部分 Nginx能帮我们做什么 第1章 研究Nginx前的准备工作 / 2 1.1 Nginx是什么 / 2 1.2 为什么选择Nginx / 4 1.3 准备工作 / 7 1.3.1 Linux操作系统 / 7 1.3.2 使用Nginx的必备软件 / 7 1.3.3 磁盘目录 / 8 1.3.4 Linux内核参数的优化 / 9 1.3.5 获取Nginx源码 / 11 1.4 编译安装Nginx / 11 1.5 configure详解 / 11 1.5.1 configure的命令参数 / 12 1.5.2 configure执行流程 / 18 1.5.3 configure生成的文件 / 22 1.6 Nginx的命令行控制 / 24 1.7 小结 / 27 第2章 Nginx的配置 / 28 2.1 运行中的Nginx进程间的关系 / 28 2.2 Nginx配置的通用语法 / 31 2.2.1 块配置项 / 31 2.2.2 配置项的语法格式 / 32 2.2.3 配置项的注释 / 33 2.2.4 配置项的单位 / 33 2.2.5 在配置中使用变量 / 33 2.3 Nginx服务的基本配置 / 34 2.3.1 用于调试进程和定位问题的配置项 / 34 2.3.2 正常运行的配置项 / 36 2.3.3 优化性能的配置项 / 38 2.3.4 事件类配置项 / 39 2.4 用HTTP核心模块配置一个静态Web服务器 / 41 2.4.1 虚拟主机与请求的分发 / 42 2.4.2 文件路径的定义 / 45 2.4.3 内存及磁盘资源的分配 / 48 2.4.4 网络连接的设置 / 50 2.4.5 MIME类型的设置 / 53 2.4.6 对客户端请求的限制 / 54 2.4.7 文件操作的优化 / 55 2.4.8 对客户端请求的特殊处理 / 57 2.4.9 ngx_http_core_module模块提供的变量 / 59 2.5 用HTTP proxy module配置一个反向代理服务器 / 60 2.5.1 负载均衡的基本配置 / 62 2.5.2 反向代理的基本配置 / 64 2.6 小结 / 68 第二部分 如何编写HTTP模块 第3章 开发一个简单的HTTP模块 / 70 3.1 如何调用HTTP模块 / 70 3.2 准备工作 / 72 3.2.1 整型的封装 / 72 3.2.2 ngx_str_t数据结构 / 73 3.2.3 ngx_list_t数据结构 / 73 3.2.4 ngx_table_elt_t数据结构 / 77 3.2.5 ngx_buf_t数据结构 / 77 3.2.6 ngx_chain_t数据结构 / 79 3.3 如何将自己的HTTP模块编译进Nginx / 79 3.3.1 config文件的写法 / 80 3.3.2 利用configure脚本将定制的模块加入到Nginx中 / 80 3.3.3 直接修改Makefile文件 / 84 3.4 HTTP模块的数据结构 / 85 3.5 定义自己的HTTP模块 / 88 3.6 处理用户请求 / 92 3.6.1 处理方法的返回值 / 92 3.6.2 获取URI和参数 / 95 3.6.3 获取HTTP头部 / 98 3.6.4 获取HTTP包体 / 101 3.7 发送响应 / 102 3.7.1 发送HTTP头部 / 102 3.7.2 将内存中的字符串作为包体发送 / 104 3.7.3 经典的“Hello World”示例 / 106 3.8 将磁盘文件作为包体发送 / 107 3.8.1 如何发送磁盘中的文件 / 107 3.8.2 清理文件句柄 / 110 3.8.3 支持用户多线程下载和断点续传 / 111 3.9 用C++语言编写HTTP模块 / 112 3.9.1 编译方式的修改 / 112 3.9.2 程序中的符号转换 / 114 3.10 小结 / 114 第4章 配置、error日志和请求上下文 / 115 4.1 http配置项的使用场景 / 115 4.2 怎样使用http配置 / 117 4.2.1 分配用于保存配置参数的数据结构 / 117 4.2.2 设定配置项的解析方式 / 119 4.2.3 使用14种预设方法解析配置项 / 125 4.2.4 自定义配置项处理方法 / 136 4.2.5 合并配置项 / 137 4.3 HTTP配置模型 / 140 4.3.1 解析HTTP配置的流程 / 141 4.3.2 HTTP配置模型的内存布局 / 144 4.3.3 如何合并配置项 / 147 4.3.4 预设配置项处理方法的工作原理 / 149 4.4 error日志的用法 / 150 4.5 请求的上下文 / 155 4.5.1 上下文与全异步Web服务器的关系 / 155 4.5.2 如何使用HTTP上下文 / 156 4.5.3 HTTP框架如何维护上下文结构 / 157 4.6 小结 / 158 第5章 访问第三方服务 / 159 5.1 upstream的使用方式 / 160 5.1.1 ngx_http_upstream_t结构体 / 163 5.1.2 设置upstream的限制性参数 / 164 5.1.3 设置需要访问的第三方服务器地址 / 165 5.1.4 设置回调方法 / 166 5.1.5 如何启动upstream机制 / 166 5.2 回调方法的执行场景 / 167 5.2.1 create_request回调方法 / 167 5.2.2 reinit_request回调方法 / 169 5.2.3 finalize_request回调方法 / 170 5.2.4 process_header回调方法 / 171 5.2.5 rewrite_redirect回调方法 / 172 5.2.6 input_filter_init与input_filter回调方法 / 172 5.3 使用upstream的示例 / 173 5.3.1 upstream的各种配置参数 / 174 5.3.2 请求上下文 / 175 5.3.3 在create_request方法中构造请求 / 176 5.3.4 在process_header方法中解析包头 / 177 5.3.5 在finalize_request方法中释放资源 / 180 5.3.6 在ngx_http_mytest_handler方法中启动upstream / 181 5.4 subrequest的使用方式 / 183 5.4.1 配置子请求的处理方式 / 183 5.4.2 实现子请求处理完毕时的回调方法 / 184 5.4.3 处理父请求被重新激活后的回调方法 / 185 5.4.4 启动subrequest子请求 / 185 5.5 subrequest执行过程中的主要场景 / 186 5.5.1 如何启动subrequest / 186 5.5.2 如何转发多个子请求的响应包体 / 188 5.5.3 子请求如何激活父请求 / 192 5.6 subrequest使用的例子 / 193 5.6.1 配置文件中子请求的设置 / 194 5.6.2 请求上下文 / 194 5.6.3 子请求结束时的处理方法 / 195 5.6.4 父请求的回调方法 / 196 5.6.5 启动subrequest / 197 5.7 小结 / 198 第6章 开发一个简单的HTTP过滤模块 / 199 6.1 过滤模块的意义 / 199 6.2 过滤模块的调用顺序 / 200 6.2.1 过滤链表是如何构成的 / 200 6.2.2 过滤链表的顺序 / 203 6.2.3 官方默认HTTP过滤模块的功能简介 / 204 6.3 HTTP过滤模块的开发步骤 / 206 6.4 HTTP过滤模块的简单例子 / 207 6.4.1 如何编写config文件 / 208 6.4.2 配置项和上下文 / 208 6.4.3 定义HTTP过滤模块 / 210 6.4.4 初始化HTTP过滤模块 / 211 6.4.5 处理请求中的HTTP头部 / 212 6.4.6 处理请求中的HTTP包体 / 213 6.5 小结 / 214 第7章 Nginx提供的高级数据结构 / 215 7.1 Nginx提供的高级数据结构概述 / 215 7.2 ngx_queue_t双向链表 / 217 7.2.1 为什么设计ngx_queue_t双向链表 / 217 7.2.2 双向链表的使用方法 / 217 7.2.3 使用双向链表排序的例子 / 219 7.2.4 双向链表是如何实现的 / 221 7.3 ngx_array_t动态数组 / 222 7.3.1 为什么设计ngx_array_t动态数组 / 223 7.3.2 动态数组的使用方法 / 223 7.3.3  使用动态数组的例子 / 225 7.3.4 动态数组的扩容方式 / 226 7.4 ngx_list_t单向链表 / 226 7.5 ngx_rbtree_t红黑树 / 227 7.5.1 为什么设计ngx_rbtree_t红黑树 / 227 7.5.2 红黑树的特性 / 228 7.5.3 红黑树的使用方法 / 230 7.5.4 使用红黑树的简单例子 / 233 7.5.5 如何自定义添加成员方法 / 234 7.6 ngx_radix_tree_t基数树 / 236 7.6.1 ngx_radix_tree_t基数树的原理 / 236 7.6.2 基数树的使用方法 / 238 7.6.3 使用基数树的例子 / 239 7.7 支持通配符的散列表 / 240 7.7.1 ngx_hash_t基本散列表 / 240 7.7.2 支持通配符的散列表 / 243 7.7.3 带通配符散列表的使用例子 / 250 7.8 小结 / 254 第三部分 深入Nginx 第8章 Nginx基础架构 / 256 8.1 Web服务器设计中的关键约束 / 256 8.2 Nginx的架构设计 / 259 8.2.1 优秀的模块化设计 / 259 8.2.2 事件驱动架构 / 263 8.2.3 请求的多阶段异步处理 / 264 8.2.4 管理进程、多工作进程设计 / 267 8.2.5 平台无关的代码实现 / 268 8.2.6 内存池的设计 / 268 8.2.7 使用统一管道过滤器模式的HTTP过滤模块 / 268 8.2.8 其他一些用户模块 / 269 8.3 Nginx框架中的核心结构体ngx_cycle_t / 269 8.3.1 ngx_listening_t结构体 / 269 8.3.2 ngx_cycle_t结构体 / 271 8.3.3 ngx_cycle_t支持的方法 / 273 8.4 Nginx启动时框架的处理流程 / 275 8.5 worker进程是如何工作的 / 278 8.6 master进程是如何工作的 / 281 8.7 小结 / 286 第9章 事件模块 / 287 9.1 事件处理框架概述 / 287 9.2 Nginx事件的定义 / 290 9.3 Nginx连接的定义 / 293 9.3.1 被动连接 / 294 9.3.2 主动连接 / 297 9.3.3 ngx_connection_t连接池 / 298 9.4 ngx_events_module核心模块 / 300 9.4.1 如何管理所有事件模块的配置项 / 301 9.4.2 管理事件模块 / 303 9.5 ngx_event_core_module事件模块 / 305 9.6 epoll事件驱动模块 / 310 9.6.1 epoll的原理和用法 / 311 9.6.2 如何使用epoll / 313 9.6.3 ngx_epoll_module模块的实现 / 315 9.7 定时器事件 / 323 9.7.1 缓存时间的管理 / 324 9.7.2 缓存时间的精度 / 326 9.7.3 定时器的实现 / 327 9.8 事件驱动框架的处理流程 / 328 9.8.1 如何建立新连接 / 329 9.8.2 如何解决“惊群”问题 / 330 9.8.3 如何实现负载均衡 / 333 9.8.4 post事件队列 / 334 9.8.5 ngx_process_events_and_timers流程 / 335 9.9 文件的异步I/O / 338 9.9.1 Linux内核提供的文件异步I/O / 339 9.9.2 ngx_epoll_module模块中实现的针对文件的异步I/O / 342 9.10 小结 / 346 第10章 HTTP框架的初始化 / 347 10.1 HTTP框架概述 / 348 10.2 管理HTTP模块的配置项 / 351 10.2.1 管理main级别下的配置项 / 352 10.2.2 管理server级别下的配置项 / 354 10.2.3 管理location级别下的配置项 / 357 10.2.4 不同级别配置项的合并 / 362 10.3 监听端口的管理 / 367 10.4 server的快速检索 / 369 10.5 location的快速检索 / 371 10.6 HTTP请求的11个处理阶段 / 372 10.6.1 HTTP处理阶段的普适规则 / 374 10.6.2 NGX_HTTP_POST_READ_PHASE阶段 / 376 10.6.3 NGX_HTTP_SERVER_REWRITE_PHASE阶段 / 378 10.6.4 NGX_HTTP_FIND_CONFIG_PHASE阶段 / 379 10.6.5 NGX_HTTP_REWRITE_PHASE阶段 / 379 10.6.6 NGX_HTTP_POST_REWRITE_PHASE阶段 / 379 10.6.7 NGX_HTTP_PREACCESS_PHASE阶段 / 379 10.6.8 NGX_HTTP_ACCESS_PHASE阶段 / 380 10.6.9 NGX_HTTP_POST_ACCESS_PHASE阶段 / 380 10.6.10 NGX_HTTP_TRY_FILES_PHASE阶段 / 381 10.6.11 NGX_HTTP_CONTENT_PHASE阶段 / 381 10.6.12 NGX_HTTP_LOG_PHASE阶段 / 382 10.7 HTTP框架的初始化流程 / 383 10.8 小结 / 385 第11章 HTTP框架的执行流程 / 386 11.1 HTTP框架执行流程概述 / 387 11.2 新连接建立时的行为 / 388 11.3 第一次可读事件的处理 / 390 11.4 接收HTTP请求行 / 396 11.5 接收HTTP头部 / 399 11.6 处理HTTP请求 / 403 11.6.1 ngx_http_core_generic_phase / 409 11.6.2 ngx_http_core_rewrite_phase / 411 11.6.3 ngx_http_core_access_phase / 412 11.6.4 ngx_http_core_content_phase / 415 11.7 subrequest与post请求 / 419 11.8 处理HTTP包体 / 421 11.8.1 接收包体 / 422 11.8.2 放弃接收包体 / 429 11.9 发送HTTP响应 / 433 11.9.1 ngx_http_send_header / 434 11.9.2 ngx_http_output_filter / 436 11.9.3 ngx_http_writer / 440 11.10 结束HTTP请求 / 442 11.10.1 ngx_http_close_connection / 443 11.10.2 ngx_http_free_request / 444 11.10.3 ngx_http_close_request / 446 11.10.4 ngx_http_finalize_connection / 447 11.10.5 ngx_http_terminate_request / 447 11.10.6 ngx_http_finalize_request / 448 11.11 小结 / 452 第12章 upstream机制的设计与实现 / 453 12.1 upstream机制概述 / 453 12.1.1 设计目的 / 454 12.1.2 ngx_http_upstream_t数据结构的意义 / 456 12.1.3 ngx_http_upstream_conf_t配置结构体 / 459 12.2 启动upstream / 462 12.3 与上游服务器建立连接 / 464 12.4 发送请求到上游服务器 / 467 12.5 接收上游服务器的响应头部 / 470 12.5.1 应用层协议的两段划分方式 / 470 12.5.2 处理包体的3种方式 / 471 12.5.3 接收响应头部的流程 / 473 12.6 不转发响应时的处理流程 / 476 12.6.1 input_filter方法的设计 / 477 12.6.2 默认的input_filter方法 / 478 12.6.3 接收包体的流程 / 479 12.7 以下游网速优先来转发响应 / 481 12.7.1 转发响应的包头 / 482 12.7.2 转发响应的包体 / 484 12.8 以上游网速优先来转发响应 / 489 12.8.1 ngx_event_pipe_t结构体的意义 / 489 12.8.2 转发响应的包头 / 493 12.8.3 转发响应的包体 / 495 12.8.4 ngx_event_pipe_read_upstream方法 / 498 12.8.5 ngx_event_pipe_write_to_downstream方法 / 502 12.9 结束upstream请求 / 504 12.10 小结 / 508 第13章 邮件代理模块 / 509 13.1 邮件代理服务器的功能 / 509 13.2 邮件模块的处理框架 / 512 13.2.1 一个请求的8个独立处理阶段 / 512 13.2.2 邮件类模块的定义 / 514 13.2.3 邮件框架的初始化 / 516 13.3 初始化请求 / 517 13.3.1 描述邮件请求的ngx_mail_session_t结构体 / 517 13.3.2 初始化邮件请求的流程 / 519 13.4 接收并解析客户端请求 / 520 13.5 邮件认证 / 520 13.5.1 ngx_mail_auth_http_ctx_t结构体 / 520 13.5.2 与认证服务器建立连接 / 522 13.5.3 发送请求到认证服务器 / 522 13.5.4 接收并解析响应 / 525 13.6 与上游邮件服务器间的认证交互 / 526 13.6.1 ngx_mail_proxy_ctx_t结构体 / 526 13.6.2 向上游邮件服务器发起连接 / 527 13.6.3 与邮件服务器认证交互的过程 / 528 13.7 透传上游邮件服务器与客户端间的流 / 530 13.8 小结 / 535 第14章 进程间的通信机制 / 536 14.1 概述 / 536 14.2 共享内存 / 536 14.3 原子操作 / 541 14.3.1 不支持原子库下的原子操作 / 541 14.3.2 x86架构下的原子操作 / 542 14.3.3 自旋锁 / 545 14.4 Nginx频道 / 546 14.5 信号 / 549 14.6 信号量 / 551 14.7 文件锁 / 553 14.8 互斥锁 / 556 14.8.1 文件锁实现的ngx_shmtx_t锁 / 558 14.8.2 原子变量实现的ngx_shmtx_t锁 / 560 14.9 小结 / 565
【展开】
内容简介
本书是阿里巴巴资深Nginx技术专家呕心沥血之作,是作者多年的经验结晶,也是目前市场上唯一一本通过还原Nginx设计思想,剖析Nginx架构来帮助读者快速高效开发HTTP模块的图书。 本书首先通过介绍官方Nginx的基本用法和配置规则,帮助读者了解一般Nginx模块的用法,然后重点介绍如何开发HTTP模块(含HTTP过滤模块)来得到定制的Nginx,其中包括开发一个功能复杂的模块所需要了解的各种知识,如Nginx的基础数据结构、配置项的解析、记录日志的工具以及upstream、subrequest的使用方法等。在此基础上,综合Nginx框架代码分析Nginx的架构,介绍其设计理念和技巧,进一步帮助读者自由、有效地开发出功能丰富、性能一流的Nginx模块。
【展开】
下载说明

1、追日是作者栎年创作的原创作品,下载链接均为网友上传的的网盘链接!

2、相识电子书提供优质免费的txt、pdf等下载链接,所有电子书均为完整版!

下载链接
热门评论
  • 前端_兰悦儿格格的评论
    终于明白公司为啥要用nginx当web服务器了,看来它性能非常不错,处理高并发也比较合适。//#多看笔记# “当我试图在产品的关键位置设计一个高性能Web服务器时,我选择使用成熟的Nginx。选择它的理由…” 摘自《深入理解Nginx:模块开发与架构解析》 @多看阅读 网页链接
  • 阿里基础架构事业群的评论
    【高级系统工程师-云计算】负责阿里云计算平台及产品的架构演进、容量规划、运维保障、业务监控等,为阿里云的用户体验负责。需要你深入理解Linux系统,熟悉lvs/nginx等软件以及TCP/IP/HTTP等网络协议,职位详情 网页链接,发送简历至songyuan.sy@alibaba-inc.com
  • 陈五十的评论
    于Nginx使用基于事件驱动的架构能 网页链接《深入理解Nginx》分享自@淘宝阅读
  • 张梦涵_handy的评论
    网页版、android版、IOS版同一本书价格不同,比如《深入理解nginx》IOS版卖30,网页版只卖9.99,@多看阅读 多看君怎么看
  • 失败的锅包肉的评论
    大话数据结构 Linux内核设计与实现 Linux内核修炼之道 程序员的自我修养 Linux高性能服务器编程 深入理解nginx 好看又有用的程序员书籍推荐 网上课程推荐慕课网学html js css python等 非常合适 极客学院学ios android cocos2sx非常不错 ps可以学一点lua什么的 有用
  • C侦探的评论
    #精品阅读时光# 我正在使用多看阅读Kindle版看《深入理解Nginx:模块开发与架构解析》,Kindle上的精品阅读时光,与我的朋友齐分享。@多看
  • 蛙蛙王子的评论
    再也不想看《sicp》,《深入理解计算机系统》,《敏捷软件开发》,《数据结构与算法分析》,《tcpip协议详解》,《k&r》,《程序员修炼之道》这些基础的书了,我想看angularjs,puppet,nginx这些书,我是不是浮躁了
  • Chinainvent的评论
    最近因为研究SystemTap与Nginx,而SystemTap又非常依赖于DWARF的调试信息,所以把DWARF研究了一遍,如果你跟我一样,对RPM的debuginfo感到疑惑,可以看看这篇文章《深入理解debuginfo》:网页链接
  • 彩蛋爸的评论
    我刚刚将 @哈哈__呜呜 分享的"深入理解Nginx模块开发与架构解析.pdf"保存到了 @微盘,推荐给大家! 深入理解Nginx模...
  • 红尘烈焰的评论
    屌爆了!我在京东JD.COM购买了深入理解Nginx:模块开发与架构解析,★★★★★:对于我而言这本书真的是有点难度啊,不过慢慢啃呢#京东让红包飞#超赞的! 网页链接