28回答

0收藏

深入理解Nginx:模块开发与架构解析(第2版) PDF 电子书

电子书 电子书 2527 人阅读 | 28 人回复 | 2023-09-01

Java电子书:深入理解Nginx:模块开发与架构解析     格式 pdf 电子书 PDF 电子书 Java吧 java8.com8 c( \! e) ~6 X7 p, }

- c1 Z' k) B4 U  L/ d( p; H9 Y6 v' Z& b
编号:mudaima-P0137【Java吧 java8.com】5 S- N  ~% Y0 G* B0 \

: m( ~( b1 Q0 m6 i9 E
& G0 b  C$ z# a2 M; A# M8 H0 O7 {, H5 ~/ v2 a2 ]& f" C
Java电子书目录:部分 Nginx能帮我们做什么
9 k% E3 u5 W7 l
* x! W' W/ B/ L第1章 研究Nginx前的准备工作  2
/ G$ V- W* u  w0 R) [( g
5 C1 H( D3 G% Y/ f' a1.1 Nginx是什么  2* w4 o7 T; l+ A9 u( Y" B; a; Q

4 M$ b/ `0 ?! E1.2 为什么选择Nginx  5( `' T8 F* X5 R3 G3 N, ?

( y' F7 D' I/ `- D! V1.3 准备工作  7
. X. Y. B  O% h) `% n0 E; s) a$ K$ j1 A  t
1.3.1 Linux操作系统  7
7 T- S" R6 O: O" [& j( M1 Q! b
, D: Q# Z8 V2 D& L( ~/ J( v& S$ a1.3.2 使用Nginx的软件  7
: o; |; o, p/ L% M0 X4 O$ V( R( G# y, L% ?$ x( }
1.3.3 磁盘目录  8
8 `; d6 m* S4 d& K% y, M4 @0 D
# V9 x. U: z. e4 m- t5 Q1.3.4 Linux内核参数的优化  9
! }5 P9 U' P: R& F3 O  b$ Y5 ?& Q- W# v1 g7 m* r4 d. A
1.3.5 获取Nginx源码  10
& F" [- M' H/ H. A& K' S  m" b. D9 |" _1 |* U8 N/ I0 x, ]* S
1.4 编译安装Nginx  118 Y3 L) C; y5 c  R, o! }
4 j6 u0 Y% ~( y& |1 y& |
1.5 conf?igure详解  11
7 M+ H" j& ?1 b; i5 S" P7 |; U' b! M( I( U5 E) c3 \3 P2 H
1.5.1 conf?igure的命令参数  11
+ z3 e! n. v! W: [0 ]  n9 Z! o$ o  e7 k
1.5.2 conf?igure执行流程  188 q& r+ p3 M; h5 v& l0 q, l

" `6 l, c, v3 Q; w/ p1.5.3 conf?igure生成的文件  21
! l! w6 O, [& Q7 a0 q( O9 p7 D9 R& U
2 y; u% G& K# U- M4 q6 X" ]" h1.6 Nginx的命令行控制  234 J2 _( |, ]  R

) U% `: f+ V  @, B5 N( A- }1.7 小结  27
! L2 U% K% q+ F' b4 ?6 F, g4 m3 S% w% c3 S1 c
第2章 Nginx的配置  28
/ Y( W) m+ T7 v) z2 P+ R+ t7 C; i" K' g3 [6 F+ Q, a
2.1 运行中的Nginx进程间的关系  285 X4 u, f$ |0 m/ ]
5 w" R/ ?- k8 l  @" r  l
2.2 Nginx配置的通用语法  31
/ p6 w# U6 P- p2 f% C, v5 ~) C1 N
2.2.1 块配置项  31
$ B2 o) O% a6 L% o" R9 N, H5 ?- W7 O% p+ E# e9 m0 K
2.2.2 配置项的语法格式  32
0 h$ K, U( d& \) o0 q
) `) d5 Z$ p$ K7 D2.2.3 配置项的注释  33
/ w7 J  @8 Z0 T5 L+ I0 k3 K6 E) }& F5 K& X
2.2.4 配置项的单位  339 [% E' Z/ T- Q, G- C* f+ A( E
# P6 i* q9 C8 t  C6 Q2 j% s! ^+ \
2.2.5 在配置中使用变量  33
1 h1 p" Y  v! v3 s# x: r+ |) K. v- @# \) g% l! `
2.3 Nginx服务的基本配置  340 y, `' j- N9 x# a+ L

9 n6 r+ a* a" E4 L2.3.1 用于调试进程和定位问题的配置项  34% s5 N! @. T4 G  K) ^: t! A' x- z( t

& r: j" h+ Y- U) q2.3.2 正常运行的配置项  367 L( d7 G' R4 A6 P3 i) e

, c  u8 X4 {% M8 j/ m: H2.3.3 优化性能的配置项  37
7 W0 w9 o5 h. t8 ^6 p7 {
4 Y# c" t/ }( j) F7 c* R% V2.3.4 事件类配置项  39/ u- x6 ~* M- x0 k3 g6 O+ O$ [
; g: g( G4 t3 @7 _6 R
2.4 用HTTP核心模块配置一个静态Web服务器  40
1 J: M- o0 }1 W" W
' I3 x1 v" V6 r7 r7 [7 G2.4.1 虚拟主机与请求的分发  41
: q. A1 E% m) V3 I7 Z  i, O3 D
3 [: v' ]4 `9 z: x; `2.4.2 文件路径的定义  45# c+ e+ a' L( k2 T8 s$ D+ ?& r  e

( E& N6 ^  z& f- J% z8 f1 c7 `2.4.3 内存及磁盘资源的分配  47
, U& H' e9 m" Y* o# ?+ z" l! Y' n* Q2 Q# d
2.4.4 网络连接的设置  49  o- Q8 g5 V  V4 a0 h" R7 k

/ U4 n$ }1 {" d  i6 U" m. p2.4.5 MIME类型的设置  522 p, \7 ]% R) _" z) l

8 K8 t8 I# m5 x4 V7 d6 P2.4.6 对客户端请求的限制  53) }2 ]! ~# a3 C

% o( }& ]( Y8 Z9 w/ c9 N7 q+ W2.4.7 文件操作的优化  54
4 a* I) L; _' x0 q! _- j% e$ K% y1 l7 ^6 \+ e4 {; d
2.4.8 对客户端请求的特殊处理  56
; s6 n& b% G- `! `7 w
* n/ z1 T( s3 u: Q/ Y6 D2.4.9 ngx_http_core_module模块提供的变量  577 ]3 f8 ^0 r3 O2 |

" o3 b1 a' ^' p2.5 用HTTP proxy module配置一个反向代理服务器  59/ _, ?! E9 c, a9 k3 _* ]$ Q0 @

! x! t. g  Q- Y0 |! j$ K2.5.1 负载均衡的基本配置  61$ s. P& I. X3 H$ n6 S6 O

1 S3 N8 J9 r8 v; K* s* |  E2.5.2 反向代理的基本配置  63
& D  z; ^) B: t: ?, ]+ z* C$ k- u4 }9 c5 z+ N
2.6 小结  667 n! L5 O# F' W: N' h+ a- k
# G: k* T* L& \& j" Q8 C2 H6 T
第二部分 如何编写HTTP模块) W0 j8 @  M7 _
9 u+ P: `+ G' `* R
第3章 开发一个简单的HTTP模块  681 J% m# K2 @. i: F2 Y  z' H# U: r; q
* j  m8 _- I9 [% B( @( i1 q
3.1 如何调用HTTP模块  68. j( P! a  Q6 _  p/ w) c# j/ Y" D
& g& }4 f, [6 S
3.2 准备工作  70
  @; {" D. E$ B2 |- t8 k' |* r
/ s  U6 G. |8 m+ u- H3.2.1 整型的封装  711 K8 x, I" B. O2 A+ |2 K, Y
9 z$ M% N% ^) P
3.2.2 ngx_str_t数据结构  71
2 a( ?+ ^1 P3 o/ K
: a2 ]  ^3 \; |3.2.3 ngx_list_t数据结构  71
3 M: U. T1 i0 N6 g5 |- }/ d0 J3 J  P, q: i9 h& |5 H9 w$ ?
3.2.4 ngx_table_elt_t数据结构  75/ h% n8 I; m" W

7 U* K  q' K: ]6 K  t: a3.2.5 ngx_buf_t数据结构  75
1 m4 l* Z% J. Q/ c8 i; \. {& ^; x% }+ _( J4 b, G' k, a" @2 m2 k/ D
3.2.6 ngx_chain_t数据结构  775 e6 a% u& l9 c

# S0 A9 d4 y! N# {% i3.3 如何将自己的HTTP模块编译进Nginx  77
& o2 L; z5 Q  k1 K7 C3 S
/ m  a5 I6 O0 u' s1 O% F. O" X3.3.1 conf?ig文件的写法  77
* A! n7 F0 o8 y% P! w/ C
) Z/ u0 i6 n5 K1 o# Y8 K" b3.3.2 利用conf?igure脚本将定制的模块加入到Nginx中  78- [7 M  ~$ B/ m
0 H" e, D# V' Z
3.3.3 直接修改Makef?ile文件  81  k: ?9 w- O" y
4 a& W! X3 e9 j2 c4 R# o
3.4 HTTP模块的数据结构  821 [9 j! q  S8 g' P$ {

% l( P$ R1 J) b$ X, X3.5 定义自己的HTTP模块  86
2 D3 `/ \0 w* C! J" r" e- ]2 N6 u; m
3.6 处理用户请求  89" S% Y! }, }  D: U6 _0 q0 U' w3 s; A) F
# c) B6 G' n, a9 a/ a
3.6.1 处理方法的返回值  89
2 Z( |6 C1 C2 ]0 c. T% H! o0 o% C. R* t6 z. B* B; Y
3.6.2 获取URI和参数  92$ @+ z0 D9 o) V! S9 B2 W
$ b' N. D, S/ p+ j6 H# H
3.6.3 获取HTTP头部  946 H: R4 ?+ w1 o" v0 d% j1 |: {

7 m( q0 t8 r/ T2 o( N9 F* E5 I3.6.4 获取HTTP包体  97* X% v5 U6 X  _! n" B- j3 c

* H& _+ g. B0 C% b3.7 发送响应  99( s5 J# U  F& b: b

& O2 S2 y! X6 ]0 ?, [' |3.7.1 发送HTTP头部  99
  z8 S/ }( S" U, V
( ^$ O" I9 e( \* k9 t) d3.7.2 将内存中的字符串作为包体发送  1017 x' }2 u! [% V1 i4 g8 ^: b& ]

7 @3 e/ L5 \' u- x, t1 c3.7.3 经典的“Hello World”示例  102: S9 |7 r1 c9 m# {
" @  i9 @: |) f% a& a
3.8 将磁盘文件作为包体发送  103$ Z1 x" J, {, e# k4 g
9 f- }2 R0 w4 F/ W% ?4 o4 E7 @% |' E$ n
3.8.1 如何发送磁盘中的文件  104
2 G) \) I; P0 A3 k( c) I
( W+ \; s( C4 D' a: ^3.8.2 清理文件句柄  106
; K: P4 o9 F+ j, Z
3 e& t$ o& v9 S5 n! A1 y& V3.8.3 支持用户多线程下载和断点续传  107: Q/ |9 p$ g5 j- p3 f. q

) `6 j! e+ U* z! d$ }3.9 用C 语言编写HTTP模块  108
6 h1 a9 u9 h  \/ U+ d3 J8 ]% }) [; v. f6 X9 n
3.9.1 编译方式的修改  108) Y/ r, k1 M; U6 f* F$ I- E

" B$ @# z( K6 Y3.9.2 程序中的符号转换  109' S3 w- b9 Z) W; `7 X9 ]

4 ?  E  N* B0 X# w3 X; P  T3.10 小结  110
+ @2 V2 f0 T' D) i4 g' ]' @0 W
- S# X( Y0 q$ M2 _1 h! Q# S* `第4章 配置、error日志和请求上下文  111# }" Y2 a& H* X% Z+ E0 S& Y

# G) P% o6 L/ t' A* j) Q8 W0 Q4.1 http配置项的使用场景  111
4 l$ D, Q+ c' a0 `. R+ S6 [/ J9 r  r4 ]+ x" T
4.2 怎样使用http配置  113
: F# p  o5 U" h, c
0 F. _9 o7 b' A9 A4 d4.2.1 分配用于保存配置参数的数据结构  113
) m8 n' M+ Y& x! t  N
9 N. P7 O5 j6 O( x& V4.2.2 设定配置项的解析方式  1152 @4 v7 D5 I$ \) d
6 K8 d+ Z) d2 {& p' h; k) ?) X
4.2.3 使用14种预设方法解析配置项  1218 t+ [/ F/ K; l7 [* P
7 D2 N' e# U/ a8 R( Y
4.2.4 自定义配置项处理方法  131
9 R! o% E" e0 }% j/ D: x
* F9 ^' I  ?' F) i8 J4.2.5 合并配置项  133
  A9 g- i+ f& R/ b+ ?7 j7 z! }" F# E7 y" T/ U2 r' H0 [
4.3 HTTP配置模型  135
# k, U/ Z* H, ^! K# }4 b1 X2 y" ~9 G/ K
4.3.1 解析HTTP配置的流程  136- |. V2 S% S( q7 \( K
; |" B) N. R% a% L( p
4.3.2 HTTP配置模型的内存布局  139/ J0 Z5 E4 n4 [. \4 M6 C8 N
3 X( r" n9 n$ e; h
4.3.3 如何合并配置项  142) x. [- ~0 W+ q( u4 _; m
5 J) h3 O: H% J. B
4.3.4 预设配置项处理方法的工作原理  144
$ V# g7 w2 D. L/ L# m8 K" J6 S9 a# q# b0 x+ k' H. H
4.4 error日志的用法  145
2 a0 e% b* y5 m  x& d5 |$ k+ R) d# x5 A. w+ M
4.5 请求的上下文  1491 X. M. a' R3 [; E4 V

: O; `( g7 u3 g4 Q" h4.5.1 上下文与全异步Web服务器的关系  149
6 ?  s. V2 ^# ?6 T  V8 K
! R3 \0 t: F7 V4.5.2 如何使用HTTP上下文  1511 [6 M: u% K6 G# f! {3 H# N" l

% S+ I) }- h* ?9 _1 t# q* J4.5.3 HTTP框架如何维护上下文结构  152  [: X; B$ ?6 W# q3 j0 h& ]

& H/ p8 H, ]3 `- w2 X! O9 B; z4.6 小结  153
- l7 }) [! A9 B$ j7 J! n, F( M, k6 W1 H# Y9 I+ j
第5章 访问第三方服务  154
0 S/ k3 r! V5 d; K" S" P3 E8 ?# Z6 S) A* x! u8 W+ Q
5.1 upstream的使用方式  155) a3 E+ @' z% [# b/ N

8 t5 Q- B5 E) C8 X5.1.1 ngx_http_upstream_t结构体  158, I- m7 w; X5 r$ r
  K3 p( h1 s/ m3 ^* E; Y9 s
5.1.2 设置upstream的限制性参数  1592 [- p5 ]6 Y* a$ `3 y, \. b
# u8 m6 e9 l; J. d8 _5 U
5.1.3 设置需要访问的第三方服务器地址  1601 S- S, I4 w9 j6 D

% m( P2 k4 B& ?2 C5.1.4 设置回调方法  161
  ^% @- W+ S3 A7 U1 I# a5 w
8 c+ d* ]+ V. T: l5.1.5 如何启动upstream机制  161
4 P6 r' e1 I& e2 V* c# _. J+ v* M
( ]' B. u. U2 p/ ~5.2 回调方法的执行场景  162
8 _  V1 v3 R& u: K+ O
; z, a( z0 t( f6 d5.2.1 create_request回调方法  162
! n  s( x; s) w5 l0 c7 V, N3 J; `6 q' M( R0 M: Q
5.2.2 reinit_request回调方法  164
* `  C8 u/ [$ C5 j9 F8 k# T
1 P% |8 v/ @% g+ U! I5.2.3 f?inalize_request回调方法  165
8 W* F9 t* Z7 k! I7 r/ R0 l# B/ g7 L- b
5.2.4 process_header回调方法  165* k/ e/ N4 l& K4 @4 l
0 E! M7 N" I& S' D- i* w
5.2.5 rewrite_redirect回调方法  167
6 X9 H) R6 C& c) ?0 w" E8 I, _" Q. j
5.2.6 input_f?ilter_init与input_f?ilter回调方法  167' O5 @& a3 z6 t* C7 w( @3 K9 j

- @- Q8 g/ }' {0 \2 \+ X5.3 使用upstream的示例  168
' I8 r* O) i1 V  ]2 D5 S
" O6 E) v9 }9 t5.3.1 upstream的各种配置参数  1682 C$ M! J: m4 _* J. N

( c& S: T* g( T2 Z1 e5.3.2 请求上下文  170
; e- m) X9 N, v4 r
5 U4 a$ ~* S! u1 m5.3.3 在create_request方法中构造请求  170
/ h( ^$ t' o# F# r8 t+ q, [
4 L6 q9 m' @- a6 ^8 [5.3.4 在process_header方法中解析包头  1713 \+ z* v  u# a4 W" c1 K% q  p  G% h

- Q% e, D; o) [* n1 d& l* h5.3.5 在f?inalize_request方法中释放资源  175
$ L* x$ s% D3 @8 K. C2 i
: F4 \! E$ O  E% Z5.3.6 在ngx_http_mytest_handler方法中启动upstream  175" i$ K, ?2 S+ b  ~
3 o, i  ^' _8 L
5.4 subrequest的使用方式  177( a7 G& N( W6 B4 R
" O1 \! b* F+ y* @  y! M
5.4.1 配置子请求的处理方式  177
& [3 h7 S& ~8 k, `* b# R7 Z# a# p- A" p# ]
5.4.2 实现子请求处理完毕时的回调方法  1780 `$ h1 ^2 k3 ~" Z6 I3 e
+ ]; v( H- D" k# g
5.4.3 处理父请求被重新激活后的回调方法  179. T* R8 V& X3 i! f- N

* Z# J; N4 n: W& M7 `9 i+ s2 ^5.4.4 启动subrequest子请求  179% U* Q1 Q9 z4 k" Q. `1 L* |7 U  h
" L' S; O7 T6 e' c: ~, d; i# ^
5.5 subrequest执行过程中的主要场景  180
5 p- D2 ]5 G* K  x) P( |! s6 S' x7 ~% w
5.5.1 如何启动subrequest  180
$ k: b. U$ X# {4 D7 V9 ?6 p" w4 L' ^
5.5.2 如何转发多个子请求的响应包体  182
: S% L5 I8 L- S; G+ S" t) n- r" ~' U$ y. l1 z
5.5.3 子请求如何激活父请求  185
; F) N5 e. D8 Q- y  }) Y
+ B- V( K8 v8 I5 l: n6 @2 F( S& j. c5.6 subrequest使用的例子  187
% J( `, l7 V3 x5 v
( G4 o7 {  N1 {, W4 s5.6.1 配置文件中子请求的设置  187- L' U6 s4 f. f) k

- W8 {# x" s6 a/ d# K5.6.2 请求上下文  188( p9 y% q& i; `: ^
& @" H, W- {+ z1 F; r! b
5.6.3 子请求结束时的处理方法  188
3 v1 M* d! m# X3 U4 }7 b* h0 ~) H6 t$ j
5.6.4 父请求的回调方法  189
4 N$ U1 @7 U  ?
5 T: d' A  ?; _4 S- o# q5.6.5 启动subrequest  190
3 n8 F) D" }/ V
, O' e8 R5 Z5 ^0 u8 w' j$ U5.7 小结  191
! E0 x5 G5 x+ A; o4 Z  d9 u$ l5 b; P" X' K
第6章 开发一个简单的HTTP过滤模块  192) R/ R0 `* O! j6 [( k1 [3 [% }

- u7 U# k7 [' h( G3 Y+ f  p6.1 过滤模块的意义  192
; z  m7 @( k4 ^7 K. t) g
0 c( W  d( j; Q# P. ~, @* P/ Z6 F6.2 过滤模块的调用顺序  193! k) V/ Q" l4 I4 T! ~: l- l3 c6 I

6 V. H9 y0 l. Y4 F) X6.2.1 过滤链表是如何构成的  194
1 }; I% D, ?. h: Z# R5 c
& F. X) F; _2 {6 J6.2.2 过滤链表的顺序  1962 ]- g/ v( S8 Z" u+ [

; }) H$ o' |5 M! A6.2.3 官方默认HTTP过滤模块的功能简介  197
0 J! ?0 V. P; D& q' a6 Q2 X7 [- g9 v
6.3 HTTP过滤模块的开发步骤  198  w( S1 p4 j1 x9 B/ o4 \- x% {

& t. b; {3 I) v) W6.4 HTTP过滤模块的简单例子  200
% k5 g, S% T, k' V9 P) V4 A2 s% f" ~! `9 M8 B4 p
6.4.1 如何编写conf?ig文件  201
8 a" g8 m) v8 T" Y  B
+ F8 M- J; H$ N, I6.4.2 配置项和上下文  201
3 r; @4 Q0 F' p" m- \* `, W7 w2 {9 `+ s% R8 j
6.4.3 定义HTTP过滤模块  203
5 c0 c. i1 n; K% g6 J- @2 c( F/ s6 i8 L# r, T' D
6.4.4 初始化HTTP过滤模块  2041 B" \; ^& i; M7 `1 Y
  d; n9 H% R1 C
6.4.5 处理请求中的HTTP头部  204
+ b2 m/ z$ r: w: H$ W
7 c9 V6 \& u9 ~& w& i" N6.4.6 处理请求中的HTTP包体  206
, D; m5 Z6 p) g& e
2 |" o+ |, B! m8 T& H1 d6.5 小结  206& J! {& i6 T2 s% Z& }9 \

7 W; V$ q* A* T8 x8 W9 @) D第7章 Nginx提供的高级数据结构  207- Z8 q5 m8 A3 y, }/ s4 t

. A* x0 G, D9 H1 k- q  _7.1 Nginx提供的高级数据结构概述  2075 B" @" K% o* t! F
0 K: I+ B6 s3 _# K
7.2 ngx_queue_t双向链表  2090 u. K! x8 N* @1 z3 W" g5 \4 N

. _( h! i8 I1 K7.2.1 为什么设计ngx_queue_t双向链表  209
5 L' h9 w& O: f( ~2 V% d" A( o* X3 @* `: x$ ]4 J9 q0 `
7.2.2 双向链表的使用方法  209
9 }0 e2 i. I; P$ `. x7 \
- N+ f/ k+ {: s2 r. w4 X7 a7.2.3 使用双向链表排序的例子  212
2 j  \8 r7 q/ m9 N* f! C
, ~1 M3 Z7 D* n7.2.4 双向链表是如何实现的  213! B; l4 r3 I7 H: F2 B- u: b: f' [" C3 @# o

( D4 k5 B; V) k6 R. x7.3 ngx_array_t动态数组  215
6 B; k" n! n8 p/ i5 s4 J# a0 t/ e% M# o' N8 \# D
7.3.1 为什么设计ngx_array_t动态数组  215
& o: R. c& k( |, U! J5 Z9 |' M5 d7 x' `
7.3.2 动态数组的使用方法  215
1 w" d; t3 n/ S* Q7 ]8 ^. N! ~) q. h" j! `
7.3.3  使用动态数组的例子  217
" z2 b5 k' ~% k5 m
( j$ ^" a! n" Q% Q+ n; d, e7.3.4 动态数组的扩容方式  218, Y, L6 [4 T/ H/ D. z

( U+ k. c# z- s( z7.4 ngx_list_t单向链表  219
3 r0 G2 r0 ~5 F4 w* L& P, g
/ c' ^4 s7 R- y) B7.5 ngx_rbtree_t红黑树  219
+ @8 h- h: s& C- P" z$ A: \3 {$ E, f- S. l- k  Y, _7 }6 _
7.5.1 为什么设计ngx_rbtree_t红黑树  219
# Z9 k: g, }6 L+ t' `  A8 P4 w! V( e& J/ [- E. y9 q- Q
7.5.2 红黑树的特性  220
7 \6 L' @0 X3 P7 |- U) T1 ^2 N, R! f  c3 e
7.5.3 红黑树的使用方法  222
2 E" L6 l6 T6 ?9 [" h7 C+ r* ~* q) z. _
7.5.4 使用红黑树的简单例子  225
  Z8 ]! o3 Z1 r9 l2 Y6 p1 p# L. f6 R# ?
7.5.5 如何自定义添加成员方法  226& s7 J, C! {% C+ K0 ^
2 q! P1 ~3 K& J4 X
7.6 ngx_radix_tree_t基数树  228" v$ H* l, C- r* @

8 z6 A1 O/ D- u5 R7.6.1 ngx_radix_tree_t基数树的原理  2283 _# Q- b- R7 I- ]6 w! M6 j

  c' z, L' t6 t6 V7.6.2 基数树的使用方法  230
7 w# y2 b& ?+ t" h  n4 e/ _0 e
8 `2 A/ z* r' b+ c$ z7 e/ z" B7.6.3 使用基数树的例子  2312 }7 T$ h3 Q# ?
( |" V' v9 P% O; {. n6 \! x) `
7.7 支持通配符的散列表  232
% W7 ~6 R2 s; S
7 U, ]% q) O0 ?0 T( @6 ?4 ~7.7.1 ngx_hash_t基本散列表  232
+ E+ F; G$ Y0 j( }* d3 ^0 e
% d9 \, K; u8 W7.7.2 支持通配符的散列表  2352 v+ u) L4 o' E& ?5 s
+ f1 U0 u0 |, C  {
7.7.3 带通配符散列表的使用例子  241
" `2 O8 H4 K" H4 s  U& f/ B2 ^8 }9 O" Y4 w7 g2 w& p* @) T# n9 r/ {
7.8 小结  245
6 {* [6 T% j) B# Y' Z+ v; K% g( C# N
第三部分 深入Nginx
- O2 e) T6 E( _- H) u6 ~; n
8 V8 |+ ^& X" c! P* O第8章 Nginx基础架构  2488 \  f" R! x* A' U

4 m+ r: c  L5 d. r8.1 Web服务器设计中的关键约束  249
2 I% m# N# ~; |1 `
& i* g# e% r, X( `& _& e: Q" C8.2 Nginx的架构设计  251- a- B9 ~' v" v* w  c4 r
& \2 T8 e! U6 H7 `- L
8.2.1 优秀的模块化设计  2518 T& Q& O7 t! N4 Y
9 M- r4 ^- [. Y& Q- y
8.2.2 事件驱动架构  254
( x; r8 T- x8 K9 W4 d; K. e1 {+ D5 k) @9 k2 N- v/ C
8.2.3 请求的多阶段异步处理  256) E$ l0 ?( W0 i" h) X9 c, _

  l8 @3 ]/ |0 w% [8 p( R8.2.4 管理进程、多工作进程设计  259
( _5 l4 O2 D) l6 M1 j7 s5 R; M; Q9 h
8.2.5 平台无关的代码实现  259
5 Y6 L) W+ A0 t! ]5 x0 x) r3 L5 q
* T  K; ^* H1 a) h8 d: |8.2.6 内存池的设计  259
2 |& q. e8 S) ]' {; F
( _. C$ o2 r- z+ I8.2.7 使用统一管道过滤器模式的HTTP过滤模块  2607 m- c  r; D3 G' H
# j# C) D/ {' I
8.2.8 其他一些用户模块  260& B7 q& v% c& J0 l9 E" @( L
/ v) a: K- g, A+ t7 C
8.3 Nginx框架中的核心结构体ngx_cycle_t  260
' g# `$ x9 m: y, P; {
1 k, s. b  h- C2 T% w) f8.3.1 ngx_listening_t结构体  2613 s7 E* J% G) X( D, U! v

3 F3 w: u6 E5 s# h1 K8.3.2 ngx_cycle_t结构体  262
6 }, @' ]" [( K' ^8 d
: J+ X4 O" ], z8 G8.3.3 ngx_cycle_t支持的方法  264
# w$ ]2 `2 J. Y) ]. q6 B# H! ~8 K5 J" \
8.4 Nginx启动时框架的处理流程  266
$ t+ G+ y0 S% Y0 X# m
, }: O( i  x3 |/ h$ m! u8.5 worker进程是如何工作的  269. B6 C" x- C, N- F4 V
8 g; p& s' R8 `) O# T6 u4 [* J
8.6 master进程是如何工作的  271
" S: x9 K, Y, u# `' U: Y& b* F0 U' B1 K: q  T& O
8.7 ngx_pool_t内存池  276
' ]/ [( J: e* q! m
3 H# T- i( B. g/ \8.8 小结  2849 @4 C; f( k& J
2 U* F5 ^3 Y' [  B2 G( [4 v  e
第9章 事件模块  285
$ g/ h$ `- P5 [8 U# |% w) ]' l
9.1 事件处理框架概述  286" P9 p+ w8 i) b. {" ]( p
5 F) `7 }/ ]. R* v4 h
9.2 Nginx事件的定义  288
1 M! I8 k9 j# y; l5 m" x, |6 `. q6 V0 G/ c6 Y4 E4 n8 r. m: K/ H4 @
9.3 Nginx连接的定义  291
- n+ I3 Z5 @+ `  o4 X' j0 Y/ z6 s; f4 ~" C
9.3.1 被动连接  2922 P$ S' O; F* t/ D
0 @8 W; b; _. c& `
9.3.2 主动连接  295( {: @4 t# }9 W7 t3 \5 O+ J# Z

, [" q3 Q) D4 g# ?& Y1 C; c9.3.3 ngx_connection_t连接池  296
3 ^) E( E2 i0 q' O; V, h& U7 Q" r1 I  q# e7 N3 k
9.4 ngx_events_module核心模块  297( V2 {* ^, J6 v- M0 j7 u

; o. Y+ W7 O4 O; @5 G0 l5 ^9.4.1 如何管理所有事件模块的配置项  299' J9 n% Y. A% }% j$ E

6 H+ `9 \; o* ^( s# g: C* Q& {9.4.2 管理事件模块  300
5 ^6 @% L5 v3 }0 ?; ]5 O! j- q
% L( b/ L. I2 v& d4 x, g. X9.5 ngx_event_core_module事件模块  302: O' L; [; `4 ], k! d% B. v4 C
) A: q$ I9 F6 D! ~- @# B  J
9.6 epoll事件驱动模块  308; j/ V1 |: h: H2 ^5 I7 ]
% e! H. F. {# R  s
9.6.1 epoll的原理和用法  3089 }- G2 R5 |+ Q5 b1 L9 H  `5 @6 e, w
4 a/ G8 H3 a0 Y6 P9 j) k3 V( V
9.6.2 如何使用epoll  310$ `4 O  T9 f6 k+ A1 n

2 M" G" m6 ?3 y8 |8 V: e* x( c9.6.3 ngx_epoll_module模块的实现  312# |) }% w3 v: A' r+ r# _; L- T: G

6 ]; K  f. C! F9.7 定时器事件  3206 h" O% r& }$ F, y
" _- [( w' N) Z2 e
9.7.1 缓存时间的管理  320, x! R7 p8 b; m. U. v2 _1 x
7 c' z: R; ?& T+ F& m
9.7.2 缓存时间的精度  323
0 f5 y! M+ ^! }; ]7 ]) O0 y2 W4 C3 ]# J, Z. w9 ~  f! s( u
9.7.3 定时器的实现  323& c" q3 Q3 h' n) `

6 r! U5 {: a- U9.8 事件驱动框架的处理流程  324
$ W; B8 V5 C8 ?" e2 Q* S9 ~, s5 R1 F' l1 y
9.8.1 如何建立新连接  325
. s5 |" I4 v) G
( P! J; q3 E0 \  D$ H+ x9.8.2 如何解决“惊群”问题  3273 O$ s: J4 S3 B+ A! X

0 v; O* _9 I! j9 R5 @2 _9.8.3 如何实现负载均衡  3296 c, Z: I9 ~1 B! w. s  k
) ^5 h1 E2 _- F  D* w' p% j, P
9.8.4 post事件队列  330, G, W, e# |7 o+ `4 o! `% I
8 E5 F9 j( n/ {( Z* e" X) O8 w3 x
9.8.5 ngx_process_events_and_timers流程  331
+ q% Y7 w2 U8 t# p0 h3 b( ?- J" S$ [) H$ z0 {; E- K# X+ U9 x
9.9 文件的异步I/O  334* [* t: r% r, p

8 ^# H, N3 i3 Y( T" b# O) |: M9 d9.9.1 Linux内核提供的文件异步I/O  335( U/ h7 E' D  j
- _6 G6 K1 |( a2 S% k4 ~# C. o; I9 o
9.9.2 ngx_epoll_module模块中实现的针对文件的异步I/O  3370 [  d2 L$ D  P. ]
- O# p$ g! j5 X8 v; T, G! f& |
9.10 TCP协议与Nginx  342
0 r2 X3 F) j6 A% M
% ]: y. k& u4 M' K0 n9.11 小结  347/ b4 g, H5 Z0 h+ L  d( L
; S. u7 Y. S9 {5 O2 C1 J
第10章 HTTP框架的初始化  348+ R+ t( F2 W% B

1 A( E% H% x; I  Y2 Y  d10.1 HTTP框架概述  349; e0 |. N5 I8 [, O0 u

* ^% r( W& A( U3 s% x: Z6 n10.2 管理HTTP模块的配置项  352* Z4 B( `8 ], _2 |$ P; @) o% C
, Y4 r+ P* x+ u" O5 @3 }
10.2.1 管理main级别下的配置项  353- Y0 i& C8 B5 A8 D; k
3 `* X9 B* v3 w' _) Q8 g$ l: H4 z
10.2.2 管理server级别下的配置项  355
0 y# ^4 y- g; q$ R/ S) n
9 g4 X( ]2 o6 B1 d/ P* h/ w/ u/ ~10.2.3 管理location级别下的配置项  358
2 Y' G/ J5 K$ G6 N3 m1 I6 K* O; b. h
10.2.4 不同级别配置项的合并  364
, z0 b% ?% S$ \  t, Z% A
& X( A! q/ a1 _10.3 监听端口的管理  367
7 l0 R2 c$ o) G4 t! |. u+ K4 L! t. H0 Q: r
10.4 server的快速检索  370
# r. {- x  V" W& f9 O7 L! `9 ?! v/ k2 ^8 m  T! ^
10.5 location的快速检索  3703 i+ c9 F7 }. r% U
9 ^! W( ?  T0 k7 K# Q: B
10.6 HTTP请求的11个处理阶段  372
7 V5 Y6 K% J& n1 F5 H7 M, ]
' @3 [8 M0 E) J4 ?' N3 f10.6.1 HTTP处理阶段的普适规则  374
$ X' S2 l, [! u7 w6 y, M2 V4 ^/ |- `. l4 m
10.6.2 NGX_HTTP_POST_READ_PHASE阶段  375
% u" s9 J1 u, I. ~5 |' u0 E3 e( M! h( `4 y
10.6.3 NGX_HTTP_SERVER_REWRITE_PHASE阶段  378  E0 s8 A) h) ^/ B  [/ w

' l/ B: g- \& Y% L& F$ E* ]$ M10.6.4 NGX_HTTP_FIND_CONFIG_PHASE阶段  378
9 l4 Z$ e8 Z. [5 {7 a+ V
0 u/ F$ C7 I. z* n5 ^  P10.6.5 NGX_HTTP_REWRITE_PHASE阶段  378
+ A5 z* Y2 l$ a" q! i( e. |
8 b  a9 i3 m: O10.6.6 NGX_HTTP_POST_REWRITE_PHASE阶段  379
& c! Q7 t: N* V" X% U; S; l
' I# `5 J* I0 A; w10.6.7 NGX_HTTP_PREACCESS_PHASE阶段  3792 V% G( F: f3 p$ ?9 ~5 v; z1 p

3 D# j3 q! i7 x5 M/ [, l' s10.6.8 NGX_HTTP_ACCESS_PHASE阶段  379
8 i/ h" {7 R9 x0 P, s  d5 y7 O
+ H6 w) Y9 m  ~7 d) y; |4 d7 C1 h10.6.9 NGX_HTTP_POST_ACCESS_PHASE阶段  380- w1 ~6 A' ~, @3 O- Z1 U1 b

2 E! i) Q9 C% r3 h/ |6 l2 e10.6.10 NGX_HTTP_TRY_FILES_PHASE阶段  380! z' B' @& E+ b( }# |- T7 s

, p' K5 Y" n1 M10.6.11 NGX_HTTP_CONTENT_PHASE阶段  3806 A, X6 w1 X( [: O( Z+ W

' V) i3 O2 h* h' h10.6.12 NGX_HTTP_LOG_PHASE阶段  382: Q: l( s- s# E9 B' n( a+ b2 @
0 s1 _9 S9 D' u" _& N
10.7 HTTP框架的初始化流程  3823 H( G. X! O- \- g; i
' j; O- Z7 g* v* q4 f
10.8 小结  384
) T7 @$ [9 |3 T% _0 O! M5 a( `; \( t% v' C) c
第11章 HTTP框架的执行流程  385
! ]% q! I/ j3 A" e. c$ @
* L6 u, N! R6 q" i11.1 HTTP框架执行流程概述  386* [; [$ d+ `! v/ P+ C$ u

/ x$ `6 e, f, k; C+ p$ W11.2 新连接建立时的行为  387
2 K+ v9 G5 O) G5 L& b/ z/ M/ W; W2 a7 a  e6 J  u
11.3 次可读事件的处理  388! ]  F4 B# q- \7 F/ J; J6 I9 G, p

! S; Z* Q! E0 t( q- h- ?& z3 \11.4 接收HTTP请求行  394% B; X4 W# q7 L( j" c8 {5 r( b

8 L# q, T8 u8 `' |! q. Z+ H$ e: n! {11.5 接收HTTP头部  398
( Q+ S9 p. c7 f- v" G! p* a" K) g" H
11.6 处理HTTP请求  4006 U  H; ]! L6 T& L( n* ]

% N5 o  T/ s) L9 v& g/ C- l/ ?2 \$ u11.6.1 ngx_http_core_generic_phase  406
+ O& m: \1 k" o1 L  U4 \
" Q+ D# \0 X4 w7 v11.6.2 ngx_http_core_rewrite_phase  408* n5 R  a2 H0 @/ J0 S
# v8 a; A4 M' h' j! c8 H
11.6.3 ngx_http_core_access_phase  409
3 c& `8 m. V( |3 _- K: A
; [9 @: Q7 M* q  U1 Z11.6.4 ngx_http_core_content_phase  412; Y( f% p+ B! q. Q
/ h# ~1 Z; Q0 F8 z* }
11.7 subrequest与post请求  415- K( _4 N9 L  b( h% g3 }
$ F! s: u' ~) E* k# q
11.8 处理HTTP包体  417  D; w$ ~" }3 P0 P

7 t! z; I! I, b& F/ J+ @11.8.1 接收包体  419
8 a" K- y! H& G# X7 @. n1 q* Z1 d; ~2 F6 U3 _0 \
11.8.2 放弃接收包体  425
) a7 i, U0 A7 }) l  @# ?
: P- [4 _, c# D11.9 发送HTTP响应  429
4 Y6 m9 J! A5 a! B5 B8 G9 X3 q; I3 h# G
11.9.1 ngx_http_send_header  430
/ X; z4 O% w4 t. `& F1 i# Y9 o: e& @6 r/ P3 H. V% p9 l: I
11.9.2 ngx_http_output_f?ilter  432) P# c3 F0 f+ C2 @
- D+ ^0 Q) Q, P# T# }8 p
11.9.3 ngx_http_writer  435/ Z2 I. {; p. T; |

- J; L& m/ e4 D$ Q4 M3 m1 X11.10 结束HTTP请求  4373 `4 K+ T4 D1 M8 ?

  i8 W, c- I2 v' Y" H3 W11.10.1 ngx_http_close_connection  438& B0 s" O& R+ P8 N1 g9 g' h

; f  `" V/ X5 A: C11.10.2 ngx_http_free_request  439
# Y8 R5 S) [* T3 n; q. |. C3 g+ d: g9 E6 t' E9 Q
11.10.3 ngx_http_close_request  440* l/ g  {9 T! i1 h# t2 W( Y

; R: M9 L0 h6 l+ G7 O, u11.10.4 ngx_http_f?inalize_connection  441
' }3 a6 o$ p$ `8 z- L4 r, Q; E' A; d/ [
11.10.5 ngx_http_terminate_request  443
! N3 q# _3 q9 ?6 m8 R/ Q' b$ l. D" ]  J& d" {+ Q1 E8 m3 C
11.10.6 ngx_http_f?inalize_request  443
) h; n2 j+ p% j3 |0 V
* j) X: g3 W  U- a% p! x11.11 小结  446  `" ?1 c9 x* t0 F' |

& Q, z6 Z% I0 E& f( O' P5 K第12章 upstream机制的设计与实现  447
4 m! @$ h+ I* S5 j6 p
* z7 Q( X; P& y( I5 p* m. F% g/ ~12.1 upstream机制概述  448
) |! }1 N5 j+ J& t& H0 C7 C) T. R# ~, W& w$ N: f  K3 T) X) h
12.1.1 设计目的  448
- L! L- [  E6 ?! t3 ]1 T6 b* ]7 L( }) i& o' i, r; h
12.1.2 ngx_http_upstream_t数据结构的意义  450
4 S2 c4 E; \8 |  d: B, T+ o) }$ Z  j$ R: U7 |
12.1.3 ngx_http_upstream_conf_t配置结构体  453
6 b% c7 i8 X1 X
5 N. v; k5 ~2 D2 M* f0 I12.2 启动upstream  4557 n& h% q3 B4 U5 ?9 i$ \; `; y

4 f" D/ M/ N& P12.3 与上游服务器建立连接  457
0 n1 ~0 }! }- W2 S5 @- W( a+ ?2 O! A/ K. V+ S2 E
12.4 发送请求到上游服务器  460, p$ `- H; r3 F% N$ N) X- N8 p

' [# W; `1 T/ m. }" M6 O12.5 接收上游服务器的响应头部  463& @7 o3 r" x7 o

: i( Q. |! r( X( {. w; y" B- R12.5.1 应用层协议的两段划分方式  463" K* `* y, E* K# O2 Y8 m7 s( g
9 q3 g: d' K  _5 S) `; g: {1 q
12.5.2 处理包体的3种方式  464
3 Y  i3 `5 l0 x/ J' |. ~2 V1 r0 l1 ^5 {* Z1 S6 w& h
12.5.3 接收响应头部的流程  4657 z8 z7 t$ z5 p1 _6 F
0 u+ u0 Q/ ^* T+ S2 r# Q
12.6 不转发响应时的处理流程  469
* p- S% e! Q' f' W" X" B
7 c. l' z0 z( w3 r3 N- o12.6.1 input_f?ilter方法的设计  469
  _. d% |. \7 C* w' A! b9 m* L$ M: ~3 c
12.6.2 默认的input_f?ilter方法  470
6 y# a! h7 L+ v3 B: M
/ D4 K; T2 {: y8 l2 a$ |: S* V12.6.3 接收包体的流程  472
8 O4 ^- ^3 d, Z5 c6 U- G; C( f% f0 ]+ P
12.7 以下游网速优先来转发响应  473% \1 f  K, T+ |6 e
" d' E- b: T0 {% V  f& q7 s+ t
12.7.1 转发响应的包头  474- w. p  S4 Q9 u: R* E% l

0 Y1 o6 c, Y: N  e  ^12.7.2 转发响应的包体  477
+ W" T. b7 c0 L+ ~2 O
4 D+ x6 I" w5 h, a3 ^2 p: `) s12.8 以上游网速优先来转发响应  4815 t6 L' k/ f8 ~

  w% {% d5 {4 m4 ~! _, b- @12.8.1 ngx_event_pipe_t结构体的意义  481
1 s- q) S9 F: Q- z; S) M$ \9 e2 g4 }1 Y5 z
12.8.2 转发响应的包头  485
3 t2 w" z8 h; M; l8 u: b/ J; T$ k
1 {! H* `- Z0 v7 [+ V) _, g12.8.3 转发响应的包体  4874 P) Y7 Q2 F, \6 }5 }  `
& o  j) {1 h6 e5 Z/ E* U
12.8.4 ngx_event_pipe_read_upstream方法  489
: |2 X+ A1 C: w( J( A9 A* }( X( Q5 ~
( {) m) R2 m2 \: A8 H/ X12.8.5 ngx_event_pipe_write_to_downstream方法  4949 ]: g$ _. D. D- S4 j
  z- S! a: J9 X; K9 Q
12.9 结束upstream请求  4965 E* F8 H/ f5 u- m0 S
* d1 X/ W; K  o
12.10 小结  499
' i) E6 a$ B" G4 x8 ?$ D  q! b* X# s1 B% L  M! @
第13章 邮件代理模块  500+ m4 d+ ~7 p0 ~6 L% Y, H" s# ~
3 D% P( y* ^  t2 s( p
13.1 邮件代理服务器的功能  500
1 t' @; M/ u, ?% n, P& M% Y4 `: Y7 N0 t# N/ T
13.2 邮件模块的处理框架  503
9 S/ f8 _6 Y8 T- p; W9 {8 _) P- H
# Y" [/ u: M% V' I1 J- e2 E9 X13.2.1 一个请求的8个独立处理阶段  503
( P' o- X3 B( H, f$ u. T! r# V4 D- k
13.2.2 邮件类模块的定义  504+ z# f4 j# o# _- r# Q2 o$ y% N% }
, M4 b( y6 Z7 l% x1 S8 ^
13.2.3 邮件框架的初始化  5069 R3 r( R6 c5 S0 h! x
2 O1 d5 x: q/ P: I+ V& [0 {  F+ H6 ^
13.3 初始化请求  506! B( e2 {$ u) ]# |
5 }' e* ]0 Y7 X( r+ N
13.3.1 描述邮件请求的ngx_mail_session_t结构体  506/ r2 }: R( k& A* ^( W! O
" ^% W6 g& G3 R4 }
13.3.2 初始化邮件请求的流程  509# }, V5 ]# N, x: Z9 J$ m# k: j% `

9 K, \0 b  ?6 F/ b9 a/ n13.4 接收并解析客户端请求  509
( r6 g+ C+ O" R( v. {
- s3 D3 [, _5 F* Y! z13.5 邮件认证  510
2 y1 a3 r" N( n4 S# G7 E% a- \5 R3 p! e
13.5.1 ngx_mail_auth_http_ctx_t结构体  510" s# `2 h! W7 a' ?% b2 N7 S! e; o; B
6 N5 q; k4 `) Q7 H" ~/ X
13.5.2 与认证服务器建立连接  511
+ t" ^, `2 f) p( O# }
- b3 U6 }( h% j( X/ R0 Z13.5.3 发送请求到认证服务器  513, I" ]% X& S) c5 T! o& d

* u' f3 `3 w! ]' R% {) t) I; z13.5.4 接收并解析响应  514- O" m2 J8 P4 y/ s( c! i

/ z0 X, s* c  r- s; X13.6 与上游邮件服务器间的认证交互  514
/ n/ b" Y7 m/ k3 G
! U# `, N8 e2 L4 o: u* j, {13.6.1 ngx_mail_proxy_ctx_t结构体  516
* t3 Z* F* P3 I0 Q& v2 G5 Q! @* y
7 ]+ b$ b. D. W! l13.6.2 向上游邮件服务器发起连接  516, q3 `2 }6 _$ a
1 F& D5 X8 X/ T  c( Y! L
13.6.3 与邮件服务器认证交互的过程  518
: [8 ~" ^; v5 p3 Y: l$ D& L1 L& w
; `/ _/ T7 i- S" ?" U9 }13.7 透传上游邮件服务器与客户端间的流  520
- f& A9 I0 c. {; z( U4 a5 J1 u
13.8 小结  524
% Q8 z  X, R1 K
- E# {8 v8 R/ g5 C# n3 W第14章 进程间的通信机制  525+ S8 t: v. q& }: _# t

- R" w* L8 l. ]5 k14.1 概述  525, O/ z! I0 ?) M8 J
& q8 p6 Q9 s8 }
14.2 共享内存  526
& ~5 D0 u+ b4 R1 p3 I4 d( @  q( m
14.3 原子操作  530
" C' {5 w- _" m& E6 ~8 `% g0 B) M$ k, Q! c- J
14.3.1 不支持原子库下的原子操作  5305 D/ p; v; d) [8 H; G
+ y7 v+ J; [. ]5 }
14.3.2 x86架构下的原子操作  531
6 l& X/ E1 T, i: f. v- Z6 N8 R, t% ?
% F6 J0 H) Z. @' _" p: T14.3.3 自旋锁  533
) J& G. \7 X* a" `7 n
% {* V- L8 k/ T2 |; w" @4 |  [14.4 Nginx频道  535
5 V: }+ j; p, A2 _% j# h. K8 O1 C! g+ @- v& e# }
14.5 信号  538- Q* n9 e- s) e9 X1 B

, `: ?& i1 W) C. A% H: N14.6 信号量  540/ P+ a, G5 Y$ o. ^
( Z+ b. f. L5 p/ n- V# w$ q3 G
14.7 文件锁  541
% @, w4 `1 v+ M3 v) P* v4 c3 F' ~! ~
14.8 互斥锁  544
. H% Y% x2 b+ p3 s0 a, h% q( Y9 _; T8 _; K" a& B
14.8.1 文件锁实现的ngx_shmtx_t锁  546$ k! I$ j" c: q- f4 x, u8 }

, c$ G$ n' M% X2 g, e! R3 k$ a# w2 E0 o14.8.2 原子变量实现的ngx_shmtx_t锁  548, r" I, |+ Z9 i0 f

. I; _% u; ?: d: w) n+ X- P14.9 小结  553
' N, D, t$ J1 G' G: Q- y5 b( ~1 P. l% y7 y9 S1 F
第15章 变量  554. p* m) _; R. L5 M& F

! R9 W) c" ]1 ]7 Q& h15.1 使用内部变量开发模块  555, R! |) g& V; d7 ~0 k
4 p3 f" q: d* p
15.1.1 定义模块  556
3 ?+ ?8 N. e$ Y1 n! Y1 U5 U4 _( H4 F
15.1.2 定义http模块加载方式  557
. V0 b" k: h. Y+ h/ V! L0 W
7 T$ I5 L* l' l: _6 `( j3 Z15.1.3 解析配置中的变量  558# t! ~% H0 R1 l( R3 ~/ p& z! c2 a

. `$ I( Z$ @/ Q15.1.4 处理请求  560
  u' f' i3 n4 \7 l) j/ u+ v( Y
# d! e4 v1 @+ t) j6 o15.2 内部变量工作原理  561  h5 _+ c, u0 o- ]4 f+ T; M* a; p  D' f

' N( a* e7 l8 O6 {15.2.1 何时定义变量  5610 Y* d  F1 H& I5 h

4 d0 X& \6 ]& L2 L% j15.2.2 相关数据结构详述  564
) G; `  t  n& c+ c8 R+ W: J6 b* {  ^3 H0 T2 y
15.2.3 定义变量的方法  572& ?" `* j, w2 h9 ?! b0 i) N
( V: Q/ d% ^0 a! d9 P, n! X, ^4 S
15.2.4 使用变量的方法  572
3 x4 I# @% i; |6 k& W, u
4 O) ?# r) ?' z5 H+ L  t15.2.5 如何解析变量  573, h* {: O' y5 @4 N

, w9 ]0 q4 z$ J1 U1 m3 E15.3 定义内部变量  576$ y* B- g) m  q* Z$ N

+ r5 J  A/ O; i$ ^$ n7 @) v) Z15.4 外部变量与脚本引擎  5776 U5 o1 l: _" h2 ^7 @
! [" L6 {) @6 i' t' M
15.4.1 相关数据结构  578
3 S+ c, m# u( W1 O& O7 D6 q2 @5 n6 |1 g
5 n1 y* o7 a! _6 L- T4 j5 m( H15.4.2 编译“set”脚本  5811 x; Y% }1 v0 n
# G& ^8 B! x" h2 r1 Y4 a* I
15.4.3 脚本执行流程  586) K4 N2 f% Y) |3 M  R7 N' E
3 g) B' I! I( N
15.5 小结  5893 s, D; X. p. W4 N7 r1 W3 O/ P
- ~2 y& U7 D0 U, i/ Z/ b: i+ k
第16章 slab共享内存  5902 r; L+ r- M/ z; ?0 y
7 X! A; N& E* o$ y5 v
16.1 操作slab共享内存的方法  590
7 B5 C7 H5 |& }" ?) E! I' Y2 `4 w9 M" M% q2 q' {& A
16.2 使用slab共享内存池的例子  592
5 N% t( n5 C" R0 {" u  ]* ]0 [1 E; |  n; b( Q1 x% j) M0 @- S
16.2.1 共享内存中的数据结构  593
) Y) ?* q9 \) n" [+ R: Z/ U: I. a/ O6 W  w/ R6 |
16.2.2 操作共享内存中的红黑树与链表  5952 V6 j( L4 o' s' i* e

& \8 }- f, r3 T* j3 L/ w3 f16.2.3 解析配置文件  6002 U( }$ Z6 V4 A( s9 b/ y
: S* X+ O3 f6 X% \! [
16.2.4 定义模块  603  F2 @+ {0 b! O% M& J

8 W/ P, l6 ?8 Y) }  h5 L16.3 slab内存管理的实现原理  605
$ G5 v; R& p( L1 P7 |6 _' P# w% b# D
, g! b: `2 L. l& f. p7 c( h' h4 h16.3.1 内存结构布局  6071 R- D0 t% b& G/ G7 Y: f2 u, O6 a

/ E4 _# ?: O  L. J16.3.2 分配内存流程  613( Z! R" v, m7 i1 x1 P% j" R
4 Z% F7 j( @6 c, g, p% B) T) i
16.3.3 释放内存流程  617
5 B% |! {5 _7 A) ~4 S$ b  p3 I4 Z' ~/ C" M' e) k) o$ R
16.3.4 如何使用位操作  619
0 e" p3 O7 E" y5 v$ H! l& t. n# Z4 B! p7 m
16.3.5 slab内存池间的管理  624
8 q9 X% t$ w3 J) N- V; d
& s- N# @# w7 g9 c0 R16.4 小结  624
) R2 j, F, Y, x( t$ D
9 \4 C5 B0 L0 j8 g7 y
百度云盘下载地址(完全免费-绝无套路):
游客,如果您要查看本帖隐藏内容请回复

1 \( m' U. H  w
( W6 ]. Y* x! a( ?9 i

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
关注下面的标签,发现更多相似文章
分享到:

回答|共 28 个

黄承锐

发表于 2023-9-22 13:49:15 | 显示全部楼层

白漂来了

壶聊

发表于 2023-9-22 14:54:22 | 显示全部楼层

以后学java 就靠java吧了

鞠递

发表于 2023-9-24 16:22:28 | 显示全部楼层

java吧 真给力

茶艺

发表于 2023-9-24 23:34:42 | 显示全部楼层

良心网站,力挺

辣条董事

发表于 2023-9-25 22:42:56 | 显示全部楼层

太爽了  干货很多!!!

万物归宗

发表于 2023-9-26 06:26:03 | 显示全部楼层

学习java,就选java吧了

胖鱼母亲本人

发表于 2023-9-26 10:22:41 | 显示全部楼层

资源很新 好好好

寒风细雨

发表于 2023-9-28 06:22:48 | 显示全部楼层

给力,真免费

婧妍

发表于 2023-9-28 11:54:17 | 显示全部楼层

良心网站,力挺
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则