|
Java电子书:深入理解Nginx:模块开发与架构解析 格式 pdf 电子书 PDF 电子书 Java吧 java8.com8 W' [1 V/ G9 O" _5 I7 F
6 o* J [6 f" X1 P4 l$ r$ {
7 B: E- V/ `# m6 a! T- H6 h编号:mudaima-P0137【Java吧 java8.com】/ R7 h& M' F |4 d0 \0 [7 Z
/ a/ l3 z6 k8 N9 \' b$ e
- J2 S- X. n4 C1 O4 h* f$ u0 f/ B& ~% p$ R r# ~, j0 E
Java电子书目录:部分 Nginx能帮我们做什么- x! c4 ^9 B# }1 u% q
3 \: ?5 }$ r, n; Q" @4 U
第1章 研究Nginx前的准备工作 2; q0 b6 a# r/ B7 g7 B" T$ I2 U3 h/ t
2 I2 w. r! q# c1 B. Q1.1 Nginx是什么 2. f% t$ f# d6 j; J3 C: B4 I, ?
) _. c4 o$ `. p- Z, e) R3 i! M
1.2 为什么选择Nginx 5
{. R4 ] u) o+ P) u2 w. x
/ a1 p4 |3 v' s1.3 准备工作 7
* W/ C8 X3 y, {) e' A2 @ o% C
# B/ |9 D A; z6 o: @+ p1.3.1 Linux操作系统 7
8 U+ W. q+ y. |0 ?3 G4 u" I! E! N9 V
1.3.2 使用Nginx的软件 7$ t. c# D& `4 }, L
3 V: f0 U. d* L$ U3 d1 k8 Y: `6 I1.3.3 磁盘目录 8
* R0 E0 p: d X6 a. M1 \' f2 S0 H! R1 L7 l7 i
1.3.4 Linux内核参数的优化 9
B+ r& o& _. j& s; x1 b% {/ t8 O! |7 E' ?1 E$ w6 j) B
1.3.5 获取Nginx源码 10
- M' @1 C# G2 F- x- o
/ s, D7 v2 U% L0 g& y1.4 编译安装Nginx 11
/ `) E9 h" ?/ Z; U( ?0 B [- }3 y+ |+ t
1.5 conf?igure详解 11
. F- I5 \) i$ _7 q5 L5 n+ q$ G X) w5 G$ Z1 N& |) B' L8 \ H
1.5.1 conf?igure的命令参数 11
- |# I: y: ~2 q5 p. P4 U
9 K7 V0 x9 l8 V* M C1.5.2 conf?igure执行流程 18, u! d' _# a* ?7 s8 `3 D
/ R4 @" ~) y0 i0 I0 z9 E0 H
1.5.3 conf?igure生成的文件 21
0 M& x- x. @1 h' G
9 M( {$ T, Z7 }/ G0 q1.6 Nginx的命令行控制 23: l. y# G$ |5 O8 R& c2 |
9 C' w% P. Y0 d: l" o5 T+ _
1.7 小结 27
1 `# ]/ B" C; z; ^% y4 ?0 P
8 P7 P" t* w( `% a6 N5 h" _第2章 Nginx的配置 28
7 @" o5 A! }/ ?9 L5 u( O
7 M' @; q9 a- N p1 \* i9 _2.1 运行中的Nginx进程间的关系 28
" d7 p& C4 H6 ?; y. W0 X& e0 ^2 n( g
2.2 Nginx配置的通用语法 31
% a$ b. {6 p7 Z y6 Q
; W7 m$ u1 m) \! D7 R2 c: m8 x8 e1 z8 v2.2.1 块配置项 319 n( }' a! V& v( u5 q% }
2 J1 [$ ]0 r( b! @. @ H
2.2.2 配置项的语法格式 324 ]8 y" p% M& {. T; G. o5 ]! q0 p
4 A5 Q. X. E2 m: c+ |
2.2.3 配置项的注释 33/ [ w5 t9 J6 E" C$ p) L' y
$ m0 T0 r% l0 ^' n9 B
2.2.4 配置项的单位 33
+ A% L e* Y* v: }# Q. n. C$ w/ y
9 h4 @& v& M2 S; [. G' U2.2.5 在配置中使用变量 33
( n" c! q1 U) o4 T6 U/ l2 I4 Z$ N
2.3 Nginx服务的基本配置 34
9 t' F$ y- V- n8 u3 i& e
* V4 c& ~2 {6 l. X; X2.3.1 用于调试进程和定位问题的配置项 34
7 Z1 d+ g. H3 \9 {, n% y! _2 J+ ~. y9 G" l6 r8 p
2.3.2 正常运行的配置项 364 B) Y- g/ E" X7 l( b
+ g9 p8 M. @- y5 O# t0 u9 g0 R
2.3.3 优化性能的配置项 37
. V6 s# A8 J8 A, l; b3 n
9 e _* H2 c- c2.3.4 事件类配置项 39
' K3 R* [& ?1 E, U! j" e
2 _; d% G* V" A& I& T# I) @2.4 用HTTP核心模块配置一个静态Web服务器 40
. P: a2 u+ P% P! W+ u
% H# c9 W* R% r7 F" h, K; I2.4.1 虚拟主机与请求的分发 41% U. t2 M+ _6 c$ d4 u6 l
) I5 @* G" T- G* x9 o
2.4.2 文件路径的定义 45
4 }- m8 T( E2 U9 C
' q% c) ^* p P1 P8 z+ w( Z2.4.3 内存及磁盘资源的分配 47& W, L6 L* ^: c, h% K U% c, A! R
1 Q. ~; e3 Q4 u, L9 ?2 |2.4.4 网络连接的设置 496 \( y3 q- n' \1 Q7 R3 v: a
; y z. \( _; r" r* S
2.4.5 MIME类型的设置 52. @3 t6 j7 @$ b; J2 l
; |8 R' f7 C, n" Y, [: A2.4.6 对客户端请求的限制 539 _- m |( A% R9 ], y2 s* l$ q: |
- r6 g+ r' F6 S
2.4.7 文件操作的优化 54
% [6 @3 C2 V6 i! q2 l1 a
! C2 t( ?9 {( I, O2.4.8 对客户端请求的特殊处理 566 y) Y5 D1 @% { @6 w; u5 H: B
( V, N2 B* V% N. x, G* J* I
2.4.9 ngx_http_core_module模块提供的变量 57
Q4 s: |( F9 W, B
4 d4 r4 A; m& B2.5 用HTTP proxy module配置一个反向代理服务器 593 w- J# J# Z5 I- Q. n" [. I
; [( `& e; J% |7 {' W2.5.1 负载均衡的基本配置 61 u: J1 o, ]& B7 v' e! i8 K
. E0 Q. R8 i. Q2.5.2 反向代理的基本配置 63( a& N% {! Z7 ^( ~) z p
2 G; V, m7 S5 o( M+ r; v$ f7 v
2.6 小结 66
# x1 y4 e5 W' B2 K, S B# H& w* B: i1 k% z i
第二部分 如何编写HTTP模块
# W4 K3 G! G% u0 \, a/ k% q+ F! x0 H# v& ]0 ~
第3章 开发一个简单的HTTP模块 68
9 U0 G+ b3 s3 I4 ?7 q! x9 @1 t" b2 n: `( m0 b& Y
3.1 如何调用HTTP模块 68 M& a* x( H7 N9 [5 c
- T% ?) b+ U8 M) f8 r; V/ `
3.2 准备工作 70
: q* W) }+ H4 T2 G: {
- F/ x& F+ W0 u. O7 Q% l3.2.1 整型的封装 71
. d" T% {6 _2 V9 D3 j) k T* }5 z
7 K% i2 t0 ~9 l! b" N$ k3.2.2 ngx_str_t数据结构 71
& `& {8 e4 d0 r# H: D) B0 k
6 r" ~: `+ f' W$ F, ?( m3.2.3 ngx_list_t数据结构 71+ E. R5 j& v6 m" D4 L
' p4 _2 g! {% e3 O- H$ M
3.2.4 ngx_table_elt_t数据结构 75: r( c7 w* x( @# W# c7 y2 M
" u1 Q9 I/ k4 W8 k1 ]( K
3.2.5 ngx_buf_t数据结构 75" l0 o1 C4 Z2 d i- E( D4 Q8 A- `
) V$ Y! A5 T; g2 M9 s: E D1 h6 G
3.2.6 ngx_chain_t数据结构 77& z7 _2 h8 s$ ]$ F5 ~ F/ t
6 Q1 p) B+ ^1 S6 S0 X# y3.3 如何将自己的HTTP模块编译进Nginx 77
2 n0 r/ J9 W0 B9 F& o
5 p+ [9 B% K1 K( I5 l8 t6 W. r3.3.1 conf?ig文件的写法 77/ m5 T% J4 n5 y) t2 J0 S! Y7 P
9 d$ f" [$ B* q8 ~; D/ v
3.3.2 利用conf?igure脚本将定制的模块加入到Nginx中 782 Y- j2 U* q) b" @- ]' v2 y
+ A+ Z9 Z2 S7 O8 O0 z4 q' N6 O8 P
3.3.3 直接修改Makef?ile文件 81
; b$ b/ g1 l0 [, T U+ d
& J9 a/ p& D: Z* h: g3.4 HTTP模块的数据结构 824 ]7 v, \# n1 G- `* g' C/ z
$ s+ \8 F/ l& \* P3.5 定义自己的HTTP模块 86
o B' n& l) Q1 Q
/ Q/ n$ x0 A8 V. i ~4 t( l$ I2 h5 H- @3.6 处理用户请求 89
( U- B! q5 a6 C) Q6 r' K- { g" X1 L& L9 ~9 `8 T
3.6.1 处理方法的返回值 89% i4 c9 L* b: o# z) `; ]2 f- B
* n) E% [! `$ a, e- i9 R3.6.2 获取URI和参数 929 L5 \- Y9 [2 l) R
$ }! S. F0 T0 [) ?. z
3.6.3 获取HTTP头部 94. G; O/ }; H, ?) p
5 B( |% r( g `4 w6 P* E# K9 ^: ~3.6.4 获取HTTP包体 979 d! P$ m6 R V" w0 V
. B+ c: ~$ r; ^) \; u+ t3.7 发送响应 99 }( r1 d( u- V4 s$ ]5 j V
5 q2 E3 {5 G2 I5 [: M' ?+ Z
3.7.1 发送HTTP头部 99# t2 M5 a- U1 n& Q0 R3 y- N
2 L7 o. h; {1 U3 L( [2 y
3.7.2 将内存中的字符串作为包体发送 101
9 i c" ?1 M, S7 Z C# h, a1 g
/ G- I; J. S" B3 J$ E3.7.3 经典的“Hello World”示例 102/ e$ H4 ?$ C7 w3 R: d+ a
* B0 R4 B9 c0 f( b, e
3.8 将磁盘文件作为包体发送 103
5 b: J2 I; K9 }0 t
- q0 t C6 o% L. p3.8.1 如何发送磁盘中的文件 104+ `+ }1 G9 m+ \5 b- F3 E
. w( @% N4 i }4 X+ }9 U2 w
3.8.2 清理文件句柄 106 e ~; Y+ K* I9 |( d: {7 o4 [
2 p+ p9 }7 @8 \" V, W' Z3.8.3 支持用户多线程下载和断点续传 107( n# e- k. j8 H% Z. Q1 P
( U* s2 u. }$ A3.9 用C 语言编写HTTP模块 108
. }( m! {# `* }4 Q9 T( A/ \" c: Z& G0 o7 e6 h1 H6 `, T
3.9.1 编译方式的修改 108
9 o! j+ p" r$ s( O7 C6 I% E: i) J$ F! M6 L
3.9.2 程序中的符号转换 109
) N7 \$ j4 {+ _ \/ V0 C, B1 d! w, E8 G9 A5 v/ g; r
3.10 小结 110
, Q& t# J. y6 C6 V5 V
$ C; O8 o C! y$ _3 ]第4章 配置、error日志和请求上下文 111
! _- L$ l% {* M) V, V! U7 J" V8 K) x4 o/ F, H- A( Y7 a4 P
4.1 http配置项的使用场景 111
# n) F. U% e* I8 W. O2 |7 d1 F* ?" Z4 P9 u
4.2 怎样使用http配置 113" {+ b5 C. {: o7 p3 l
1 X0 E* x5 J0 D, k7 p1 k$ _9 u4.2.1 分配用于保存配置参数的数据结构 1131 ~% b- g4 f" _$ G' o; }7 g* U
, M1 e( T7 h* q% b# P! B' Z4.2.2 设定配置项的解析方式 115
" c9 H$ ^( ^2 {) [ I; d# r! @' `$ S, ^
4.2.3 使用14种预设方法解析配置项 121; h& P; x/ y: u
- S3 j3 V/ X7 D) i% b
4.2.4 自定义配置项处理方法 131- R* u# [! Z+ f: n: Z- W0 p+ f* R
- l: V% A+ \' J( _3 d K( f' G [3 @4.2.5 合并配置项 133
0 y$ Z2 \+ Y- J! t9 w
8 k% N2 P6 t7 ~" t, A4.3 HTTP配置模型 135+ u- l( B$ c9 D) i: l! }
/ O" t) R2 e; k. Z+ g2 n$ Z
4.3.1 解析HTTP配置的流程 136
$ F* \7 E2 _# z2 O7 x) G- G( P9 U; X* m6 b8 k4 ? G' O" s
4.3.2 HTTP配置模型的内存布局 139* @8 q h* a# E! |: b8 d
4 l1 s. L8 B/ H5 H4.3.3 如何合并配置项 142
( M9 \7 S" w9 O
; T/ S; \# U9 a# q8 x/ u2 y4.3.4 预设配置项处理方法的工作原理 144
: s' i" ^3 R' |3 }1 P/ E1 c; H
. } N; J& K/ r' Z, a5 \$ L/ u4.4 error日志的用法 145; T+ u6 ^ I, }% X9 x3 n5 t1 e
6 ~1 z3 E ` O I" _# Q5 N5 F. ~3 w* Z
4.5 请求的上下文 149% V+ k5 h3 F, m7 ]5 R; ?
/ @$ u% ?" u8 T# Q4.5.1 上下文与全异步Web服务器的关系 149; Z) j6 D4 D. T0 z, X' P/ u9 Z+ W. g
! l7 I d, e( `7 `: a+ Q- \+ \3 z
4.5.2 如何使用HTTP上下文 151
6 S' I) W8 a7 ?% _
+ T' E; _+ p) `. i d4.5.3 HTTP框架如何维护上下文结构 152
7 g- M ?# F2 b/ C; o3 s" h# T' I& g+ z1 R8 t4 e/ `$ A
4.6 小结 153
3 [8 L6 { \ D* _; j" u
! A' i1 E3 c1 s第5章 访问第三方服务 154) r8 O/ S5 w! R) [# Y- ?$ e8 P( b+ e
i9 A }9 _6 C
5.1 upstream的使用方式 155+ |2 V" w7 _% A/ v3 F9 w( H
3 e7 j$ _6 s* I$ A) H& b
5.1.1 ngx_http_upstream_t结构体 158
% _% r+ O% ]0 Q' [7 ~5 e$ U
. V3 B: M4 K' D" J. V$ }5.1.2 设置upstream的限制性参数 159 o. H& M0 d6 e/ O9 l4 ]5 B
& j- w9 _5 i2 J8 j k c5.1.3 设置需要访问的第三方服务器地址 160* U" _! N* W# q) g8 W. G2 ]& Z
6 O, Z% G* ?8 f4 g5.1.4 设置回调方法 161$ M B ]9 K" g1 E
3 J3 d y; D/ y5.1.5 如何启动upstream机制 161
9 v& K, T, J) i& l, g
* s9 W. X, ?) P5.2 回调方法的执行场景 162/ N8 ^. }+ p1 J- X
1 [/ Q9 Q, B r- E
5.2.1 create_request回调方法 162
8 R7 q# S( i6 r! L. Q9 K
! O7 F* s4 x3 \4 w9 f: f5.2.2 reinit_request回调方法 164
8 V9 w- y# B1 A! E) ?
4 F9 }) @4 |& P$ S& z" R% h7 I% x5.2.3 f?inalize_request回调方法 165; c9 O t0 { A' T0 u
( |5 ?0 j2 X$ c! b
5.2.4 process_header回调方法 165; s4 Y( r, N" U
* _' c0 V9 c8 c, G# L5.2.5 rewrite_redirect回调方法 167" P9 H" P F6 U
+ H7 B. A& e7 o; f- H0 Y5.2.6 input_f?ilter_init与input_f?ilter回调方法 167: h2 W9 L8 N$ c3 L& l8 E
5 f( [, A3 r% p
5.3 使用upstream的示例 168# \; ^/ _1 t" U
! p$ \( |: B% c z9 L$ s5.3.1 upstream的各种配置参数 168. L% U" R7 w$ E* @( P( r( _0 r
% M: ?/ J8 g, ~" o5 x
5.3.2 请求上下文 170, G8 l/ `' J& g2 @* D) E
/ Y4 a# [# G u
5.3.3 在create_request方法中构造请求 170: t$ I( z$ v3 U. P" E3 l5 Z
+ F* A: {( r+ Q8 r5 q7 w5.3.4 在process_header方法中解析包头 171! J: [; o0 a4 u
9 y1 v) w) h! p% G7 z) A8 @2 M5.3.5 在f?inalize_request方法中释放资源 175, N1 M4 {+ a f
1 [ m3 Z0 t1 b& @0 M
5.3.6 在ngx_http_mytest_handler方法中启动upstream 175% V* \5 w$ U( B8 j9 |, V3 W
# r6 u7 c% {' y8 ]
5.4 subrequest的使用方式 177
9 i& M/ A! g0 }0 b5 M1 [) F* _9 I7 L d6 P
5.4.1 配置子请求的处理方式 177: P% J0 r( z9 T- U, z( J
- I' t3 l) b" b& X' _( r5 R3 Y% ?5.4.2 实现子请求处理完毕时的回调方法 1780 r- g5 }! h* j! o, _1 ~
; ?) v% M6 G/ d+ \
5.4.3 处理父请求被重新激活后的回调方法 179
5 ?; R$ K' g& J7 @4 Y1 l4 [2 E$ l1 c$ S) @ t w; g: M; ?
5.4.4 启动subrequest子请求 179
* p2 F0 ^, a$ A3 P% a6 X
' S0 _1 x( \6 ]# P- g5.5 subrequest执行过程中的主要场景 1809 F" D8 J& T! y5 d; ~5 Z# d
& N2 }$ f# |' e" X
5.5.1 如何启动subrequest 180$ H s2 v$ ]$ o$ S1 I
$ E* p, D4 v* m
5.5.2 如何转发多个子请求的响应包体 182
% u8 [3 D% b9 D% S3 X, W# [$ A- a* a
5.5.3 子请求如何激活父请求 1853 `8 o2 Z% v3 b1 m G) X9 Z& M8 J
* c+ I5 {$ J1 }) V3 r! a5 U
5.6 subrequest使用的例子 187
& ~9 I9 Q3 ~4 L0 Z) u. z4 a. |& |2 |5 I+ G% t* `
5.6.1 配置文件中子请求的设置 187
% A; P. P, w j9 t9 {# I( W( R, P! h9 i& m& }' a/ P
5.6.2 请求上下文 188- D4 a3 I) x, m) o& W
2 a( D1 u: z) x' u0 D3 K- Y1 {* ]
5.6.3 子请求结束时的处理方法 188' C% {( a6 v% J8 B2 N. c
- b" m; ^# W3 {. K5.6.4 父请求的回调方法 189
* |: d) a- ?( T* w: c& _* e8 k( D3 r0 \! P/ A0 x- E
5.6.5 启动subrequest 190
* @( q1 X4 ^& y0 b, s) R4 R& a( s2 K [& p( Z
5.7 小结 191
7 o5 s! z, |1 G3 z
3 @( h- ~ T$ n( ^第6章 开发一个简单的HTTP过滤模块 1926 L, B8 B o( w" Y8 Q+ s1 E% w
; x9 K% m1 D& ?
6.1 过滤模块的意义 1928 X L: s2 \2 A6 V$ y9 F% c
4 F' S, w8 s( S1 a; a. `; c, |6.2 过滤模块的调用顺序 193
# r2 V0 p! K$ a; R( P: Q; u" _# S5 F8 M& Z K$ k# w" _! B) ?; N
6.2.1 过滤链表是如何构成的 194
& b1 H% z/ h; I$ K! R
! F" w; W' e! q" @0 `$ x6.2.2 过滤链表的顺序 196
1 `2 o: s( d4 F1 J& T6 _1 \4 _; [! {, i
6.2.3 官方默认HTTP过滤模块的功能简介 197- s- Q9 m1 u( G: S7 Y' P9 X( Z8 s8 z
: l, n* J9 L8 l( n& v' U3 ?4 ^6.3 HTTP过滤模块的开发步骤 1986 A, O/ e5 u) ` N% c! j& p
0 ?7 i+ e9 w8 n: a# O5 o) C6.4 HTTP过滤模块的简单例子 200, E. W6 M: Z I, T
$ ?& Q- l7 B" w$ E R: H6.4.1 如何编写conf?ig文件 201
' n# L- D/ w' v9 z+ V& j4 I' p& j9 g, x, b7 [( \# u6 X
6.4.2 配置项和上下文 201
# l7 f% \" y" H& D( V0 z
9 N" Y/ c0 g( t/ L6.4.3 定义HTTP过滤模块 203
5 Z+ k" ?0 w: R7 Y0 c4 t; ]* x- I0 v( O( \4 l8 g
6.4.4 初始化HTTP过滤模块 204
0 |/ s- U$ v9 B: H1 ^ o
9 Q* c1 h8 `! h( z& N! M X6.4.5 处理请求中的HTTP头部 204
/ ^ k* C& O; W# m( D5 G! ?0 m" I# h- t! E; O/ z7 w
6.4.6 处理请求中的HTTP包体 206
0 ] H; o, J0 m+ v+ G/ a3 o, g4 @$ L; J
6.5 小结 206 i" B/ ]# L1 ?8 X1 e
5 S- B$ t6 S- N6 Y% o# R
第7章 Nginx提供的高级数据结构 207
5 @9 ~" V: g5 c& ^% o: ~, ]% |7 L0 T. e+ s7 N5 q9 J' D
7.1 Nginx提供的高级数据结构概述 2071 p" n' a- Q. U6 |1 }8 M7 L
" l7 w7 a& X3 j" W
7.2 ngx_queue_t双向链表 209" X& d. l* J9 c/ ?
+ A# W7 V; X/ J% c7.2.1 为什么设计ngx_queue_t双向链表 2096 F& c# b; U, e, {
6 g6 p$ [) f1 M9 c
7.2.2 双向链表的使用方法 209) T+ V6 x. i" J9 R9 W7 h; L0 [* c$ _
* m, K$ ~9 g. W8 d$ R7.2.3 使用双向链表排序的例子 212
& u, M8 \6 R6 Q1 K+ K' w2 w2 o7 n% I6 B
7.2.4 双向链表是如何实现的 213
9 O$ e- Z* a& v K7 x+ M5 Y0 \2 R X8 m
7.3 ngx_array_t动态数组 215; U: L5 e0 p0 k6 N8 l3 R) j
4 H5 Z2 R* w4 r& d; Y$ ~
7.3.1 为什么设计ngx_array_t动态数组 215$ z. j. J/ u' k* r0 R
( }2 `$ {1 L8 J# O
7.3.2 动态数组的使用方法 215
( \7 s) y- l7 S8 D
2 N( b# W# M+ m# ~* `7.3.3 使用动态数组的例子 217
. d$ N5 k: J( t; f
0 v/ P$ y8 R! E/ k7 y+ L3 E m7.3.4 动态数组的扩容方式 2182 @+ s; u0 P; A/ y1 s# W1 h
! R9 L7 [. c; C, S" R
7.4 ngx_list_t单向链表 219
7 T. x) d6 V" [5 v5 P1 C8 R) T0 E
9 {5 {3 b6 A; K! a! _7.5 ngx_rbtree_t红黑树 219
4 q: A# [/ s1 Y) E* |+ f: \ M+ G5 p& @ Y- Q: P
7.5.1 为什么设计ngx_rbtree_t红黑树 219
: ?: I- T2 I$ p( C. q! L8 F4 m# u: M4 n F3 M% A' S
7.5.2 红黑树的特性 220; O# C) L0 h4 L, e' G
/ ?" L8 i" k5 k, f$ Z* k, U- k- V8 i
7.5.3 红黑树的使用方法 222
' A8 h1 q$ p! @# P/ w9 i- O, X( h/ o |
7.5.4 使用红黑树的简单例子 225
7 V( F, U v! g1 p% F0 J$ |: S) F% t
, b! U' g+ v v2 n3 Y" N7.5.5 如何自定义添加成员方法 226
2 h" H3 V8 Z9 o+ r! {+ {. U5 ]) j
7 C5 _* [9 r0 g+ N) k7.6 ngx_radix_tree_t基数树 2287 G$ }- c# w- x, E0 G* F! w
& b" ?5 L, A3 H) J! _
7.6.1 ngx_radix_tree_t基数树的原理 228
1 ?( X2 v, L% s) T1 W$ k6 l5 j% O8 E' y2 I: T! y3 G) [
7.6.2 基数树的使用方法 2302 K7 ~0 P# q6 @2 B" D% L
$ ~ \3 e& D: b$ _: n1 {
7.6.3 使用基数树的例子 231
3 T4 W4 |. Y8 u) f3 W3 b' m2 m: L# ]8 D& K
7.7 支持通配符的散列表 232
. \- }* Y: q, d5 }9 ]
/ _ ?4 K0 `; d3 K# T* v7.7.1 ngx_hash_t基本散列表 232
. K7 y* M$ A, V0 M/ }; M9 _7 _: W7 b j0 |$ S* P
7.7.2 支持通配符的散列表 2359 n5 t& j; M4 c5 n& [% b3 |
% m/ y3 X. m5 O+ D! G
7.7.3 带通配符散列表的使用例子 241
- L b9 k" b& j: Y9 Y" _
8 c9 ^8 v1 ~. J# }+ t0 c. I1 c% _7.8 小结 2456 ^# p. ^0 y- q6 J) i/ @
4 m" O. {; W9 G: n, v7 D
第三部分 深入Nginx
m) y2 \% m6 s% J! i
5 v+ S1 \5 @$ y, {' N4 N6 A7 q第8章 Nginx基础架构 248; p5 R. h7 J* w- W: m0 ~
8 ^6 c) y* z: ^9 A% c G8.1 Web服务器设计中的关键约束 2499 Y% M: ]2 |7 T& b
& r6 C! g; V E% d; c
8.2 Nginx的架构设计 251
( c' A( R9 x! f1 H
) C' Y% [7 Q$ R- ^3 s8.2.1 优秀的模块化设计 251
% A' g2 H$ B0 q4 k
9 K3 z, d1 [. M3 q# h Z P# G: R8.2.2 事件驱动架构 254- T+ [- c2 D7 u' Z9 U- \( S+ h0 g
& V% t4 [ W! j3 ~) T( E0 g8.2.3 请求的多阶段异步处理 2560 t" }: @ H7 X3 [3 T8 q. ~) K
) j1 N# L0 m* `4 H3 [4 a
8.2.4 管理进程、多工作进程设计 259
' O# e6 W; ^9 E2 D% t5 C
; b( S/ Y# o0 j# E1 `2 z: O8.2.5 平台无关的代码实现 259: s6 a9 s* _* p" Z
' X% Q5 K" z$ d1 `- P: J7 x+ S- B8.2.6 内存池的设计 259( n! P' |( _: u: Z
( H; F/ J0 }+ t! t e# R
8.2.7 使用统一管道过滤器模式的HTTP过滤模块 260
# ^5 J7 A3 d" t7 K0 y- ?* E# U. y) x q5 N( g8 L
8.2.8 其他一些用户模块 260
# l, \3 M" U2 \ w G) j" |8 o2 V
8.3 Nginx框架中的核心结构体ngx_cycle_t 260
+ O0 {7 J$ t# v2 t7 Z, ^- ^( x5 s1 R0 x
8.3.1 ngx_listening_t结构体 261
' v: M: o" X; c) @2 O6 R9 |4 o9 J& V: A8 D
8.3.2 ngx_cycle_t结构体 262
) {1 C2 }$ J/ P3 l! [9 l8 B+ _/ n2 M2 \& R7 I
8.3.3 ngx_cycle_t支持的方法 264
7 V- e; ~5 n2 @! S& P
: i$ O B3 [8 ^0 O' j, }8.4 Nginx启动时框架的处理流程 266- t) W9 k6 i. \0 q8 x8 h; P, u9 R
. ?& e: \, @* e9 L6 |8.5 worker进程是如何工作的 269
- u3 Z0 o- D9 X. r' l ?$ A$ }% r! N; x6 v! a4 G
8.6 master进程是如何工作的 271( n3 K1 O, F4 z5 `2 N
0 d- X, Y) P8 D9 @% Y8.7 ngx_pool_t内存池 276
2 o9 j: @ [$ G5 F- U1 h* e- l, e C
8.8 小结 284
2 G* a6 l+ a8 K- |. v/ g! I. i
6 h( i% G/ F: J第9章 事件模块 285
; r1 ^- I: a" p' C: v4 ^1 o- e9 o: Y" _! z8 z
9.1 事件处理框架概述 286
$ K! x; R- ]0 U1 g3 Q7 ?# W
$ e/ ?- t0 M3 ]- f+ o/ m9.2 Nginx事件的定义 288% }# G D: o4 k* ~! {8 Y
$ d/ A; b$ Q. G3 y) z
9.3 Nginx连接的定义 291
. Y7 H* X4 g) M5 d' {- I- v6 g0 R+ S0 u4 c& Z# N
9.3.1 被动连接 292
9 L& m0 M6 H. ~; I3 N& E2 R' {" K1 |6 _$ `" R: O h
9.3.2 主动连接 2954 {8 T/ C+ R) n' J2 R# _0 _5 S& u
1 d! f4 R6 i# t8 M9.3.3 ngx_connection_t连接池 296
- k2 g2 Q8 [" B5 d8 F# ?8 K! i
1 J" f% S! c9 h. u# X9.4 ngx_events_module核心模块 297
3 Q, b+ h! F0 v' V l! j% K4 ?( @7 o7 Z T
9.4.1 如何管理所有事件模块的配置项 299+ a1 Q0 p8 g& S* W4 |" \
. G! D: s6 V( ?, v( _% e9.4.2 管理事件模块 3009 V# i! z. N" I
$ o) v# u9 K2 B9.5 ngx_event_core_module事件模块 3025 h5 T( u$ c) b, N. E7 s* V: c
7 N$ S. C! K+ j+ ?* a) b& U2 V
9.6 epoll事件驱动模块 308, I! t4 F6 W: n, j- a7 g
$ S3 T% R& Z0 `# i" ^
9.6.1 epoll的原理和用法 308
* h- Y9 f* T1 \& X4 I* l |3 E7 C. E2 [& N7 x7 b# ]" N5 m
9.6.2 如何使用epoll 310
- ^& o6 ~2 l) y* J# m) Y' o* b4 v D. C9 p) f& n5 e8 Z j
9.6.3 ngx_epoll_module模块的实现 312
3 x& ]; l* ]7 `0 \1 @1 L" B* _0 @! A) {9 |8 U
9.7 定时器事件 3208 \3 P$ g. ?7 ?" J
; s) B4 t3 t* Q) ^ R) N- E' m9.7.1 缓存时间的管理 320; I+ ^7 A: H5 _' i8 J/ [ h
3 y/ t5 J2 P7 V9 l z9 c D+ v$ `4 `2 D
9.7.2 缓存时间的精度 323
7 h( U5 ~2 L6 r$ `( Y5 ]
$ X$ R; g. n7 K4 S; l9.7.3 定时器的实现 323
1 ^: p: j! T) u9 b8 `
7 Z# o" [* k4 s) D# u5 Q9.8 事件驱动框架的处理流程 324
0 k8 s3 _8 Y6 ]6 p1 I- D: ~; N* d$ y4 m5 |
9.8.1 如何建立新连接 325
) g) l H! b8 L. O7 g# U% L) ]: g* P9 c ?3 `; f
9.8.2 如何解决“惊群”问题 327
4 K g, w1 v7 c+ p' c' o' E" z- J" t" w' [: z K0 W
9.8.3 如何实现负载均衡 329* E$ e6 u/ ^% S, n i5 p! F
g# s& l0 E+ C$ d- u1 ?
9.8.4 post事件队列 3308 {) W5 L5 R4 O7 c* x, |
# e% R5 Z* I- r- E7 }9.8.5 ngx_process_events_and_timers流程 3312 q) D5 _: O' V( n1 p
# ]0 q% f$ ]+ R5 j
9.9 文件的异步I/O 334
9 Y. c' _5 C. @8 v
8 T# {4 Q/ [( T! V/ O. N" @: f9.9.1 Linux内核提供的文件异步I/O 335
9 x. @/ X' f8 F) ?% Q" z
: p4 Z2 j2 r: o1 |) N4 T9.9.2 ngx_epoll_module模块中实现的针对文件的异步I/O 337/ E( w( ^4 j/ W
% N C+ A% {4 c6 C" H; U9.10 TCP协议与Nginx 342 k/ X/ k2 H6 Y+ r& `. j
- ^ P+ k: j- y4 J/ g" |9.11 小结 347
) J+ |& h/ I6 B0 @# J8 [! X5 k: F4 u I _) y
第10章 HTTP框架的初始化 3483 P# L+ }1 _) R' H- U
3 F- O' o/ F. e: @+ z# t1 H10.1 HTTP框架概述 3496 _. ]2 v/ E( F' I
( h) {. o- l& M/ q) C, |10.2 管理HTTP模块的配置项 352/ c; r3 h" r# D9 I, s( `! r
- O( U5 z/ {; b# N5 h; a$ |3 B
10.2.1 管理main级别下的配置项 353
: U+ Z+ W! C q3 Z e% h( A, J9 h" @' ] S: Y# L* {" n+ h
10.2.2 管理server级别下的配置项 3555 ]2 E2 m5 A1 T. H# K; q
# G0 o5 M7 r" z+ Q; y6 R
10.2.3 管理location级别下的配置项 358
$ _! N2 q$ W/ `4 A' @. i* f! m, [
6 N! w, \6 K5 d! `: I4 y10.2.4 不同级别配置项的合并 364
8 W; ]& z, \- |' \- e+ O9 c% |- J+ Y) V. x( T
10.3 监听端口的管理 367
$ L4 r5 f: ?0 e: f
0 x1 @/ W. s' h- X10.4 server的快速检索 370
* z. R# H1 h% M0 H$ r$ A" {! V/ W( S/ q
10.5 location的快速检索 370
! a$ l& ^% q; _
, v/ i' G8 S$ ?. l& ^10.6 HTTP请求的11个处理阶段 3727 j# g, |& A6 V8 @# s. E; m4 P
' l" B" m2 _( I v" V2 n- a10.6.1 HTTP处理阶段的普适规则 3743 _ u; \$ ?/ {: L# Y- V0 L% F
! ^) p* J) m' }$ S/ ^
10.6.2 NGX_HTTP_POST_READ_PHASE阶段 375) z W7 U$ O' C+ c2 E
7 |$ c1 e! o# Y: y! X$ l10.6.3 NGX_HTTP_SERVER_REWRITE_PHASE阶段 378
9 H+ X5 P v# {3 _( m. R3 a$ x- T& V4 B3 i0 ^$ z- B$ B6 |
10.6.4 NGX_HTTP_FIND_CONFIG_PHASE阶段 378+ a0 _9 a, l' W8 b( x( R( Q
. [9 h- x3 m' w/ ^% Q6 S7 }
10.6.5 NGX_HTTP_REWRITE_PHASE阶段 378
1 z) w! Q0 R6 F- z
8 N* t* Y5 P" d+ w10.6.6 NGX_HTTP_POST_REWRITE_PHASE阶段 379* f3 ^3 D6 P, [# o
6 E. n( }4 i8 r! H8 B10.6.7 NGX_HTTP_PREACCESS_PHASE阶段 379
& s5 {* c) C: F. c! B
0 q3 X( N% d5 y" G& |$ O10.6.8 NGX_HTTP_ACCESS_PHASE阶段 3790 V) r0 e+ x" p# B1 G8 c. C6 |; V
" P3 U/ `7 a, b3 E10.6.9 NGX_HTTP_POST_ACCESS_PHASE阶段 380
" x. t6 [+ i$ d3 F% |- `' Q8 b6 U1 j
10.6.10 NGX_HTTP_TRY_FILES_PHASE阶段 380
4 b/ w! U) s# u; F
+ J3 a/ s& G/ _, f* {6 a10.6.11 NGX_HTTP_CONTENT_PHASE阶段 380
3 v/ S4 q2 U/ g$ W; v* ?( x
' \7 q2 c# O6 x: G) n10.6.12 NGX_HTTP_LOG_PHASE阶段 382$ P( |( m. e) D/ f8 |
8 B4 V Z1 X4 w5 m: |$ p) t; {; F10.7 HTTP框架的初始化流程 382" u/ k" ~% c3 }
5 H7 K6 S1 W# Q5 V/ C
10.8 小结 384" H8 q1 ^* a1 w& G. m( d
+ P7 H5 k6 Z4 K4 a8 T第11章 HTTP框架的执行流程 385; p% }7 C# ]) N' y( {
3 h/ B7 O. J& n3 I
11.1 HTTP框架执行流程概述 386
' }( A+ t4 r/ t4 z7 _; w% E! P9 J' Z0 O3 I0 f: Z
11.2 新连接建立时的行为 387; o" v/ b6 r7 \! u
. I* S( H/ E5 ^' h11.3 次可读事件的处理 388
3 i' r( k2 q. _$ z6 `' b6 ~) x- [8 j9 u+ Y" e9 }) {# B( T8 P
11.4 接收HTTP请求行 3940 h7 u5 ?7 ?, b, {$ _) O
% b t4 q, H9 c# Q) c11.5 接收HTTP头部 398
# [% J4 o% z) @3 x, h! o) X3 y8 q8 M, {# B$ _
11.6 处理HTTP请求 4002 `. {4 x2 K, D7 S! [/ C6 t
0 N$ \; p2 {# ]1 K0 ]7 C! l
11.6.1 ngx_http_core_generic_phase 406
/ i2 C. W5 Z0 R2 f! {, n1 W5 q+ _0 _; b3 W
11.6.2 ngx_http_core_rewrite_phase 408
/ I& W3 O$ [! r3 ~, N$ _5 Q8 p9 k5 f; Q# z; W5 p; b
11.6.3 ngx_http_core_access_phase 409
1 L% n0 O& W) I$ `6 l9 a3 K$ Z1 L* F- v- n( ], q8 w0 {/ j
11.6.4 ngx_http_core_content_phase 4122 Q6 [, b& H! n* |8 {
/ @; w2 D4 }) A5 \
11.7 subrequest与post请求 415
4 {% i9 U7 _' a, \+ x! L
5 v! k. g+ O5 h5 i6 q! L# @' R6 {11.8 处理HTTP包体 417
" @8 A) H& i( w4 u9 j! n6 |2 D5 p9 \; @- a' b5 m1 d
11.8.1 接收包体 419- |2 g6 D2 L6 s
9 T' h7 c/ I* L
11.8.2 放弃接收包体 4250 C j" s* Z0 N" f9 _
( g. ]: H' j- N9 v- A; x2 Q11.9 发送HTTP响应 429' C3 Y) S; w3 ^ j [2 o7 O1 B
2 }5 m) Y- i7 K9 a8 J+ [11.9.1 ngx_http_send_header 430
& j" v s3 f* [' G
8 ?) W4 t% h. t' n+ O, E/ Q a11.9.2 ngx_http_output_f?ilter 432& |8 ~& Y4 {3 q+ f) j' T' J/ d
| w1 r% B: D/ {1 K! X11.9.3 ngx_http_writer 4350 {+ {' h& I j# c! T
}1 k& e' A& q* J {; s
11.10 结束HTTP请求 437
0 T; P) F" f" B& {/ A G9 K3 E6 } z4 Q; H( h. S' [
11.10.1 ngx_http_close_connection 438/ `( `4 c: b( v$ G
) g. I, _2 J$ y; s! c7 b; S# D
11.10.2 ngx_http_free_request 4399 j, ?; }/ U& Q5 Z% ^/ y
! K( {8 O2 w1 S; N7 i( f3 l
11.10.3 ngx_http_close_request 440
" i# X6 i( Y) R. t
3 N1 U0 U* s2 j11.10.4 ngx_http_f?inalize_connection 441
: q1 t( B' y4 K( `
2 {. \9 q8 K) @/ D4 L$ i11.10.5 ngx_http_terminate_request 443
3 _5 c7 n/ \7 p% M& q2 L0 L8 r6 j# x" I: D4 y; g" M
11.10.6 ngx_http_f?inalize_request 443
. Q }( N! w- {* k5 l: i4 r
; k- b# G1 a P8 L+ h11.11 小结 4466 q9 `9 v, T! F! P& w1 p9 G, C0 v: o
! n' n7 l+ c1 G* ^# Q5 q
第12章 upstream机制的设计与实现 447& ?9 z/ P! v( u& m- [' M$ ^8 O! J
) G0 s( Z1 R2 t2 q% b- D& q7 |12.1 upstream机制概述 448 c; j9 Q, z d. j, w
H( D O2 X. m U9 _' H4 |4 i
12.1.1 设计目的 448" D# u3 F0 |7 M) `
( i3 \" r8 R& Y- L2 W
12.1.2 ngx_http_upstream_t数据结构的意义 4505 w. p1 k; `. Q5 G
2 g% ?: H/ f* S) ]& K12.1.3 ngx_http_upstream_conf_t配置结构体 453
; B6 {3 ]6 z# D, E( G8 Z
8 q) u* k* N% a, t" x12.2 启动upstream 4555 Z2 G' g. |* \9 g, m" S7 y
' b& s0 l7 |, e, I. K& L6 @) R12.3 与上游服务器建立连接 457
) M6 s+ R7 X( e
8 k) O! b' o# V6 a. v: {+ _12.4 发送请求到上游服务器 460 l3 t& u5 I8 c* |) S' C
4 I+ j \ J+ H2 x0 z! r12.5 接收上游服务器的响应头部 463
; U7 D. \* R3 b+ R3 m. d* A3 |6 h, _- W8 r
12.5.1 应用层协议的两段划分方式 463: f1 H. M' P S" g' m7 G& `
: K8 v1 e( ?3 r3 u2 e- ~12.5.2 处理包体的3种方式 464
* Y8 L6 O3 A" m' g; l" _8 \1 M( M, M B/ r3 z5 A
12.5.3 接收响应头部的流程 465
- h( [5 z6 {; ^7 F3 Z9 ^
' M* v ]" F0 @# b1 Z6 x! u12.6 不转发响应时的处理流程 469
4 [0 s! T( u! v' A Z
% _, g0 G( n0 R12.6.1 input_f?ilter方法的设计 469
* \! k( r }+ h/ }0 Z* k) t* {- G v& s8 f- {( A, @
12.6.2 默认的input_f?ilter方法 470 P0 a) S8 V% x6 A. G3 `
; S, l4 ^8 W" s* e12.6.3 接收包体的流程 472* a1 L6 w. ^0 ]' k I4 X& D
+ ?' e1 x6 u3 b7 p' ~* W12.7 以下游网速优先来转发响应 473- ~$ G" Z0 Q1 x8 O; Y% T& Z% K
* Z) a5 `$ I9 J" h+ |. y+ w12.7.1 转发响应的包头 474, m/ Y2 O, O" u X& d) A
: M7 f! Y2 P" \) j J4 |! J+ M% t12.7.2 转发响应的包体 477$ x8 [/ ^# w' @
' g- b( s" v, b* I
12.8 以上游网速优先来转发响应 481
5 ]. _- t6 y; z! x5 D
5 i$ a$ |1 s) G. p* `& N12.8.1 ngx_event_pipe_t结构体的意义 4815 B; T9 R# q. r
% Z; t- N3 a6 I
12.8.2 转发响应的包头 485& o* Y6 O* D& g' `& p/ g
0 ^3 Z ]" B0 u8 D/ r
12.8.3 转发响应的包体 487
2 `4 P5 l V7 J4 T8 _
2 y4 H3 d- F. p) p, G12.8.4 ngx_event_pipe_read_upstream方法 489
5 e. i( a% A: w# e
2 l' Y$ y) t, z4 N12.8.5 ngx_event_pipe_write_to_downstream方法 494
7 n- }6 t! w7 t# B$ T+ {# ^3 o& ~# F3 @
12.9 结束upstream请求 4962 ~% i8 R9 i7 x0 T: b( E
- u$ C8 N# f8 N; a9 z7 _
12.10 小结 4998 s, L( k" M U$ J) j/ H: x Y
! i0 L& Q& g9 b& H( p
第13章 邮件代理模块 500; |% h& @. x( n1 r9 f2 t! z1 z- [. E
% c6 D5 y3 L6 ~) v
13.1 邮件代理服务器的功能 500
+ }$ K# z6 Z6 m4 D- {+ t2 S0 ?: }8 P
13.2 邮件模块的处理框架 503
4 W' ?5 a, {8 I6 P7 b
; ]3 H* y, ?3 e1 W* Z6 m2 d: x13.2.1 一个请求的8个独立处理阶段 503/ c3 C$ ?& j4 c2 R0 p0 |
: E# f$ k! {6 f- {% C2 u# D
13.2.2 邮件类模块的定义 504
5 F# n6 r$ }+ G2 m n$ D9 @# h. W" q
13.2.3 邮件框架的初始化 506( X) t/ f$ M' [2 k, T
( U# ]$ K* b6 }9 t1 `9 p6 R
13.3 初始化请求 506
7 f/ S* N q2 X$ H5 H% |4 a( A3 y3 O, I" ]7 G
13.3.1 描述邮件请求的ngx_mail_session_t结构体 5061 w& \. l# e( w* Y
: P# `; H5 D% T F- }13.3.2 初始化邮件请求的流程 509
; r- F* q/ x9 P+ U: g" g
: I7 S! G. r1 S& q) }6 a5 u13.4 接收并解析客户端请求 509. ^1 I; \3 B: y! _
# g9 C% y2 I' n% f- Z9 ]
13.5 邮件认证 510
6 R7 y! n6 B3 C( Z4 X- E& A0 b' ~/ M' q) `
13.5.1 ngx_mail_auth_http_ctx_t结构体 510- I3 }! y8 n2 l) [* J
4 }6 O1 a! Z2 K# D' l13.5.2 与认证服务器建立连接 511
) R$ |+ n9 y/ r3 s! ~
4 d7 B3 l" h% H9 z8 [& k1 n! G+ l13.5.3 发送请求到认证服务器 5138 ~% K7 O. k) ~
7 T+ v6 k( t7 D$ N: F
13.5.4 接收并解析响应 514
3 M4 I' @( J+ w/ M# {) V8 O9 y
6 R( @# r: P' R* P$ J& w/ }8 t13.6 与上游邮件服务器间的认证交互 5145 f1 a# \- u& A+ N5 b
' T. E1 D E$ s2 x& V' h13.6.1 ngx_mail_proxy_ctx_t结构体 516
8 R+ L& {3 ~) D& R y( O- j) F
. G3 v8 ?" j; a# {13.6.2 向上游邮件服务器发起连接 516& @; `3 {' \0 L* m* X
' L7 h& }$ N' B9 {1 v13.6.3 与邮件服务器认证交互的过程 5186 T6 K: [8 `* c
* i4 g( D+ I( R' ]; M! g
13.7 透传上游邮件服务器与客户端间的流 520
) z" S4 _4 `! [( R0 D2 ]' c! l/ ^3 v* e0 J/ Q
13.8 小结 5246 _- v1 @: V3 T
8 Q, l3 i. u) d* I& g% d, ?7 x- O
第14章 进程间的通信机制 525
% [! |; U6 ^. p y
2 @2 {$ g7 P! s9 w# B14.1 概述 525
) z( H+ k$ ~: R" i* b
( S+ E4 R" }2 y3 T14.2 共享内存 526: P2 |3 L; z: Y# L8 g' [; l- {9 P
! \* {2 C3 @& |& k8 c$ M d$ C
14.3 原子操作 530; E: {$ ^6 c b5 w4 k; n
7 X% S! _" A3 b14.3.1 不支持原子库下的原子操作 530
6 @) n' S3 H( a" t4 H! Q) @! K- Z: o/ j& @& B
14.3.2 x86架构下的原子操作 531
1 s- J4 m4 }* z5 z0 O6 |# e) g5 T/ Z- Q( T9 V
14.3.3 自旋锁 533; W1 G7 @) r9 S2 G9 I
. K1 G9 e( e# Y! t4 y" n; q* J
14.4 Nginx频道 535
4 ^( a( \' i! J$ l/ S0 D/ m8 x
2 N, B- A/ Q4 x3 p14.5 信号 538
9 ~- g( s- p3 i C5 |, j6 @/ x3 X9 `3 g5 t. g
14.6 信号量 5407 y; T; e7 k0 h# e
1 a2 D5 Z* F7 ?; A6 F: @1 ?4 o& r* l+ b
14.7 文件锁 541
?' F4 d5 R3 }) \
. n4 A3 `( k: G& O! u14.8 互斥锁 544
+ V& |/ K8 B- p4 c, E/ U6 T( x/ `) w+ M ?% a: C3 p) ]
14.8.1 文件锁实现的ngx_shmtx_t锁 546
- q) ~ N0 u9 u9 E/ j3 [
# Z u2 j3 w( c8 T0 I14.8.2 原子变量实现的ngx_shmtx_t锁 5481 Y1 ]& V+ S4 S6 a& Z0 g# Y* W+ o9 R
: ], X6 X' Z1 h; E" f" H; E14.9 小结 553
& v+ S9 i8 y: r6 D Y5 c, ?( [0 G8 N# Q* ^ H" v& n+ T/ a
第15章 变量 554
( R, F+ M% U4 B( P
& W2 c* Z P& a; s6 E0 @3 ?1 k) g8 |15.1 使用内部变量开发模块 5556 N1 R4 V' z8 u& O1 e2 l* _; C
# N& \7 o* {1 Q6 L: j6 y15.1.1 定义模块 5569 z/ d# M. ^4 T5 r4 f9 q
6 ~% [" i2 b+ E; c15.1.2 定义http模块加载方式 557
, Q, q& M! g9 ~1 ~4 o# k% n- _2 i! n8 A1 c5 ?' z
15.1.3 解析配置中的变量 558
2 k% I/ S- f" @( k6 i' U
0 n& E2 b2 E) J/ w" R15.1.4 处理请求 560& F5 ^- m( [6 U7 {7 K
: g; Q2 E. w: f7 y% \! N
15.2 内部变量工作原理 561
' x9 D3 i c+ K
; m) t: a4 b5 h# Q15.2.1 何时定义变量 561
- ^: N+ x( j2 X6 I) o
6 E3 H2 m$ |( i& F) v7 T15.2.2 相关数据结构详述 564
" {& y9 o1 }, P4 f$ v
% W) t/ O4 @2 b l2 }) X15.2.3 定义变量的方法 5725 m8 K# X0 E6 p4 o7 @, X( Q+ W: f$ t/ R
4 i* r' k3 X' N m6 l, @
15.2.4 使用变量的方法 572
% D: C3 C/ U5 E9 m5 s
* }3 q$ ~, e, H! c15.2.5 如何解析变量 573( l6 S0 ]) u" |4 I8 C! E
2 Y! T% Z$ ]" J/ Z. Y' S15.3 定义内部变量 576
/ {. A3 z: Q! O$ T) ]/ x: [0 J( k$ C- I4 d# q
15.4 外部变量与脚本引擎 577
, [, o/ {. a. l' R# `% G: I
# H1 H- {: A, {5 S15.4.1 相关数据结构 578
' Y& u9 C7 i/ a+ O! k# v) P$ o
8 M) b. |, v1 i; Z15.4.2 编译“set”脚本 581
, [ k# g1 r i5 K8 @! B
/ o( p! }- p2 H. a# y5 g8 D, t- Y15.4.3 脚本执行流程 586
0 d- |7 p% c& p* R4 @6 p* `3 S# h8 p% C6 ~" J
15.5 小结 589
5 I5 ]0 m$ g' A& ~
$ |) N2 l( l4 c0 w, G第16章 slab共享内存 590
& S2 m( I! K6 K+ z& c; S; a, O. D, t1 I2 m
16.1 操作slab共享内存的方法 590
- G$ d6 u$ @$ ^) H4 p/ z1 |" ~2 Q$ b+ H0 m& [' z2 J+ }
16.2 使用slab共享内存池的例子 592
) u0 y/ P8 h. D. O0 k/ n
7 l$ ~4 j5 D9 m0 ], |16.2.1 共享内存中的数据结构 593$ d" G5 r5 V" w0 _, Y
+ L2 e9 l. k0 D: M( ?& X ]1 M$ ]16.2.2 操作共享内存中的红黑树与链表 595& L9 y( S# @9 k
a7 r9 T+ z8 f' f
16.2.3 解析配置文件 600, L) q7 Z- B% W9 V" o C- n
. Y# |1 L. X. D! y' I
16.2.4 定义模块 603 J6 ?5 W5 Q: W6 {- m3 |. R
' b; U3 e6 {' j$ k3 I
16.3 slab内存管理的实现原理 605
/ ^; n' L" m4 V Q9 r0 e
1 @% Z6 T3 o- Q2 O4 z16.3.1 内存结构布局 607
: Y0 U* L7 a9 n9 r% X* g0 y5 K3 ?9 w/ E# R4 m
16.3.2 分配内存流程 613- b' |9 Z+ p( i. W/ y
?7 w) t8 o- _ |) U16.3.3 释放内存流程 617
4 ] i0 `0 b- ]2 P% x9 s l/ g
! x* `4 _' x N4 A9 D7 W5 Q6 N16.3.4 如何使用位操作 619
8 a# u( z! m# {3 x- z# s
# F7 I! {8 b- h/ a16.3.5 slab内存池间的管理 624
; j' n- v3 A2 ~; a9 t9 @! F& C; r
16.4 小结 6243 t4 {- V9 @3 s0 z8 J
! a* F1 m+ v9 A/ w* f- i百度云盘下载地址(完全免费-绝无套路):+ a* [+ G5 y' a7 Q# M
+ U* _" H7 w& H' D' s- `" F: q
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|