|
Java电子书:深入理解Nginx:模块开发与架构解析 格式 pdf 电子书 PDF 电子书 Java吧 java8.com
. S. B- z7 c3 c3 x( C
# h8 L i" \' S3 R( | u* `4 ^ E* E+ F
编号:mudaima-P0137【Java吧 java8.com】8 c/ ?8 S) H- ?4 ]5 D' `+ i, e* l
9 p f" ]; s4 ~( h% a, }# ?
% b% M- l1 m1 C$ l8 _4 f
: r; J$ u w: }Java电子书目录:部分 Nginx能帮我们做什么$ e3 C& t) K9 F7 [3 T) |0 M. m3 u
|$ B2 V R4 P1 ]第1章 研究Nginx前的准备工作 2
+ c, Q. j/ k3 A4 L( l5 y0 V
; d: F, w6 L/ K8 i1.1 Nginx是什么 2
: l+ ^: |2 W3 d1 N. T @& p
% ?% P @0 i7 k1.2 为什么选择Nginx 5; }8 O y. G( t ` ~( v7 D9 g
) U* z2 E# y+ M& o e
1.3 准备工作 7 K$ \) \# T8 z+ S0 o y
3 q. R+ ~# | L; W
1.3.1 Linux操作系统 7! L# E6 P* H3 F3 Z0 b- q7 B
9 l$ M; ^* [* K; h& o6 [
1.3.2 使用Nginx的软件 7
1 ~8 J2 g5 |0 _) d/ S. d1 _9 g5 Q4 k6 J# g* p
1.3.3 磁盘目录 8. C$ m3 U0 k. n7 L6 T2 ?! A
8 F; F/ t5 }7 u! l1.3.4 Linux内核参数的优化 9; Z" j7 V# g! L' Z8 g5 B/ ~# z) ]- f
8 C) M2 |' Q; k' i1.3.5 获取Nginx源码 10
/ k/ p7 Z' g: g1 D6 Y1 Z! F7 y z% f. T4 t. E* Q5 k4 C3 ?
1.4 编译安装Nginx 11/ Y: h7 q! W0 W* c \
7 W3 w2 w0 l' Q. @$ Q. q
1.5 conf?igure详解 11
$ ?( E; G$ j# X, P V6 D. L( P0 Z- B9 P# F
1.5.1 conf?igure的命令参数 113 W+ w% j* K+ i( P) d6 n0 R0 ~
7 s# ]( w3 |4 a9 z, a m4 v
1.5.2 conf?igure执行流程 18
& ~7 E9 l3 v7 B: }! i! \! |" z4 D. F/ V4 x& _; B0 p/ S7 g8 u
1.5.3 conf?igure生成的文件 21
! N8 Q& p/ ]1 p, J R" c+ b4 O" ^5 J. e ]
1.6 Nginx的命令行控制 23
' O: _/ P6 I; J# D9 P% L4 P" b$ N: }# g
1.7 小结 277 j( w( r3 ?9 N; @, i9 w
4 c. y* w ]- r: q0 S第2章 Nginx的配置 28
& C6 `* r9 {& O3 t6 h" ?
x! F/ N9 ~4 C' E# B8 V2.1 运行中的Nginx进程间的关系 28
5 X( V5 i: a- d7 K8 D: S
( K; | y3 A" I* I& {& l2 F2.2 Nginx配置的通用语法 31
$ K$ @& \, I+ Z* C* m' p- \
2 k7 h* L$ A" W1 t2.2.1 块配置项 31+ D: ~( h7 C, L" B: g5 A7 H
9 U/ V' F, w) `* I& j% B/ O: O
2.2.2 配置项的语法格式 322 o3 A" ]8 s, W$ p2 y
% V2 t4 f6 c3 v
2.2.3 配置项的注释 33
( L# Y5 h3 O$ n* ~( j
1 |! i6 A# Q1 ]7 u$ s1 _2.2.4 配置项的单位 33- ?$ U8 D2 |8 X. S. M% n
# j$ G- R$ q% Q% U2.2.5 在配置中使用变量 33( a+ B9 ^9 w& @& x4 h
W6 e5 @, [- F. L$ J2.3 Nginx服务的基本配置 348 r2 e8 w% q$ B9 A8 n* {
2 _. _% n/ P( S4 r0 [2.3.1 用于调试进程和定位问题的配置项 34, G, S: k; ^5 k- H8 Q4 X
7 g+ b2 S0 S# o( Y2.3.2 正常运行的配置项 36
( T9 k, G R) r$ F' C9 s) X5 _0 a# \
( \: Y) Y7 A; {$ j! s2.3.3 优化性能的配置项 37
' n9 U4 O) X( e/ y9 ~7 L
( s4 r) b% v! k- \% Z; m% W$ n2 z2.3.4 事件类配置项 39
6 Z. i/ f4 N; E' M/ v* T
- u. |9 O! P7 ^3 ] q4 x/ [2.4 用HTTP核心模块配置一个静态Web服务器 40
9 p9 Y7 Q, U4 D: U/ w
% x+ i5 U( ~: b7 Q8 L2.4.1 虚拟主机与请求的分发 41/ e0 i5 l2 T5 C
7 F" X$ V: R8 M+ ?; I: d2 F. u2.4.2 文件路径的定义 45! G$ ?7 o/ V5 I
3 s a6 O7 G5 V+ Q
2.4.3 内存及磁盘资源的分配 47
6 N& _" o& O I. T' b: ]* \ t# f% u& X$ v k
2.4.4 网络连接的设置 499 J4 l! S. x9 Z
/ L h! P( }" Z6 s: e# b; T4 q# T2 ^( e2.4.5 MIME类型的设置 52" B9 B* S! L( T7 f
4 }5 i8 P" {% i( X) w2 ?! j; k
2.4.6 对客户端请求的限制 53 ?- U4 F% r* G
' s3 p) w3 _, |0 |
2.4.7 文件操作的优化 54/ G" h. p- ~' \, m/ c
1 }: x' f! h) m8 F; g9 S2.4.8 对客户端请求的特殊处理 56, K$ {# Y4 f" ? S R
2 M, C' F: F0 R6 A$ l! l; Z2.4.9 ngx_http_core_module模块提供的变量 57
# \& O( O0 R( }3 O' f) z; t" p- w2 u6 j R! Z; k; z- t H# M
2.5 用HTTP proxy module配置一个反向代理服务器 59, {; ?4 b& [8 V' G I6 ~
% P p# T; Y: X( X5 j7 H2.5.1 负载均衡的基本配置 61& p$ h; ~' j; H/ [7 q' [4 Q
6 Q0 f- `* h" E9 N5 `. q$ X2.5.2 反向代理的基本配置 63
' L4 z u" X" ?" f0 G
1 S% c3 `: J- a/ M2.6 小结 66
, V) I. e+ U" g9 O+ C+ g: i4 T- o6 Z J
第二部分 如何编写HTTP模块
' }. }$ K! `& c- B! z# W& X, ^+ F# b" b \( \+ B6 p+ `
第3章 开发一个简单的HTTP模块 68/ `# V$ Q6 }8 U3 f, L, v6 ^9 l4 Y
. @' a2 h0 \+ Y# K+ J! o- _3.1 如何调用HTTP模块 68
7 A3 |0 r5 v6 @; E6 j
2 C: @+ n8 t) {5 t) R3.2 准备工作 70
# \" m( v) N. h- v
% U& C$ v# }& M3.2.1 整型的封装 716 I; V* D# K' p8 m, j! i
1 j+ Y% U, C: j# l Y; q) f8 _# l3.2.2 ngx_str_t数据结构 71
1 K! r2 d: f! j9 p9 E. u) N
9 f: C* q4 y# V& @' y; o5 l3 i3.2.3 ngx_list_t数据结构 71
K( s' s# H( O% G% u1 I
; Q' j4 U4 T3 V' {* Y+ U3.2.4 ngx_table_elt_t数据结构 75$ Z8 X# i# x5 O* \' B
- z+ H% n3 I' {3.2.5 ngx_buf_t数据结构 75
" Y# K5 Q1 G# G8 D( G$ N9 j' ?7 M
. d1 d/ W" q7 z# d3.2.6 ngx_chain_t数据结构 77
, x, R- Y2 o* ~9 P+ t, K# y$ T6 H' L$ @$ o, p3 E9 o$ B
3.3 如何将自己的HTTP模块编译进Nginx 77
' C0 C( t G# O/ E
: G6 l8 i% q% Q3.3.1 conf?ig文件的写法 77
# A; j. q1 c7 Y2 R0 ]6 ^2 T) L% j. {) x4 F& O* F
3.3.2 利用conf?igure脚本将定制的模块加入到Nginx中 78
/ Y4 u$ O; u* D- B8 C1 Q: Z) ]# d4 N+ b- ^3 m0 G0 h# @' z
3.3.3 直接修改Makef?ile文件 81
7 L8 d6 {& o) t- s8 {- H/ j7 ^! x& w* X& j8 g) k- l
3.4 HTTP模块的数据结构 828 R$ l7 m; O/ {" P/ C
2 `) W4 o: V! @8 c1 e3.5 定义自己的HTTP模块 86
, F2 g O7 E+ H/ k. ]! x! c' `3 A
/ W. V0 j) F( s3 x: D3.6 处理用户请求 897 ?! y, {* y' ?8 K# K
1 z4 K! ~* R @, G1 F4 t3.6.1 处理方法的返回值 89
7 c1 n5 p" C1 |, C$ a! \$ ]8 E: ~$ `6 n a+ A
3.6.2 获取URI和参数 924 _) @# O+ i& ~/ _; f
. ~. o! p! I; P6 D! |
3.6.3 获取HTTP头部 94
5 Z$ \0 @: j y5 t' ?* U% ^& L( [$ }4 y4 t$ A
3.6.4 获取HTTP包体 97* G" r' D% Y4 a6 F$ p0 [
1 ?) n5 j: [( P2 R% N7 g: u# [# c
3.7 发送响应 99
( c2 r/ |( y" `$ _; Z
X4 _; {7 i" Y! o3.7.1 发送HTTP头部 99
! j- L; s- b) k/ }7 l8 t3 [# R% E
' }$ y8 r5 A& c. K% D% X, N3.7.2 将内存中的字符串作为包体发送 101
' L8 q( N3 k) G" {# v2 N
% {9 c4 L6 J, ~3.7.3 经典的“Hello World”示例 102; }0 F8 {$ G; B* [" c( s: \
1 d4 u! r# g! Y5 E% W s, t' g
3.8 将磁盘文件作为包体发送 103
. P5 t$ A+ L% O, Y. R4 r e" O9 ~/ w! I' o; b7 {( q' B
3.8.1 如何发送磁盘中的文件 1045 c+ E3 s+ Z2 k9 O# j$ S. m' ?
( {- R$ `: R" U% j* l; l" @: A7 r7 T
3.8.2 清理文件句柄 106 Y) P" }. i/ n8 [6 F" a! _
$ K- U- @7 D' s2 x3.8.3 支持用户多线程下载和断点续传 107) A: l! U+ V# n, i7 a7 t6 C( L
2 z0 f1 v% p# o) l+ `: ]; U1 R. n3.9 用C 语言编写HTTP模块 108
$ H4 `; j# c5 G B' G. ~: } }! u8 j# D4 a" [+ H! a6 i" m+ e+ X+ ]' G! `
3.9.1 编译方式的修改 1081 X R4 s8 A( y! g0 s
3 e7 |' _1 ]# \) C. L+ c8 Y: X
3.9.2 程序中的符号转换 1099 ]% o2 |9 b" ]1 N' r) B+ E' ^
) r. F& e6 i4 j4 r1 J0 l3.10 小结 110. p4 @, Y( w. v2 Q9 k& ~
: p% v( O) _( E+ ^1 s8 p
第4章 配置、error日志和请求上下文 111* D7 Y! i. N) P# |1 U
- ` i& C9 B; v9 m# {. r( ^: ?: h4.1 http配置项的使用场景 111
$ T8 U( L0 c' E& n5 [2 b: _- k2 V B+ d7 T
4.2 怎样使用http配置 113
- [+ Z/ X' j0 K* z! z: d9 `4 s+ `' u m8 Q) h1 m' j) \6 J
4.2.1 分配用于保存配置参数的数据结构 113# {* X0 l# T* ^1 a" t
- a/ h7 |: |$ d7 y; \/ ~; r* F
4.2.2 设定配置项的解析方式 115. \, l6 c0 K/ l1 `; `; i. B
! E; e& J7 i) Q8 f: b8 m- _
4.2.3 使用14种预设方法解析配置项 1218 q8 T' d5 R4 f3 z# Y! v' G
( }! F2 J ]3 s4.2.4 自定义配置项处理方法 131, o: ^* `2 l/ }8 w& Z* ]; G- J# S0 F
) Y+ {- W, B8 Z3 h
4.2.5 合并配置项 133 X4 l* J' V9 {/ O! X% x" e
4 |2 T; `. Y$ |8 u, [4.3 HTTP配置模型 135
3 V+ ^: B% h3 }' c
2 M7 A4 |# l# u+ u1 I4 f4.3.1 解析HTTP配置的流程 136
8 r: ]! }, E. M* N! l* f. b* q7 x
+ r/ ?1 o2 h+ m4 W9 b4.3.2 HTTP配置模型的内存布局 139
1 S5 F' L( e% a+ ~- \( X$ D$ r
6 y! F. P8 z& {4 n4 Z2 M4.3.3 如何合并配置项 142
, p6 i" e. w3 S( Z2 o# K8 ~' o4 }6 h7 h3 L" W4 G
4.3.4 预设配置项处理方法的工作原理 144# Y% B* M& R. `
$ { c3 d: H* n& N4.4 error日志的用法 145
5 h, l" h! Q% P. J8 Z F6 R" ]/ T- H" t. B
4.5 请求的上下文 149
9 [0 U0 B6 Q# i" _ e# b% Y% j t, V8 ]
4.5.1 上下文与全异步Web服务器的关系 149
N# v! Q9 {# ?* }$ p8 s! a, Q
; {9 g1 p0 E2 z, c% P* @! N4.5.2 如何使用HTTP上下文 151$ d1 L3 t0 ~) C6 d' o# f
* B+ h3 n) ]6 V8 t
4.5.3 HTTP框架如何维护上下文结构 152
) X7 |/ ]( _4 h# |' Q: o" ?
2 v" Q0 m- y1 V) ~4.6 小结 153# x; H" R8 y0 b4 q7 a8 X- e
. R( U5 E- Z" ^* e& X: Y4 }( G第5章 访问第三方服务 154" S! Z5 j) ?2 d5 \' I+ a3 [
6 o# m9 `; P; I7 [% D: M- |5.1 upstream的使用方式 155
6 ?9 L2 ]: t" j7 u: U/ r; ]9 O" Z5 s; Q6 s9 {
5.1.1 ngx_http_upstream_t结构体 158
( |- _2 d- |6 Z$ E3 v7 E+ P1 R7 L3 |( y" u& U+ W h
5.1.2 设置upstream的限制性参数 159
, ?9 U; L! T3 a" {# m9 V
/ n( d2 ?! G4 J& S8 {6 M7 Q1 s! T5.1.3 设置需要访问的第三方服务器地址 160
! N+ A! k* F, o- F, M3 F
3 x3 [/ F1 l |" h7 b, X; E) l) z5.1.4 设置回调方法 1617 }4 `* ^! l/ n9 F5 |/ o9 s
; a) @) d& c: k Q* u! _
5.1.5 如何启动upstream机制 1610 [/ L; W: j+ D4 a: A2 E; {' A
( |! ?- v1 f& W8 ]5.2 回调方法的执行场景 162
8 \4 Q8 u$ g# |6 b4 ?
& i& e& v$ c! c5.2.1 create_request回调方法 162
5 A5 \% d! q5 r+ L0 R! ]" j) J, q! n6 k
5.2.2 reinit_request回调方法 164) y, S6 F8 R2 `0 m( O' J9 s
+ O- ^: P5 g0 A) d& T
5.2.3 f?inalize_request回调方法 165" t0 [! b0 u& H: V: S c& v- }
& I; U9 u+ j0 F) M5.2.4 process_header回调方法 165
6 i! r2 [: o( _ e: _4 z
3 d* O1 I# y f1 b5.2.5 rewrite_redirect回调方法 167
* C3 U5 Z; Q# H& u4 U2 A R, L% a& a+ c7 L$ d
5.2.6 input_f?ilter_init与input_f?ilter回调方法 167
0 b% w, g) D) s5 S$ p4 m' M6 Z
. K4 D. E7 G$ ^8 Z, V9 J# w5 ]5.3 使用upstream的示例 168
2 x; k% p3 _+ G+ N4 Q; d8 f
! Y# q2 h! B" \8 s5.3.1 upstream的各种配置参数 168
( I1 m1 m- P0 T$ Z& l' J5 J4 T' ^/ E8 ?. ]
5.3.2 请求上下文 170
+ |5 P7 z/ {, f; P0 [/ [' X0 ?* p Z: N- v# ]5 M1 X( ^. }% A, Z# S9 F
5.3.3 在create_request方法中构造请求 170
& W3 a! |3 o; K n3 `4 \
5 M5 w% w, {) t5.3.4 在process_header方法中解析包头 171& {! W+ w# x! i) O' Q& z6 U% ?
( ]( \$ l# l; j. y8 ]
5.3.5 在f?inalize_request方法中释放资源 1757 V7 Z- W% F& U4 g; [
$ M9 O8 n* T- D4 h. ]/ b' e5.3.6 在ngx_http_mytest_handler方法中启动upstream 175& k* h) ^3 |. W+ N+ `2 }3 _
8 ~: S9 ?( Q3 T0 S, A6 o# `5.4 subrequest的使用方式 177( D; D& O. B4 q- m+ v2 J
: E2 ?; E8 R3 h' n2 Y4 i5.4.1 配置子请求的处理方式 177- m! h. e" ?* L' f
+ v9 V- d! [* w7 A
5.4.2 实现子请求处理完毕时的回调方法 178
5 p6 z, N* U2 J1 h6 O, t0 z |% E% \
# X$ j4 j; ^1 y8 Q5.4.3 处理父请求被重新激活后的回调方法 179
- V, Z1 j$ M% f( U6 z. c
4 i- ^; u* l% h5.4.4 启动subrequest子请求 179
* e/ H1 P) i: I9 i0 T
4 j$ X8 l) P5 p1 F" A, E" E2 n5.5 subrequest执行过程中的主要场景 180
# ?2 N& _: M. I4 y7 G
) b7 }1 O+ n% b) L/ M9 ^5.5.1 如何启动subrequest 180
, T; Q/ g, U2 V8 _. x0 n6 H2 M, f1 a9 L8 k8 w
5.5.2 如何转发多个子请求的响应包体 182
& X0 N+ | E: ~3 q+ u3 V; S; E- O |1 N, m
5.5.3 子请求如何激活父请求 185 I+ ]# v/ H: a, ^3 Z- L8 \
2 `* X# \! z5 p) j
5.6 subrequest使用的例子 187
( C! F0 }4 B c1 G. U" H1 A# e; i
; A2 u! ^) n+ g: U/ p5.6.1 配置文件中子请求的设置 187
, k) H$ \; N6 }1 `! X& A% K* z- ]% G2 m. L% u/ y) _
5.6.2 请求上下文 188! F8 k9 o( q! H+ [8 Z# a( R7 i
+ u+ C. _& \3 s8 q/ K7 C* c6 \
5.6.3 子请求结束时的处理方法 1887 Y! `* \9 L; S$ [9 T
3 r/ E1 }0 t7 `2 ^7 C5.6.4 父请求的回调方法 189; Y4 _3 _2 B$ d* q6 g: Q
" ]. m8 _3 M7 Y' w5.6.5 启动subrequest 1902 K* R$ n+ U/ [: P
) T2 Y8 t- ~' E: }& X1 P
5.7 小结 191
1 }! p( N" u2 ~- Z: X% \
; L% h7 d! z C8 b/ b+ B第6章 开发一个简单的HTTP过滤模块 192
" U" d& ?- |2 ^2 B: _" i( q9 @8 M, N7 e4 q
6.1 过滤模块的意义 192
. [6 U& y$ k( O" ~+ z3 a
/ R# e0 h7 I) Z6 @6.2 过滤模块的调用顺序 193
' s D1 x1 f1 H" F9 z( R7 _5 @
) r a3 V, J ^0 g$ _+ \6 s b6.2.1 过滤链表是如何构成的 1945 R+ n/ _ ?4 e2 \9 R0 E
' x2 y" ?/ L+ z
6.2.2 过滤链表的顺序 1962 s' }" H* p: L1 d: }7 s1 e
3 [0 Y$ |- h+ Y- D; R; B6.2.3 官方默认HTTP过滤模块的功能简介 197* K* b3 j% G" H
: s( w2 C) Q. G: j8 p8 y
6.3 HTTP过滤模块的开发步骤 198
) q" U% J' L5 ^9 K, w9 n& K$ M9 ^& N& W; @; R; Y: f) }+ N
6.4 HTTP过滤模块的简单例子 200
* n9 m# a5 _3 s I
! z3 _! @4 q. w1 k$ t6.4.1 如何编写conf?ig文件 201
( w" G) t+ @& m/ N: n }7 a' _& h7 z r. c
6.4.2 配置项和上下文 201( u% r9 E# F5 A' Q. X2 h
# \% {! F* q2 R) G( r- @4 D9 p: n
6.4.3 定义HTTP过滤模块 203
7 R+ }6 P, ^- c3 G7 k; `2 o
5 g1 u H3 L5 o3 I* ^0 L* B- E5 E* b6.4.4 初始化HTTP过滤模块 204
) u" l6 S: A& f4 F- K& F
9 f: R- f) h1 Z! o% t% K6.4.5 处理请求中的HTTP头部 204
) m9 p) u1 _) _3 z# J; ]
5 ], w1 J, B4 y9 h5 k% }- G5 R; ]6.4.6 处理请求中的HTTP包体 206
) U, |. I: k% ]% U; t
+ D+ ~0 A* V3 o' n' o' s0 o6.5 小结 206/ ]4 F _; D- v% Z0 `- N" y% p) n
: N2 C0 F- m7 c2 {" {' E% l9 B
第7章 Nginx提供的高级数据结构 207; l1 |) M: ?5 B! T0 E
, r! u& N2 N4 S7.1 Nginx提供的高级数据结构概述 207
2 ?6 x) Q: O* a8 ^0 K
( S* U8 v# [7 j5 q( r7.2 ngx_queue_t双向链表 209; |- k7 I0 [5 D9 @
, @" R1 P) S* R& a7.2.1 为什么设计ngx_queue_t双向链表 209
2 k- I% e& X' W% Z# r
/ F* w6 |1 M, L( j7 D7.2.2 双向链表的使用方法 209
6 a) ]1 W/ |! m2 S4 d; C; Z4 s3 r- o
7.2.3 使用双向链表排序的例子 212
( K$ `5 @: y5 u' c9 H' E/ N8 G
7.2.4 双向链表是如何实现的 213
$ i c9 O6 q+ x" m# d" S/ c0 W' A4 u& w; h" I
7.3 ngx_array_t动态数组 215
, L/ Q q& D) W( ^8 @; r* h% w4 ?" p% o) a0 T7 E+ \* w
7.3.1 为什么设计ngx_array_t动态数组 215
# f' j% d$ [' x+ C6 q; i0 H+ @& Q, g+ N
7.3.2 动态数组的使用方法 215( i8 ^% h' A: X8 r
- B7 s- ]- S+ u& }( d4 D Y
7.3.3 使用动态数组的例子 217
" Y0 ~% T/ f/ t
( L' p( s$ {( W& j" d0 J7.3.4 动态数组的扩容方式 2187 b5 q( O9 T8 a
4 h, ~3 V4 u7 Q/ f! L3 Q4 T. ]+ g+ v
7.4 ngx_list_t单向链表 219 h( F( H2 f: I; O% t5 T" ^
$ U3 F U# \; Z7.5 ngx_rbtree_t红黑树 2191 `+ _% h, e1 y) P% [* S8 V
: Y% p. h( o& @6 H6 `4 b
7.5.1 为什么设计ngx_rbtree_t红黑树 219
5 I3 ^8 t2 Y. m) i+ E
: ^& p9 ]# R! a7.5.2 红黑树的特性 220
! a+ i; c7 l% O7 y
* [. o& u* x" A+ K6 I: I7.5.3 红黑树的使用方法 222
# a. N% l6 S+ \; {6 E5 o0 g9 k& I2 y0 G7 w2 w+ S
7.5.4 使用红黑树的简单例子 225
) _) r C9 B# `; f& x' J8 \
$ p& ~/ ^3 c. t" _! U" w7.5.5 如何自定义添加成员方法 226
2 c! `! n% c: V! X0 J& V: y! J# i6 k+ `" _0 D# C8 g- l0 r$ Z8 P& b
7.6 ngx_radix_tree_t基数树 228/ _9 \, J+ R# _
. o' N, V( X: Y# ^! H/ V6 p7.6.1 ngx_radix_tree_t基数树的原理 228 v' b8 ~1 X4 _8 W
& l# B a6 h3 V" `& k* ?7.6.2 基数树的使用方法 230
, F% Q/ N0 a. L' c! b" @/ ~! H& C5 o* B$ {
7.6.3 使用基数树的例子 231
( L$ K4 O' j3 P' w1 |( h' d4 K" q ^4 O7 o1 j" B, e0 D, `: H
7.7 支持通配符的散列表 232. \) I4 R D' f, J, p
& j5 u1 l6 k, O* t+ |7.7.1 ngx_hash_t基本散列表 232! M! }4 _5 e6 q6 Q2 S
# P/ T) s1 V* D: ?7 W
7.7.2 支持通配符的散列表 235
( q' j* h+ ~4 \- t8 S
; @0 n* Y* I: ^- Z9 y1 G7.7.3 带通配符散列表的使用例子 2411 J* U0 }- r* @) `. C% T8 w7 v/ B
4 @- {/ d& v) d
7.8 小结 245
7 @+ m. Q1 c, r" x6 h
8 b( G) n% z" Y( ]第三部分 深入Nginx
, ~. X8 s- W- J( m6 O( E$ P. h3 p: e0 D1 A) [9 @
第8章 Nginx基础架构 2484 ]' ]& Q9 e1 ^- v! p
+ `3 Y7 g4 q: S x+ G- [
8.1 Web服务器设计中的关键约束 249
i: x% o, p @9 j$ i3 g1 u! ?; T. h, j, V1 R1 ]
8.2 Nginx的架构设计 251
/ ~3 A& [7 P6 U. d# J
" l7 o! B# ]7 u7 a' _% V8.2.1 优秀的模块化设计 2519 ]: T7 w3 D: _& h! N, @
5 v2 T4 n7 o1 O3 ^8.2.2 事件驱动架构 254
7 ^5 d6 w- C) y. Z/ m1 S
3 `8 O2 k& j! t, ]( I; r8.2.3 请求的多阶段异步处理 256
% W+ N% Y9 X+ G# P! e! _! Y# R+ J9 J7 o1 W; S2 q( A2 D
8.2.4 管理进程、多工作进程设计 259
1 V4 ]% z. y- [; W4 X0 L9 z5 J. H+ t7 w4 S
8.2.5 平台无关的代码实现 259
+ l- O& h, J- r( X. b0 O
- r' N7 d5 q: j- }7 F) t1 ]8.2.6 内存池的设计 259
8 T( ~8 j: h8 [+ d/ A1 y S- J% n! ?/ b
8.2.7 使用统一管道过滤器模式的HTTP过滤模块 2604 p+ }- p% g2 _. s. L
( C, f4 \7 ?* ]) E2 \0 H4 A8 B8.2.8 其他一些用户模块 2600 c. |1 v9 e# D7 A& o
" N. J# y- X4 d" Y% K/ K8.3 Nginx框架中的核心结构体ngx_cycle_t 260
' [% Y, D, ~" y& D/ h. g7 |; o8 r3 G1 O5 j V
8.3.1 ngx_listening_t结构体 261
: ]1 n6 t) t+ `3 p! @# I) v4 {, O5 p
8.3.2 ngx_cycle_t结构体 2623 k4 F9 Q. e$ z* p1 S8 J- u, X/ F) n
/ Q3 k& b4 A* h
8.3.3 ngx_cycle_t支持的方法 264
! P0 {) F6 C4 Z& \0 b3 J) n. i, v5 {+ }5 ^; v, D
8.4 Nginx启动时框架的处理流程 266
1 k4 ]# g7 s7 n; ~. c9 @$ B5 l6 o
8.5 worker进程是如何工作的 269" F1 z0 y4 k+ R; U' j
6 t* r% D" J0 k6 X8 Y/ Q8.6 master进程是如何工作的 271, }4 m: r. S6 d9 B/ v( v! ~
?' c! u% w! s/ V8.7 ngx_pool_t内存池 276" B& n( |* p, [
# ]% |: }- v+ E6 b8 h" s
8.8 小结 2848 @; n8 b @) }
1 B1 k& j0 h! g* E1 }+ c1 u) p第9章 事件模块 285' q, Z' {& Y0 l3 L, _: r3 k6 Q
& d: F! ~$ R6 c, I& } }
9.1 事件处理框架概述 286
4 Z8 \6 p( z$ M& D+ i& {$ H% c o, t
9.2 Nginx事件的定义 288' R% k( M: W) m: l
* E; J9 i; o; q9 }$ S
9.3 Nginx连接的定义 291( \% j9 b# ?2 K; L# d; @
. Z( U1 [3 t+ b6 M$ p5 f8 Q$ A2 F9.3.1 被动连接 292- `2 V$ ~# ~* `( l# S$ C! e$ A
( P( {5 @2 a1 L( J9 W/ \$ y- t. z
9.3.2 主动连接 2954 A K8 C& P# K6 F" y
5 @2 Y& _8 l1 t0 L4 F( E+ l9.3.3 ngx_connection_t连接池 296) e# c( \6 ] u8 c6 G; j! c
8 V# d3 N4 U. O$ r' f0 M2 }1 C9.4 ngx_events_module核心模块 297! j5 \$ d6 g' j3 V+ ]
" g9 L2 V$ [ b/ m" D: U
9.4.1 如何管理所有事件模块的配置项 299
4 W- [( r; f1 T8 k: L! M9 F& a$ ^4 t& p: P4 O/ h% j0 U
9.4.2 管理事件模块 300
2 E. G$ @3 m% p! m. I2 f) X# `1 k) u1 ], ~/ a" f* c3 Q
9.5 ngx_event_core_module事件模块 302# n- A& V7 V3 I0 o( P0 N
: J8 U7 o: B0 Q
9.6 epoll事件驱动模块 308
9 d3 M( `- E8 m3 `5 c$ |9 z4 U, }! s0 g6 {; T
9.6.1 epoll的原理和用法 3082 z+ g3 _# Q) y1 d/ r$ f5 F, z2 L
) g7 N8 [& W! h1 G6 N; r4 @
9.6.2 如何使用epoll 310
- Q+ K% W1 b% Q% x9 B; \/ h
! h9 @. n9 Z" c" U6 k9.6.3 ngx_epoll_module模块的实现 312
7 `, @9 z9 D& s5 p! s4 ~2 i1 O0 k9 x6 K! c. Y3 y6 ~' p! h2 B6 {7 J0 u
9.7 定时器事件 320
" F3 A" c& v9 E5 j8 r6 ~$ W
- ^' t5 }! H0 ^& `. ?9.7.1 缓存时间的管理 320
# _( Q" X6 A( e( G* |( y" t. b1 a* x" p" o
9.7.2 缓存时间的精度 3233 e. ]0 N: S$ `* n: j
/ v/ r* U' E' F, Y+ B: |: M! S9.7.3 定时器的实现 323
) }5 k0 M$ F" L+ D% ]
0 {+ K1 d$ K$ F9.8 事件驱动框架的处理流程 324; j. r$ F4 d3 j4 Q0 x# z0 Z
% q6 ~8 b; d2 e, f5 l6 V+ L
9.8.1 如何建立新连接 325
& ?3 h5 s' r4 t0 P% z# ?4 r+ T, t6 w- q; n
9.8.2 如何解决“惊群”问题 3274 U& G B3 y" Q: C% w; }
0 w2 ~5 j! h! W
9.8.3 如何实现负载均衡 329! i1 [8 D$ f- Y/ N( w
3 _" x* a3 W% r: p9.8.4 post事件队列 330
# h v7 u o6 N( u- _
1 ?0 ^7 L3 d# P! V( ~" B9.8.5 ngx_process_events_and_timers流程 331
; r E- T( X4 B' d' Y& x
3 x: H, y3 O) @ b5 f9 S1 S9.9 文件的异步I/O 334
) r% R0 N8 W! G2 M! w6 Y; H6 y) D
0 R- \; P, ?/ }( ?6 n9.9.1 Linux内核提供的文件异步I/O 3358 o& |+ k$ R7 b L \) R
/ A( K1 D& k& c1 B& r
9.9.2 ngx_epoll_module模块中实现的针对文件的异步I/O 3378 j* m: T' J7 d- u
% m* x r3 C2 l' @" ]) G s9.10 TCP协议与Nginx 3421 z W+ p, Y' F, Y" i; o
) y5 h- {+ a) V9 i
9.11 小结 347" ^ G$ V# z& v& Y, \ l! D
7 e5 G9 Z# D( J L% y' {
第10章 HTTP框架的初始化 348
! ^" F/ W$ J! L/ h8 B+ V. n' ], G8 t" _/ C, r @. W3 R! o% `8 y5 U
10.1 HTTP框架概述 3496 N" `: w- W. h9 Z
- ], |( G/ E. {; m9 \! V) b3 [5 {* L10.2 管理HTTP模块的配置项 352/ X# t. I& `+ h" I
3 J' }5 K' c" }( e
10.2.1 管理main级别下的配置项 353
0 L# d1 @3 a. \: k- e# A, G, j
7 _+ b8 ` ~5 _9 s0 J10.2.2 管理server级别下的配置项 355% i0 r+ F) U. F$ v U3 O
# W3 n- T% w3 U( l6 q: t10.2.3 管理location级别下的配置项 358% B- [% X) i# P' r5 d0 Z
; R, k1 f& C2 }0 `& e
10.2.4 不同级别配置项的合并 3647 V9 j4 \' d0 a/ S1 U: X4 @# w1 y
/ D( y" K$ V) r: I10.3 监听端口的管理 367
0 g6 \9 K% j6 R: Q
6 y) ]5 d% L& u" y10.4 server的快速检索 370: Z: p) A' W8 s, p9 p
0 K1 c. S( C# z) r) H$ y# U10.5 location的快速检索 370' w; R7 x" t0 i
) i. x& v/ D4 M& ^& K O3 Q
10.6 HTTP请求的11个处理阶段 372: N1 }5 N7 m. P' {* x/ U8 q
' [: \7 N5 y" w: ?7 J10.6.1 HTTP处理阶段的普适规则 374
0 A0 h. I$ a# o" @! e- J) N
7 a& e- D/ { f0 y' i$ K( w6 J10.6.2 NGX_HTTP_POST_READ_PHASE阶段 375/ O6 [9 R. j# f% f3 s8 d; L# {
* s: F1 k5 j0 T8 k' l! q4 M10.6.3 NGX_HTTP_SERVER_REWRITE_PHASE阶段 3783 n' q2 T- Q: o: K4 C& P
* x4 y5 }2 C# C) b
10.6.4 NGX_HTTP_FIND_CONFIG_PHASE阶段 3781 l, g' f( ]4 r! C: d( v b
) U8 a! b8 a7 a! O/ D' ~+ m- f10.6.5 NGX_HTTP_REWRITE_PHASE阶段 378
2 }9 h# M3 g" G+ o6 F( u, y) y1 t _' s
10.6.6 NGX_HTTP_POST_REWRITE_PHASE阶段 379
' M# c1 \1 V t( Y# R/ T
6 L- V) @. d! [ G) J4 N4 V10.6.7 NGX_HTTP_PREACCESS_PHASE阶段 379
+ t7 N; g; p: G, `2 \$ V# U! x7 ]) h* Q) Y, n4 L+ _
10.6.8 NGX_HTTP_ACCESS_PHASE阶段 379
0 j3 J2 d/ U- ^6 e
. O. n( B: Z( ^# j10.6.9 NGX_HTTP_POST_ACCESS_PHASE阶段 380
" g! U$ G3 I9 S& Z
7 v: x+ N+ g! R/ Y% d$ j10.6.10 NGX_HTTP_TRY_FILES_PHASE阶段 380
& V3 L# c2 U; u" X/ ~" R- `7 k6 E
- N- E1 h1 p$ {& ]; b; a$ D* o10.6.11 NGX_HTTP_CONTENT_PHASE阶段 3803 N7 B0 B+ `, Y! L) {9 A0 T
. J0 h% w# y) e8 ]
10.6.12 NGX_HTTP_LOG_PHASE阶段 382
; i# @1 v/ g/ J7 C3 {$ J) j& @/ P7 p6 `! K
10.7 HTTP框架的初始化流程 3826 l( _& ~: Y- \# h# G% E
5 v1 [. v# j( @6 o- W10.8 小结 384
- j3 V% ?" v; [0 s D; R [: ~' N/ n/ i! D6 Q0 E0 m+ h% u& E
第11章 HTTP框架的执行流程 385" j6 B$ |/ f8 a$ q: T5 p# V
! c- G1 \$ \# T, ^
11.1 HTTP框架执行流程概述 386
% U& x2 Y, p% c. v" i" u" ?. y$ G
, } ~) h% @! o' W9 Z3 a$ L: |11.2 新连接建立时的行为 3870 f6 ?9 U& {# ^% j' p6 ^1 V" `/ }
' [: y6 y9 u6 B7 s
11.3 次可读事件的处理 388" _( i( X9 x" L; x+ K
; L: H3 d" z( T0 k! r
11.4 接收HTTP请求行 394! I' m# f; O- Y' W R8 C
5 i. z* w. z" }* l2 U* w
11.5 接收HTTP头部 398, i1 `$ g' a. K( B) o6 K5 m; i3 F
7 e% `8 j; N4 J11.6 处理HTTP请求 400
+ T- L$ v) z0 e+ v- ~$ Z' C5 y( e' Z0 X0 z
11.6.1 ngx_http_core_generic_phase 406' |/ X1 p& p6 l8 d
( Y2 E+ A; N2 r. U& b
11.6.2 ngx_http_core_rewrite_phase 408
7 ?5 _# ?5 T8 ?" e. E, u' N' Q
0 Q7 a- P. A' ~. O7 D$ z) ^# i11.6.3 ngx_http_core_access_phase 409& Q3 V4 `7 B/ u3 ]* F% ^
$ b3 b/ W. z! i. m/ n
11.6.4 ngx_http_core_content_phase 412+ Y. ~1 }) t9 R. N6 T9 } \! G
" V4 v' y t4 q5 ]$ f
11.7 subrequest与post请求 415. Y5 f5 Q; s$ m" L0 F
: L1 z3 I# N) Q# y11.8 处理HTTP包体 4172 V. q$ b, W9 m! z/ @# ^
( F5 j& b& P$ b `0 N. m" E11.8.1 接收包体 419* l" w( K9 d$ _+ p8 t
- { @; Q% T% v11.8.2 放弃接收包体 425
9 G2 ]$ z& T) e& e+ G+ ?* r+ S1 a9 x' F% X9 o$ W: G
11.9 发送HTTP响应 429+ m' _* s0 }. | `
& \. I4 A4 j0 i6 \4 R0 A2 n( g+ t11.9.1 ngx_http_send_header 4309 Q4 ]8 }. q/ y' ~; x* a# C
, h/ ]7 B8 T* N3 F1 K$ |/ T0 _
11.9.2 ngx_http_output_f?ilter 432
" B! a* t/ n& K; s% b1 h0 F2 f& F* i! J O i9 \( V. z
11.9.3 ngx_http_writer 435
# U' K8 G: w, Z7 F. r8 ^# w9 C7 S" T9 ?
11.10 结束HTTP请求 437/ ]. b# Q9 `/ p$ M/ g$ _
6 B3 n$ o! |3 \6 b9 e% V9 i11.10.1 ngx_http_close_connection 438
" v- |. A ^0 v6 I% W+ K/ A( y1 W) L: r1 O( g
11.10.2 ngx_http_free_request 439$ u) U6 z- y; Z9 k; c4 d r
4 l3 s' x8 ?2 A' ]& y11.10.3 ngx_http_close_request 440- Y* S' M+ V. g
4 }$ ]" J( Q9 S9 }( @" e11.10.4 ngx_http_f?inalize_connection 441% `, t0 w9 ?3 ]+ V n1 v5 q
2 P6 F6 s a8 @* B
11.10.5 ngx_http_terminate_request 443+ m" z# H9 p5 J# [6 v: V+ Z q3 v! l
j K( r g0 H4 J0 s9 K
11.10.6 ngx_http_f?inalize_request 443
. H- `1 }+ o0 ^, J% o& L7 u
7 t, _5 D: g5 w; s- @3 \; I11.11 小结 446
) W8 c3 I+ Q- i3 F N
" g3 ^& K! t: z% @; n第12章 upstream机制的设计与实现 447
$ @1 r4 e* L2 J0 E! e' t4 B+ b) Q7 \7 R$ a8 O6 |& h0 W6 |/ i
12.1 upstream机制概述 448
3 g( B* v0 [) S* z) L7 {% @5 z' p$ q9 N, ?' {- h, I. M
12.1.1 设计目的 448
' |) E( C+ ~* Q& k
q5 h3 i8 z. k/ h' H+ A+ N12.1.2 ngx_http_upstream_t数据结构的意义 450
- @. f$ t, f' X z' [- f/ u
0 S. A. m. T5 Z' }- R1 c0 q12.1.3 ngx_http_upstream_conf_t配置结构体 4534 _2 A L0 K, o! n! i
2 B3 {: H, a0 F5 s+ B; j0 n12.2 启动upstream 455" M3 \3 `' p0 c) S
. c8 S6 R( Z. G0 G
12.3 与上游服务器建立连接 457
' O9 }" l! i) A* v* f
0 V! D; u, M( A& C& J12.4 发送请求到上游服务器 4603 V8 Y: V7 e3 w! M+ r1 Y
; b! z5 s' r! L X6 k0 \/ T# S0 r
12.5 接收上游服务器的响应头部 463: I( z# p3 o! i* p7 b
$ j8 T6 j1 j8 V
12.5.1 应用层协议的两段划分方式 463! U J( E! A5 K4 v+ n) D6 F
$ g& Y/ C6 @8 G* I+ {& [7 H( E12.5.2 处理包体的3种方式 4641 A: A$ M a! a' j f6 y7 d
# L4 r' X- N$ A2 Z& G
12.5.3 接收响应头部的流程 4652 s f+ B2 G* U: F; O# h
/ }1 O; d7 E7 f$ t# x5 C
12.6 不转发响应时的处理流程 469: m5 D, ]) B# j6 r- S% e$ z: m
) ]6 \) H3 p+ k1 t: A3 p
12.6.1 input_f?ilter方法的设计 469
( e# m: Y5 H7 q3 W& k# k- u5 h
! }* T, h) T% C7 f+ S6 G5 l12.6.2 默认的input_f?ilter方法 470
, G) o/ L& J3 e& V# t2 \2 T* M$ u4 A9 o0 Z$ x& [: m
12.6.3 接收包体的流程 472* e; x( F- s" q5 g5 d( U$ F+ Z4 z$ K
2 b* i- c6 [/ Y1 r( M, }, Q
12.7 以下游网速优先来转发响应 4734 f7 h( ?$ ^) j' G
: |! G0 o! Z! i; ?! B4 ^7 _. i) ?0 s
12.7.1 转发响应的包头 474! }, b$ g* K2 \% r
6 |: Q; a0 S5 ]7 e0 W9 O( O, }
12.7.2 转发响应的包体 4772 w: I8 K4 z$ G# Z! _" N
/ {/ T" n5 r$ @1 L, G2 v# Z' Y& j+ o12.8 以上游网速优先来转发响应 481
- S2 k# d8 B: Q5 P, I; s3 @, u D; |7 |2 e. o R8 Y
12.8.1 ngx_event_pipe_t结构体的意义 481
$ H# M" b- w. b2 A# e1 B( h1 K) j4 ]0 r( l! f
12.8.2 转发响应的包头 485( B; w" d3 R! J* u3 s
+ l- q/ q7 I4 @+ R2 I
12.8.3 转发响应的包体 4878 c# c" f' B: o- r2 d4 h
5 r" ~2 I5 U) }$ c S
12.8.4 ngx_event_pipe_read_upstream方法 489
3 {( P) V8 ^. A
7 w5 }- G4 @0 _/ F* S$ B, \! s4 l12.8.5 ngx_event_pipe_write_to_downstream方法 494
3 M- O' w' b2 B" t8 d+ o3 E( F( ^" C
12.9 结束upstream请求 496
/ i% n* P: W7 v0 b+ x# C+ W, K" |) }6 A& M' }1 R% C
12.10 小结 499
: y4 ^8 v$ ?- }" M/ o! }% j! D, b& j. q# h/ y( k
第13章 邮件代理模块 5004 r [1 ^3 ^9 X) c& d
2 X8 m# l# B) i$ e: Y13.1 邮件代理服务器的功能 5002 x: S. a6 ?0 r
; i, q' T7 \' X: s. @
13.2 邮件模块的处理框架 503
$ v* _# t: G$ ^ z! l) t* b: H
# e# @" C- l- E, T13.2.1 一个请求的8个独立处理阶段 503' u" n0 b4 a1 B
6 G# O# y6 |# D7 H: q9 `, N3 z13.2.2 邮件类模块的定义 504( G3 C2 l& P* N4 q
' T! ` t6 W* s; a) j; R13.2.3 邮件框架的初始化 5064 ]0 |) J/ j5 c$ x/ x0 i' x, H
3 @) N3 s1 @0 g" r3 f8 o% O13.3 初始化请求 506" T% F8 S g& g0 o& c. B* i1 R
9 f4 B+ x3 C7 \' i, C7 [5 d13.3.1 描述邮件请求的ngx_mail_session_t结构体 5069 S1 h- c$ \1 q4 D3 }% D5 Q# z: H2 O# O
0 {( r% L! k0 V
13.3.2 初始化邮件请求的流程 509
3 c+ Q: w7 Z6 u) Y, K0 d- a6 X
& `& `7 n% y. @/ W; Z13.4 接收并解析客户端请求 509( U c# p% d r- ]" V6 q: |: b
9 z3 @7 i! \0 C& z: Y
13.5 邮件认证 510# a4 n) l. A8 E/ _2 ~8 m. y3 ^9 ?6 a
4 \$ D O2 A1 d13.5.1 ngx_mail_auth_http_ctx_t结构体 510
" p4 Q1 V+ d1 d
4 y! b1 |( ?$ E! }, r0 `( u; |13.5.2 与认证服务器建立连接 511) I! H u& `$ a$ G
2 g+ v& a' E4 q. m: q
13.5.3 发送请求到认证服务器 513. f- A$ T- Q& e3 k- p
0 \2 y0 l6 i$ ~13.5.4 接收并解析响应 514
5 N1 d" E, f/ i U1 {: T# B4 j
13.6 与上游邮件服务器间的认证交互 514
6 X6 C, e# @. F+ d( @& c/ n, g1 i! e2 ?& C$ E. h
13.6.1 ngx_mail_proxy_ctx_t结构体 516
. c, q4 {- F, P) ?+ ]! }" U K& _: q
13.6.2 向上游邮件服务器发起连接 516
& [* @3 J5 s8 b& O$ D
2 |" h0 t* h: D8 a; j3 b13.6.3 与邮件服务器认证交互的过程 518* T+ q3 \5 q- W7 H; Z
: K7 a: \1 y8 r5 |$ u2 D
13.7 透传上游邮件服务器与客户端间的流 520
# J/ I$ K4 x' M1 e3 T4 U
3 v5 s5 K7 e& U$ ?2 P/ v13.8 小结 524
" E8 p0 p: X8 M D! o! E" I6 o0 z
2 G* ?: f0 J& S: J0 i第14章 进程间的通信机制 5259 P2 L6 l W+ h. R1 P
5 a* w' g8 a ^9 ]14.1 概述 525" k( k0 r, L/ s
! W# B& C) |0 ]. `' Y% X14.2 共享内存 526# G" K; {+ P& B
5 o6 t' i- N6 V2 ]/ g) B' j; @14.3 原子操作 530
( u& K0 F. A/ x6 [* y& h/ G( O. I' e- L9 @2 {
14.3.1 不支持原子库下的原子操作 530( S2 J2 A* `$ c; O
, g A+ G) T/ D | E
14.3.2 x86架构下的原子操作 5312 ^/ d. a/ _; E3 B# e5 ~: g, [) C
, A$ l% ?1 p6 l5 R$ e0 d5 D' l/ m14.3.3 自旋锁 533
1 p7 e- _4 u/ ?, L$ G, g, E5 |( Z; P/ ?) r
14.4 Nginx频道 535/ X( q ?' s3 b8 \) m
* A2 U- n$ D& n3 a7 ]14.5 信号 538
+ Z3 x* `+ \, o4 x/ \3 v
: O1 D7 k) L# l; A14.6 信号量 540
% ]; g0 R1 L N7 a5 { Y( S' p6 Z/ Z: _3 m) s
14.7 文件锁 541
( D1 Y& [ z. \, z2 w7 Y- k* N* k# }1 d+ {/ P- d
14.8 互斥锁 544, K5 E. \4 G! X; ^+ w' a7 M
% [! z Z9 X# M% M0 m14.8.1 文件锁实现的ngx_shmtx_t锁 546
" ], A; ^, Z9 \2 K' @
- c2 P# s5 `# S; Q( P' t& o14.8.2 原子变量实现的ngx_shmtx_t锁 548# F, W* a4 y5 k+ `# c2 o0 {
+ U. ]) C% E) M1 I8 q: e1 R2 u
14.9 小结 553# C. }) \8 z$ x6 t1 k! u A& O6 Q" D
; a, V% h% l4 _+ h: H+ T第15章 变量 554
) p- E. i. x. Q A, V6 E$ N4 O4 }5 A# p8 d0 K' Q+ o4 Z
15.1 使用内部变量开发模块 555
' R8 a& A( `. [+ H, C8 Z
0 X! J' c& V( v% w8 ~5 N15.1.1 定义模块 556
7 G; k1 k- r: t5 J+ y, A* G8 R' ^6 E1 [" k0 ^2 v6 ^3 F
15.1.2 定义http模块加载方式 557
7 N5 @6 l n% v
+ O9 L( u2 X4 Q/ L# b% y15.1.3 解析配置中的变量 558
% E' V' L* a8 d( v8 y( R2 x. k% w
& z4 Y' b3 J9 C! n" J9 u15.1.4 处理请求 560
5 y! i; e1 o- }2 x; ?. |) M7 b
; Y4 ]0 W5 l5 D7 @* E" f3 {15.2 内部变量工作原理 561. i6 b, k5 ~8 y7 `
: @& h; i" i- V, c; ^
15.2.1 何时定义变量 561% n3 s" P* r8 i+ E& H. q. p3 P' k \
2 J' a% Z1 _7 a3 e
15.2.2 相关数据结构详述 564
0 \+ B1 x+ x5 ~( B* K3 L, l( m- Z2 H9 d. m
15.2.3 定义变量的方法 572
) W, D @5 J& o, u% g1 W U) Z0 p! p
9 K2 E, l& e# ]5 N6 N$ ]% x5 Q15.2.4 使用变量的方法 5729 C4 s' E6 H* L9 k
, v5 O1 G$ O/ F8 B9 d4 ] y6 v15.2.5 如何解析变量 573
0 v3 L S! q# x5 z; p o/ q* N8 _3 L) x+ ^
15.3 定义内部变量 576# [; X! Y1 K8 Y7 u2 t* r4 w) C& n: K
# ?% y- U% b B. X* s8 e8 k- @. _! x15.4 外部变量与脚本引擎 577
t" Q8 Z7 ^2 N% s) y- d' |( V0 ?0 X. t m# D6 U: E8 {
15.4.1 相关数据结构 578# F7 P. g S# M" M1 ~
7 I$ S$ |# T9 [: U
15.4.2 编译“set”脚本 581
# g v7 A) G$ b' H- Q( R7 R& ?- B! h y9 F2 n
15.4.3 脚本执行流程 5863 L/ _ \9 J5 W4 W0 l2 i- T
) g9 ?' l7 ?4 c+ W$ I: H5 E! y
15.5 小结 589. h* A: G, e' ^' A* A
% E) @& O2 B' N7 G* Q6 y: ~3 y第16章 slab共享内存 590
5 N' u4 N2 v" N- ?$ J7 i% w' L) N% z/ n: h+ @$ ~8 ^5 F
16.1 操作slab共享内存的方法 590
0 ^5 U, J, o! m/ B
b7 c& u( S/ l5 L3 F/ _# @9 p16.2 使用slab共享内存池的例子 592
3 C5 \1 I# G8 k4 z/ D6 b$ `7 a8 L9 w' ^% N
16.2.1 共享内存中的数据结构 593
2 _. P: s+ ~/ h7 a+ M$ |
7 ^4 n3 }. _1 E" ]% R! i16.2.2 操作共享内存中的红黑树与链表 595
- k# q) ^/ l: e s' M
0 T4 q0 o C0 Q+ j16.2.3 解析配置文件 600
- U7 o- m) N, R1 Q6 l
- X4 g, y2 j7 ^$ D/ f16.2.4 定义模块 603# }+ w, h' P# n, G
0 V' Q( B. ` z `2 [$ H) C0 C' X16.3 slab内存管理的实现原理 605
- f2 `( a/ L- k! Y: t3 |
% \, x$ N5 T1 M6 R16.3.1 内存结构布局 607- Y1 f$ g" v) q
. M3 e+ r" `% z0 b( ^% i( z16.3.2 分配内存流程 6131 ?3 Y0 K/ t) R! T+ `" C' E: f
% Y, v4 E/ w5 j3 ~7 W z/ f. |
16.3.3 释放内存流程 617) X2 e5 C% K8 F2 n8 J2 }
5 Z8 r, F% F" X L3 D16.3.4 如何使用位操作 619' F" \7 O; O- ^& ^/ r8 G
' a- \' i( ~) B4 _3 E1 P
16.3.5 slab内存池间的管理 6246 I9 t/ z; i' U' t' v
% q- w$ P. l; y: A7 k! ?16.4 小结 6243 M! k6 W; B' s. o8 ?! l! z1 a
3 G4 {& b+ Z( _
百度云盘下载地址(完全免费-绝无套路):/ T( z" I& I7 [) ?. i
0 @" y, H% e E* C; V |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|