28回答

0收藏

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

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

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
关注下面的标签,发现更多相似文章
分享到:

回答|共 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 | 显示全部楼层

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

本版积分规则