Mercurial > hg > ngx_http_upstream_keepalive
annotate ngx_http_upstream_keepalive_module.c @ 21:9a4ee6fe1c6d
Keepalive: avoid closing upstream connection on stale events.
Under some conditions it's possible that stale events occur, i.e. read
event handler called for just saved upstream connection without any data
available for read. We shouldn't close upstream connection in such
situation.
Reported by: Martin Fjordvald
author | Maxim Dounin <mdounin@mdounin.ru> |
---|---|
date | Tue, 14 Sep 2010 04:01:14 +0400 |
parents | 2054159546d0 |
children | 2ee28064a04a |
rev | line source |
---|---|
0
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
1 |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
2 /* |
1
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
3 * Copyright (C) Maxim Dounin |
0
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
4 */ |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
5 |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
6 |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
7 #include <ngx_config.h> |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
8 #include <ngx_core.h> |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
9 #include <ngx_http.h> |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
10 |
5 | 11 |
2
8545bbda9e4b
Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
12 typedef struct { |
1
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
13 ngx_uint_t max_cached; |
6
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
14 ngx_uint_t single; /* unsigned:1 */ |
1
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
15 |
2
8545bbda9e4b
Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
16 ngx_queue_t cache; |
8545bbda9e4b
Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
17 ngx_queue_t free; |
0
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
18 |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
19 ngx_http_upstream_init_pt original_init_upstream; |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
20 ngx_http_upstream_init_peer_pt original_init_peer; |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
21 |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
22 } ngx_http_upstream_keepalive_srv_conf_t; |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
23 |
5 | 24 |
0
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
25 typedef struct { |
1
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
26 ngx_http_upstream_keepalive_srv_conf_t *conf; |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
27 |
11
15530a464dba
Keepalive: don't cache invalid connections.
Maxim Dounin <mdounin@mdounin.ru>
parents:
10
diff
changeset
|
28 ngx_http_upstream_t *upstream; |
15530a464dba
Keepalive: don't cache invalid connections.
Maxim Dounin <mdounin@mdounin.ru>
parents:
10
diff
changeset
|
29 |
0
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
30 void *data; |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
31 |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
32 ngx_event_get_peer_pt original_get_peer; |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
33 ngx_event_free_peer_pt original_free_peer; |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
34 |
11
15530a464dba
Keepalive: don't cache invalid connections.
Maxim Dounin <mdounin@mdounin.ru>
parents:
10
diff
changeset
|
35 ngx_uint_t failed; /* unsigned:1 */ |
15530a464dba
Keepalive: don't cache invalid connections.
Maxim Dounin <mdounin@mdounin.ru>
parents:
10
diff
changeset
|
36 |
0
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
37 } ngx_http_upstream_keepalive_peer_data_t; |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
38 |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
39 |
8
565939797f5c
Keepalive: fix connection closing and avoid for loop there.
Maxim Dounin <mdounin@mdounin.ru>
parents:
6
diff
changeset
|
40 typedef struct { |
565939797f5c
Keepalive: fix connection closing and avoid for loop there.
Maxim Dounin <mdounin@mdounin.ru>
parents:
6
diff
changeset
|
41 ngx_http_upstream_keepalive_srv_conf_t *conf; |
565939797f5c
Keepalive: fix connection closing and avoid for loop there.
Maxim Dounin <mdounin@mdounin.ru>
parents:
6
diff
changeset
|
42 |
565939797f5c
Keepalive: fix connection closing and avoid for loop there.
Maxim Dounin <mdounin@mdounin.ru>
parents:
6
diff
changeset
|
43 ngx_queue_t queue; |
565939797f5c
Keepalive: fix connection closing and avoid for loop there.
Maxim Dounin <mdounin@mdounin.ru>
parents:
6
diff
changeset
|
44 ngx_connection_t *connection; |
565939797f5c
Keepalive: fix connection closing and avoid for loop there.
Maxim Dounin <mdounin@mdounin.ru>
parents:
6
diff
changeset
|
45 |
565939797f5c
Keepalive: fix connection closing and avoid for loop there.
Maxim Dounin <mdounin@mdounin.ru>
parents:
6
diff
changeset
|
46 socklen_t socklen; |
565939797f5c
Keepalive: fix connection closing and avoid for loop there.
Maxim Dounin <mdounin@mdounin.ru>
parents:
6
diff
changeset
|
47 struct sockaddr_storage sockaddr; |
565939797f5c
Keepalive: fix connection closing and avoid for loop there.
Maxim Dounin <mdounin@mdounin.ru>
parents:
6
diff
changeset
|
48 |
565939797f5c
Keepalive: fix connection closing and avoid for loop there.
Maxim Dounin <mdounin@mdounin.ru>
parents:
6
diff
changeset
|
49 } ngx_http_upstream_keepalive_cache_t; |
565939797f5c
Keepalive: fix connection closing and avoid for loop there.
Maxim Dounin <mdounin@mdounin.ru>
parents:
6
diff
changeset
|
50 |
565939797f5c
Keepalive: fix connection closing and avoid for loop there.
Maxim Dounin <mdounin@mdounin.ru>
parents:
6
diff
changeset
|
51 |
0
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
52 static ngx_int_t ngx_http_upstream_init_keepalive_peer(ngx_http_request_t *r, |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
53 ngx_http_upstream_srv_conf_t *us); |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
54 static ngx_int_t ngx_http_upstream_get_keepalive_peer(ngx_peer_connection_t *pc, |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
55 void *data); |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
56 static void ngx_http_upstream_free_keepalive_peer(ngx_peer_connection_t *pc, |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
57 void *data, ngx_uint_t state); |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
58 |
1
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
59 static void ngx_http_upstream_keepalive_dummy_handler(ngx_event_t *ev); |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
60 static void ngx_http_upstream_keepalive_close_handler(ngx_event_t *ev); |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
61 |
0
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
62 static void *ngx_http_upstream_keepalive_create_conf(ngx_conf_t *cf); |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
63 static char *ngx_http_upstream_keepalive(ngx_conf_t *cf, ngx_command_t *cmd, |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
64 void *conf); |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
65 |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
66 |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
67 static ngx_command_t ngx_http_upstream_keepalive_commands[] = { |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
68 |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
69 { ngx_string("keepalive"), |
6
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
70 NGX_HTTP_UPS_CONF|NGX_CONF_TAKE12, |
0
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
71 ngx_http_upstream_keepalive, |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
72 0, |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
73 0, |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
74 NULL }, |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
75 |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
76 ngx_null_command |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
77 }; |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
78 |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
79 |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
80 static ngx_http_module_t ngx_http_upstream_keepalive_module_ctx = { |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
81 NULL, /* preconfiguration */ |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
82 NULL, /* postconfiguration */ |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
83 |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
84 NULL, /* create main configuration */ |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
85 NULL, /* init main configuration */ |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
86 |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
87 ngx_http_upstream_keepalive_create_conf, /* create server configuration */ |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
88 NULL, /* merge server configuration */ |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
89 |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
90 NULL, /* create location configuration */ |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
91 NULL /* merge location configuration */ |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
92 }; |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
93 |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
94 |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
95 ngx_module_t ngx_http_upstream_keepalive_module = { |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
96 NGX_MODULE_V1, |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
97 &ngx_http_upstream_keepalive_module_ctx, /* module context */ |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
98 ngx_http_upstream_keepalive_commands, /* module directives */ |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
99 NGX_HTTP_MODULE, /* module type */ |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
100 NULL, /* init master */ |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
101 NULL, /* init module */ |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
102 NULL, /* init process */ |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
103 NULL, /* init thread */ |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
104 NULL, /* exit thread */ |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
105 NULL, /* exit process */ |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
106 NULL, /* exit master */ |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
107 NGX_MODULE_V1_PADDING |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
108 }; |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
109 |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
110 |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
111 ngx_int_t |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
112 ngx_http_upstream_init_keepalive(ngx_conf_t *cf, |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
113 ngx_http_upstream_srv_conf_t *us) |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
114 { |
2
8545bbda9e4b
Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
115 ngx_uint_t i; |
0
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
116 ngx_http_upstream_keepalive_srv_conf_t *kcf; |
2
8545bbda9e4b
Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
117 ngx_http_upstream_keepalive_cache_t *cached; |
0
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
118 |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
119 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, cf->log, 0, |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
120 "init keepalive"); |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
121 |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
122 kcf = ngx_http_conf_upstream_srv_conf(us, |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
123 ngx_http_upstream_keepalive_module); |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
124 |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
125 if (kcf->original_init_upstream(cf, us) != NGX_OK) { |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
126 return NGX_ERROR; |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
127 } |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
128 |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
129 kcf->original_init_peer = us->peer.init; |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
130 |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
131 us->peer.init = ngx_http_upstream_init_keepalive_peer; |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
132 |
2
8545bbda9e4b
Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
133 /* allocate cache items and add to free queue */ |
8545bbda9e4b
Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
134 |
8545bbda9e4b
Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
135 cached = ngx_pcalloc(cf->pool, |
8545bbda9e4b
Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
136 sizeof(ngx_http_upstream_keepalive_cache_t) * kcf->max_cached); |
8545bbda9e4b
Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
137 if (cached == NULL) { |
1
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
138 return NGX_ERROR; |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
139 } |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
140 |
2
8545bbda9e4b
Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
141 ngx_queue_init(&kcf->cache); |
8545bbda9e4b
Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
142 ngx_queue_init(&kcf->free); |
8545bbda9e4b
Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
143 |
8545bbda9e4b
Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
144 for (i = 0; i < kcf->max_cached; i++) { |
8545bbda9e4b
Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
145 ngx_queue_insert_head(&kcf->free, &cached[i].queue); |
8
565939797f5c
Keepalive: fix connection closing and avoid for loop there.
Maxim Dounin <mdounin@mdounin.ru>
parents:
6
diff
changeset
|
146 cached[i].conf = kcf; |
2
8545bbda9e4b
Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
147 } |
1
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
148 |
0
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
149 return NGX_OK; |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
150 } |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
151 |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
152 |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
153 static ngx_int_t |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
154 ngx_http_upstream_init_keepalive_peer(ngx_http_request_t *r, |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
155 ngx_http_upstream_srv_conf_t *us) |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
156 { |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
157 ngx_http_upstream_keepalive_peer_data_t *kp; |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
158 ngx_http_upstream_keepalive_srv_conf_t *kcf; |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
159 |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
160 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
161 "init keepalive peer"); |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
162 |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
163 kcf = ngx_http_conf_upstream_srv_conf(us, |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
164 ngx_http_upstream_keepalive_module); |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
165 |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
166 kp = ngx_palloc(r->pool, sizeof(ngx_http_upstream_keepalive_peer_data_t)); |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
167 if (kp == NULL) { |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
168 return NGX_ERROR; |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
169 } |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
170 |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
171 if (kcf->original_init_peer(r, us) != NGX_OK) { |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
172 return NGX_ERROR; |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
173 } |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
174 |
1
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
175 kp->conf = kcf; |
11
15530a464dba
Keepalive: don't cache invalid connections.
Maxim Dounin <mdounin@mdounin.ru>
parents:
10
diff
changeset
|
176 kp->upstream = r->upstream; |
0
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
177 kp->data = r->upstream->peer.data; |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
178 kp->original_get_peer = r->upstream->peer.get; |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
179 kp->original_free_peer = r->upstream->peer.free; |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
180 |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
181 r->upstream->peer.data = kp; |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
182 r->upstream->peer.get = ngx_http_upstream_get_keepalive_peer; |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
183 r->upstream->peer.free = ngx_http_upstream_free_keepalive_peer; |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
184 |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
185 return NGX_OK; |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
186 } |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
187 |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
188 |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
189 static ngx_int_t |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
190 ngx_http_upstream_get_keepalive_peer(ngx_peer_connection_t *pc, void *data) |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
191 { |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
192 ngx_http_upstream_keepalive_peer_data_t *kp = data; |
2
8545bbda9e4b
Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
193 ngx_http_upstream_keepalive_cache_t *item; |
0
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
194 |
6
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
195 ngx_int_t rc; |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
196 ngx_queue_t *q, *cache; |
5 | 197 ngx_connection_t *c; |
1
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
198 |
0
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
199 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, pc->log, 0, |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
200 "get keepalive peer"); |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
201 |
11
15530a464dba
Keepalive: don't cache invalid connections.
Maxim Dounin <mdounin@mdounin.ru>
parents:
10
diff
changeset
|
202 kp->failed = 0; |
15530a464dba
Keepalive: don't cache invalid connections.
Maxim Dounin <mdounin@mdounin.ru>
parents:
10
diff
changeset
|
203 |
6
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
204 /* single pool of cached connections */ |
1
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
205 |
6
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
206 if (kp->conf->single && !ngx_queue_empty(&kp->conf->cache)) { |
2
8545bbda9e4b
Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
207 |
8545bbda9e4b
Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
208 q = ngx_queue_head(&kp->conf->cache); |
8545bbda9e4b
Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
209 ngx_queue_remove(q); |
1
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
210 |
2
8545bbda9e4b
Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
211 item = ngx_queue_data(q, ngx_http_upstream_keepalive_cache_t, queue); |
8545bbda9e4b
Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
212 c = item->connection; |
8545bbda9e4b
Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
213 |
8545bbda9e4b
Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
214 ngx_queue_insert_head(&kp->conf->free, q); |
1
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
215 |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
216 c->idle = 0; |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
217 c->log = pc->log; |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
218 c->read->log = pc->log; |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
219 c->write->log = pc->log; |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
220 |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
221 pc->connection = c; |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
222 pc->cached = 1; |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
223 |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
224 return NGX_DONE; |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
225 } |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
226 |
6
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
227 rc = kp->original_get_peer(pc, kp->data); |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
228 |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
229 if (kp->conf->single || rc != NGX_OK) { |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
230 return rc; |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
231 } |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
232 |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
233 /* search cache for suitable connection */ |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
234 |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
235 cache = &kp->conf->cache; |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
236 |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
237 for (q = ngx_queue_head(cache); |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
238 q != ngx_queue_sentinel(cache); |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
239 q = ngx_queue_next(q)) |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
240 { |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
241 item = ngx_queue_data(q, ngx_http_upstream_keepalive_cache_t, queue); |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
242 c = item->connection; |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
243 |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
244 if (ngx_memn2cmp((u_char *) &item->sockaddr, (u_char *) pc->sockaddr, |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
245 item->socklen, pc->socklen) |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
246 == 0) |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
247 { |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
248 ngx_queue_remove(q); |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
249 ngx_queue_insert_head(&kp->conf->free, q); |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
250 |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
251 c->idle = 0; |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
252 c->log = pc->log; |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
253 c->read->log = pc->log; |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
254 c->write->log = pc->log; |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
255 |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
256 pc->connection = c; |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
257 pc->cached = 1; |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
258 |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
259 return NGX_DONE; |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
260 } |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
261 } |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
262 |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
263 return NGX_OK; |
0
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
264 } |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
265 |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
266 |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
267 static void |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
268 ngx_http_upstream_free_keepalive_peer(ngx_peer_connection_t *pc, void *data, |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
269 ngx_uint_t state) |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
270 { |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
271 ngx_http_upstream_keepalive_peer_data_t *kp = data; |
2
8545bbda9e4b
Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
272 ngx_http_upstream_keepalive_cache_t *item; |
0
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
273 |
11
15530a464dba
Keepalive: don't cache invalid connections.
Maxim Dounin <mdounin@mdounin.ru>
parents:
10
diff
changeset
|
274 ngx_uint_t status; |
15530a464dba
Keepalive: don't cache invalid connections.
Maxim Dounin <mdounin@mdounin.ru>
parents:
10
diff
changeset
|
275 ngx_queue_t *q; |
15530a464dba
Keepalive: don't cache invalid connections.
Maxim Dounin <mdounin@mdounin.ru>
parents:
10
diff
changeset
|
276 ngx_connection_t *c; |
15530a464dba
Keepalive: don't cache invalid connections.
Maxim Dounin <mdounin@mdounin.ru>
parents:
10
diff
changeset
|
277 ngx_http_upstream_t *u; |
1
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
278 |
0
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
279 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, pc->log, 0, |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
280 "free keepalive peer"); |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
281 |
11
15530a464dba
Keepalive: don't cache invalid connections.
Maxim Dounin <mdounin@mdounin.ru>
parents:
10
diff
changeset
|
282 /* remember failed state - peer.free() may be called more than once */ |
15530a464dba
Keepalive: don't cache invalid connections.
Maxim Dounin <mdounin@mdounin.ru>
parents:
10
diff
changeset
|
283 |
15530a464dba
Keepalive: don't cache invalid connections.
Maxim Dounin <mdounin@mdounin.ru>
parents:
10
diff
changeset
|
284 if (state & NGX_PEER_FAILED) { |
15530a464dba
Keepalive: don't cache invalid connections.
Maxim Dounin <mdounin@mdounin.ru>
parents:
10
diff
changeset
|
285 kp->failed = 1; |
15530a464dba
Keepalive: don't cache invalid connections.
Maxim Dounin <mdounin@mdounin.ru>
parents:
10
diff
changeset
|
286 } |
15530a464dba
Keepalive: don't cache invalid connections.
Maxim Dounin <mdounin@mdounin.ru>
parents:
10
diff
changeset
|
287 |
15530a464dba
Keepalive: don't cache invalid connections.
Maxim Dounin <mdounin@mdounin.ru>
parents:
10
diff
changeset
|
288 /* |
15530a464dba
Keepalive: don't cache invalid connections.
Maxim Dounin <mdounin@mdounin.ru>
parents:
10
diff
changeset
|
289 * cache valid connections |
15530a464dba
Keepalive: don't cache invalid connections.
Maxim Dounin <mdounin@mdounin.ru>
parents:
10
diff
changeset
|
290 * |
15530a464dba
Keepalive: don't cache invalid connections.
Maxim Dounin <mdounin@mdounin.ru>
parents:
10
diff
changeset
|
291 * For memcached this means status either 404 or 200. For status 200 we |
15530a464dba
Keepalive: don't cache invalid connections.
Maxim Dounin <mdounin@mdounin.ru>
parents:
10
diff
changeset
|
292 * should also check if all response body was read (u->length == 0) and |
15530a464dba
Keepalive: don't cache invalid connections.
Maxim Dounin <mdounin@mdounin.ru>
parents:
10
diff
changeset
|
293 * make sure that u->length is valid (we use u->header_sent flag to test |
15530a464dba
Keepalive: don't cache invalid connections.
Maxim Dounin <mdounin@mdounin.ru>
parents:
10
diff
changeset
|
294 * this). Memcached is the only supported protocol for now. |
15530a464dba
Keepalive: don't cache invalid connections.
Maxim Dounin <mdounin@mdounin.ru>
parents:
10
diff
changeset
|
295 * |
15530a464dba
Keepalive: don't cache invalid connections.
Maxim Dounin <mdounin@mdounin.ru>
parents:
10
diff
changeset
|
296 * Some notes on other possibilities (incomplete): |
15530a464dba
Keepalive: don't cache invalid connections.
Maxim Dounin <mdounin@mdounin.ru>
parents:
10
diff
changeset
|
297 * |
15530a464dba
Keepalive: don't cache invalid connections.
Maxim Dounin <mdounin@mdounin.ru>
parents:
10
diff
changeset
|
298 * fastcgi: u->pipe->upstream_done should be sufficient |
15530a464dba
Keepalive: don't cache invalid connections.
Maxim Dounin <mdounin@mdounin.ru>
parents:
10
diff
changeset
|
299 * |
15530a464dba
Keepalive: don't cache invalid connections.
Maxim Dounin <mdounin@mdounin.ru>
parents:
10
diff
changeset
|
300 * proxy buffered: u->pipe->upstream_done, 304 replies, replies to head |
15530a464dba
Keepalive: don't cache invalid connections.
Maxim Dounin <mdounin@mdounin.ru>
parents:
10
diff
changeset
|
301 * requests (see RFC 2616, 4.4 Message Length) |
15530a464dba
Keepalive: don't cache invalid connections.
Maxim Dounin <mdounin@mdounin.ru>
parents:
10
diff
changeset
|
302 * |
15530a464dba
Keepalive: don't cache invalid connections.
Maxim Dounin <mdounin@mdounin.ru>
parents:
10
diff
changeset
|
303 * proxy unbuffered: 200 as for memcached (with u->length == 0 and |
15530a464dba
Keepalive: don't cache invalid connections.
Maxim Dounin <mdounin@mdounin.ru>
parents:
10
diff
changeset
|
304 * header_sent), 304, replies to head requests |
15530a464dba
Keepalive: don't cache invalid connections.
Maxim Dounin <mdounin@mdounin.ru>
parents:
10
diff
changeset
|
305 * |
15530a464dba
Keepalive: don't cache invalid connections.
Maxim Dounin <mdounin@mdounin.ru>
parents:
10
diff
changeset
|
306 * subrequest_in_memory: won't work as of now |
15530a464dba
Keepalive: don't cache invalid connections.
Maxim Dounin <mdounin@mdounin.ru>
parents:
10
diff
changeset
|
307 * |
15530a464dba
Keepalive: don't cache invalid connections.
Maxim Dounin <mdounin@mdounin.ru>
parents:
10
diff
changeset
|
308 * TODO: move this logic to protocol modules (NGX_PEER_KEEPALIVE?) |
15530a464dba
Keepalive: don't cache invalid connections.
Maxim Dounin <mdounin@mdounin.ru>
parents:
10
diff
changeset
|
309 */ |
15530a464dba
Keepalive: don't cache invalid connections.
Maxim Dounin <mdounin@mdounin.ru>
parents:
10
diff
changeset
|
310 |
15530a464dba
Keepalive: don't cache invalid connections.
Maxim Dounin <mdounin@mdounin.ru>
parents:
10
diff
changeset
|
311 u = kp->upstream; |
15530a464dba
Keepalive: don't cache invalid connections.
Maxim Dounin <mdounin@mdounin.ru>
parents:
10
diff
changeset
|
312 status = u->headers_in.status_n; |
15530a464dba
Keepalive: don't cache invalid connections.
Maxim Dounin <mdounin@mdounin.ru>
parents:
10
diff
changeset
|
313 |
15530a464dba
Keepalive: don't cache invalid connections.
Maxim Dounin <mdounin@mdounin.ru>
parents:
10
diff
changeset
|
314 if (!kp->failed |
15530a464dba
Keepalive: don't cache invalid connections.
Maxim Dounin <mdounin@mdounin.ru>
parents:
10
diff
changeset
|
315 && pc->connection != NULL |
14
28af4b0b32c1
Keepalive: experimental fastcgi support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
11
diff
changeset
|
316 #if (NGX_UPSTREAM_KEEPALIVE_PATCHED) |
28af4b0b32c1
Keepalive: experimental fastcgi support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
11
diff
changeset
|
317 && u->keepalive) |
28af4b0b32c1
Keepalive: experimental fastcgi support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
11
diff
changeset
|
318 #else |
11
15530a464dba
Keepalive: don't cache invalid connections.
Maxim Dounin <mdounin@mdounin.ru>
parents:
10
diff
changeset
|
319 && (status == NGX_HTTP_NOT_FOUND |
15530a464dba
Keepalive: don't cache invalid connections.
Maxim Dounin <mdounin@mdounin.ru>
parents:
10
diff
changeset
|
320 || (status == NGX_HTTP_OK && u->header_sent && u->length == 0))) |
14
28af4b0b32c1
Keepalive: experimental fastcgi support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
11
diff
changeset
|
321 #endif |
1
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
322 { |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
323 c = pc->connection; |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
324 |
10
06bd0e50e696
Keepalive: log saving connection.
Maxim Dounin <mdounin@mdounin.ru>
parents:
8
diff
changeset
|
325 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0, |
06bd0e50e696
Keepalive: log saving connection.
Maxim Dounin <mdounin@mdounin.ru>
parents:
8
diff
changeset
|
326 "free keepalive peer: saving connection %p", c); |
06bd0e50e696
Keepalive: log saving connection.
Maxim Dounin <mdounin@mdounin.ru>
parents:
8
diff
changeset
|
327 |
3
42e64900483b
Keepalive: always save connections to cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
328 if (ngx_queue_empty(&kp->conf->free)) { |
42e64900483b
Keepalive: always save connections to cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
329 |
42e64900483b
Keepalive: always save connections to cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
330 q = ngx_queue_last(&kp->conf->cache); |
42e64900483b
Keepalive: always save connections to cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
331 ngx_queue_remove(q); |
42e64900483b
Keepalive: always save connections to cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
332 |
42e64900483b
Keepalive: always save connections to cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
333 item = ngx_queue_data(q, ngx_http_upstream_keepalive_cache_t, |
42e64900483b
Keepalive: always save connections to cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
334 queue); |
42e64900483b
Keepalive: always save connections to cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
335 |
42e64900483b
Keepalive: always save connections to cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
336 ngx_close_connection(item->connection); |
2
8545bbda9e4b
Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
337 |
3
42e64900483b
Keepalive: always save connections to cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
338 } else { |
42e64900483b
Keepalive: always save connections to cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
339 q = ngx_queue_head(&kp->conf->free); |
42e64900483b
Keepalive: always save connections to cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
340 ngx_queue_remove(q); |
42e64900483b
Keepalive: always save connections to cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
341 |
42e64900483b
Keepalive: always save connections to cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
342 item = ngx_queue_data(q, ngx_http_upstream_keepalive_cache_t, |
42e64900483b
Keepalive: always save connections to cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
343 queue); |
42e64900483b
Keepalive: always save connections to cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
344 } |
42e64900483b
Keepalive: always save connections to cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
345 |
2
8545bbda9e4b
Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
346 item->connection = c; |
8545bbda9e4b
Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
347 ngx_queue_insert_head(&kp->conf->cache, q); |
8545bbda9e4b
Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
348 |
1
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
349 pc->connection = NULL; |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
350 |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
351 if (c->read->timer_set) { |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
352 ngx_del_timer(c->read); |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
353 } |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
354 if (c->write->timer_set) { |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
355 ngx_del_timer(c->write); |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
356 } |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
357 |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
358 c->write->handler = ngx_http_upstream_keepalive_dummy_handler; |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
359 c->read->handler = ngx_http_upstream_keepalive_close_handler; |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
360 |
8
565939797f5c
Keepalive: fix connection closing and avoid for loop there.
Maxim Dounin <mdounin@mdounin.ru>
parents:
6
diff
changeset
|
361 c->data = item; |
1
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
362 c->idle = 1; |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
363 c->log = ngx_cycle->log; |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
364 c->read->log = ngx_cycle->log; |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
365 c->write->log = ngx_cycle->log; |
6
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
366 |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
367 item->socklen = pc->socklen; |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
368 ngx_memcpy(&item->sockaddr, pc->sockaddr, pc->socklen); |
1
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
369 } |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
370 |
0
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
371 return kp->original_free_peer(pc, kp->data, state); |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
372 } |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
373 |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
374 |
1
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
375 static void |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
376 ngx_http_upstream_keepalive_dummy_handler(ngx_event_t *ev) |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
377 { |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
378 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, ev->log, 0, |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
379 "keepalive dummy handler"); |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
380 } |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
381 |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
382 |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
383 static void |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
384 ngx_http_upstream_keepalive_close_handler(ngx_event_t *ev) |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
385 { |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
386 ngx_http_upstream_keepalive_srv_conf_t *conf; |
2
8545bbda9e4b
Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
387 ngx_http_upstream_keepalive_cache_t *item; |
1
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
388 |
21
9a4ee6fe1c6d
Keepalive: avoid closing upstream connection on stale events.
Maxim Dounin <mdounin@mdounin.ru>
parents:
18
diff
changeset
|
389 int n; |
9a4ee6fe1c6d
Keepalive: avoid closing upstream connection on stale events.
Maxim Dounin <mdounin@mdounin.ru>
parents:
18
diff
changeset
|
390 char buf[1]; |
1
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
391 ngx_connection_t *c; |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
392 |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
393 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, ev->log, 0, |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
394 "keepalive close handler"); |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
395 |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
396 c = ev->data; |
21
9a4ee6fe1c6d
Keepalive: avoid closing upstream connection on stale events.
Maxim Dounin <mdounin@mdounin.ru>
parents:
18
diff
changeset
|
397 |
9a4ee6fe1c6d
Keepalive: avoid closing upstream connection on stale events.
Maxim Dounin <mdounin@mdounin.ru>
parents:
18
diff
changeset
|
398 n = recv(c->fd, buf, 1, MSG_PEEK); |
9a4ee6fe1c6d
Keepalive: avoid closing upstream connection on stale events.
Maxim Dounin <mdounin@mdounin.ru>
parents:
18
diff
changeset
|
399 |
9a4ee6fe1c6d
Keepalive: avoid closing upstream connection on stale events.
Maxim Dounin <mdounin@mdounin.ru>
parents:
18
diff
changeset
|
400 if (n == -1 && ngx_socket_errno == NGX_EAGAIN) { |
9a4ee6fe1c6d
Keepalive: avoid closing upstream connection on stale events.
Maxim Dounin <mdounin@mdounin.ru>
parents:
18
diff
changeset
|
401 /* stale event */ |
9a4ee6fe1c6d
Keepalive: avoid closing upstream connection on stale events.
Maxim Dounin <mdounin@mdounin.ru>
parents:
18
diff
changeset
|
402 |
9a4ee6fe1c6d
Keepalive: avoid closing upstream connection on stale events.
Maxim Dounin <mdounin@mdounin.ru>
parents:
18
diff
changeset
|
403 if (ngx_handle_read_event(c->read, 0) != NGX_OK) { |
9a4ee6fe1c6d
Keepalive: avoid closing upstream connection on stale events.
Maxim Dounin <mdounin@mdounin.ru>
parents:
18
diff
changeset
|
404 goto close; |
9a4ee6fe1c6d
Keepalive: avoid closing upstream connection on stale events.
Maxim Dounin <mdounin@mdounin.ru>
parents:
18
diff
changeset
|
405 } |
9a4ee6fe1c6d
Keepalive: avoid closing upstream connection on stale events.
Maxim Dounin <mdounin@mdounin.ru>
parents:
18
diff
changeset
|
406 |
9a4ee6fe1c6d
Keepalive: avoid closing upstream connection on stale events.
Maxim Dounin <mdounin@mdounin.ru>
parents:
18
diff
changeset
|
407 return; |
9a4ee6fe1c6d
Keepalive: avoid closing upstream connection on stale events.
Maxim Dounin <mdounin@mdounin.ru>
parents:
18
diff
changeset
|
408 } |
9a4ee6fe1c6d
Keepalive: avoid closing upstream connection on stale events.
Maxim Dounin <mdounin@mdounin.ru>
parents:
18
diff
changeset
|
409 |
9a4ee6fe1c6d
Keepalive: avoid closing upstream connection on stale events.
Maxim Dounin <mdounin@mdounin.ru>
parents:
18
diff
changeset
|
410 close: |
9a4ee6fe1c6d
Keepalive: avoid closing upstream connection on stale events.
Maxim Dounin <mdounin@mdounin.ru>
parents:
18
diff
changeset
|
411 |
8
565939797f5c
Keepalive: fix connection closing and avoid for loop there.
Maxim Dounin <mdounin@mdounin.ru>
parents:
6
diff
changeset
|
412 item = c->data; |
565939797f5c
Keepalive: fix connection closing and avoid for loop there.
Maxim Dounin <mdounin@mdounin.ru>
parents:
6
diff
changeset
|
413 conf = item->conf; |
1
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
414 |
8
565939797f5c
Keepalive: fix connection closing and avoid for loop there.
Maxim Dounin <mdounin@mdounin.ru>
parents:
6
diff
changeset
|
415 ngx_queue_remove(&item->queue); |
565939797f5c
Keepalive: fix connection closing and avoid for loop there.
Maxim Dounin <mdounin@mdounin.ru>
parents:
6
diff
changeset
|
416 ngx_close_connection(item->connection); |
565939797f5c
Keepalive: fix connection closing and avoid for loop there.
Maxim Dounin <mdounin@mdounin.ru>
parents:
6
diff
changeset
|
417 ngx_queue_insert_head(&conf->free, &item->queue); |
1
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
418 } |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
419 |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
420 |
0
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
421 static void * |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
422 ngx_http_upstream_keepalive_create_conf(ngx_conf_t *cf) |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
423 { |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
424 ngx_http_upstream_keepalive_srv_conf_t *conf; |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
425 |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
426 conf = ngx_pcalloc(cf->pool, |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
427 sizeof(ngx_http_upstream_keepalive_srv_conf_t)); |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
428 if (conf == NULL) { |
18
2054159546d0
Keepalive: fix create_conf to return NULL on errors.
Maxim Dounin <mdounin@mdounin.ru>
parents:
14
diff
changeset
|
429 return NULL; |
0
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
430 } |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
431 |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
432 /* |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
433 * set by ngx_pcalloc(): |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
434 * |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
435 * conf->original_init_upstream = NULL; |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
436 * conf->original_init_peer = NULL; |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
437 */ |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
438 |
1
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
439 conf->max_cached = 1; |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
440 |
0
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
441 return conf; |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
442 } |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
443 |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
444 |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
445 static char * |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
446 ngx_http_upstream_keepalive(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
447 { |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
448 ngx_http_upstream_srv_conf_t *uscf; |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
449 ngx_http_upstream_keepalive_srv_conf_t *kcf; |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
450 |
1
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
451 ngx_int_t n; |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
452 ngx_str_t *value; |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
453 ngx_uint_t i; |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
454 |
0
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
455 uscf = ngx_http_conf_get_module_srv_conf(cf, ngx_http_upstream_module); |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
456 |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
457 kcf = ngx_http_conf_upstream_srv_conf(uscf, |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
458 ngx_http_upstream_keepalive_module); |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
459 |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
460 kcf->original_init_upstream = uscf->peer.init_upstream |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
461 ? uscf->peer.init_upstream |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
462 : ngx_http_upstream_init_round_robin; |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
463 |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
464 uscf->peer.init_upstream = ngx_http_upstream_init_keepalive; |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
465 |
1
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
466 /* read options */ |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
467 |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
468 value = cf->args->elts; |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
469 |
6
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
470 n = ngx_atoi(value[1].data, value[1].len); |
1
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
471 |
6
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
472 if (n == NGX_ERROR || n == 0) { |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
473 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
474 "invalid value \"%V\" in \"%V\" directive", |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
475 &value[1], &cmd->name); |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
476 return NGX_CONF_ERROR; |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
477 } |
1
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
478 |
6
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
479 kcf->max_cached = n; |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
480 |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
481 for (i = 2; i < cf->args->nelts; i++) { |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
482 |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
483 if (ngx_strcmp(value[i].data, "single") == 0) { |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
484 |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
485 kcf->single = 1; |
1
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
486 |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
487 continue; |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
488 } |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
489 |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
490 goto invalid; |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
491 } |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
492 |
0
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
493 return NGX_CONF_OK; |
1
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
494 |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
495 invalid: |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
496 |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
497 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
498 "invalid parameter \"%V\"", &value[i]); |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
499 |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
500 return NGX_CONF_ERROR; |
0
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
501 } |