Mercurial > hg > ngx_http_upstream_keepalive
annotate ngx_http_upstream_keepalive_module.c @ 49:32e9e4b4b5e1 draft default tip
Keepalive: remove "master_process off" to match other tests.
While here, remove extra spaces in "daemon off" as they are no longer
logical after "master_process" removal.
author | Maxim Dounin <mdounin@mdounin.ru> |
---|---|
date | Thu, 24 Jan 2013 02:05:31 +0400 |
parents | 489c5d4318ff |
children |
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; |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
14 |
2
8545bbda9e4b
Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
15 ngx_queue_t cache; |
8545bbda9e4b
Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
16 ngx_queue_t free; |
0
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
17 |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
18 ngx_http_upstream_init_pt original_init_upstream; |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
19 ngx_http_upstream_init_peer_pt original_init_peer; |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
20 |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
21 } ngx_http_upstream_keepalive_srv_conf_t; |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
22 |
5 | 23 |
0
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
24 typedef struct { |
1
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
25 ngx_http_upstream_keepalive_srv_conf_t *conf; |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
26 |
11
15530a464dba
Keepalive: don't cache invalid connections.
Maxim Dounin <mdounin@mdounin.ru>
parents:
10
diff
changeset
|
27 ngx_http_upstream_t *upstream; |
15530a464dba
Keepalive: don't cache invalid connections.
Maxim Dounin <mdounin@mdounin.ru>
parents:
10
diff
changeset
|
28 |
0
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
29 void *data; |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
30 |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
31 ngx_event_get_peer_pt original_get_peer; |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
32 ngx_event_free_peer_pt original_free_peer; |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
33 |
29
c7c4b2d68fdf
Keepalive: set_session and save_session callbacks.
Maxim Dounin <mdounin@mdounin.ru>
parents:
28
diff
changeset
|
34 #if (NGX_HTTP_SSL) |
c7c4b2d68fdf
Keepalive: set_session and save_session callbacks.
Maxim Dounin <mdounin@mdounin.ru>
parents:
28
diff
changeset
|
35 ngx_event_set_peer_session_pt original_set_session; |
c7c4b2d68fdf
Keepalive: set_session and save_session callbacks.
Maxim Dounin <mdounin@mdounin.ru>
parents:
28
diff
changeset
|
36 ngx_event_save_peer_session_pt original_save_session; |
c7c4b2d68fdf
Keepalive: set_session and save_session callbacks.
Maxim Dounin <mdounin@mdounin.ru>
parents:
28
diff
changeset
|
37 #endif |
c7c4b2d68fdf
Keepalive: set_session and save_session callbacks.
Maxim Dounin <mdounin@mdounin.ru>
parents:
28
diff
changeset
|
38 |
11
15530a464dba
Keepalive: don't cache invalid connections.
Maxim Dounin <mdounin@mdounin.ru>
parents:
10
diff
changeset
|
39 ngx_uint_t failed; /* unsigned:1 */ |
15530a464dba
Keepalive: don't cache invalid connections.
Maxim Dounin <mdounin@mdounin.ru>
parents:
10
diff
changeset
|
40 |
0
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
41 } ngx_http_upstream_keepalive_peer_data_t; |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
42 |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
43 |
8
565939797f5c
Keepalive: fix connection closing and avoid for loop there.
Maxim Dounin <mdounin@mdounin.ru>
parents:
6
diff
changeset
|
44 typedef struct { |
565939797f5c
Keepalive: fix connection closing and avoid for loop there.
Maxim Dounin <mdounin@mdounin.ru>
parents:
6
diff
changeset
|
45 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
|
46 |
565939797f5c
Keepalive: fix connection closing and avoid for loop there.
Maxim Dounin <mdounin@mdounin.ru>
parents:
6
diff
changeset
|
47 ngx_queue_t queue; |
565939797f5c
Keepalive: fix connection closing and avoid for loop there.
Maxim Dounin <mdounin@mdounin.ru>
parents:
6
diff
changeset
|
48 ngx_connection_t *connection; |
565939797f5c
Keepalive: fix connection closing and avoid for loop there.
Maxim Dounin <mdounin@mdounin.ru>
parents:
6
diff
changeset
|
49 |
565939797f5c
Keepalive: fix connection closing and avoid for loop there.
Maxim Dounin <mdounin@mdounin.ru>
parents:
6
diff
changeset
|
50 socklen_t socklen; |
565939797f5c
Keepalive: fix connection closing and avoid for loop there.
Maxim Dounin <mdounin@mdounin.ru>
parents:
6
diff
changeset
|
51 struct sockaddr_storage sockaddr; |
565939797f5c
Keepalive: fix connection closing and avoid for loop there.
Maxim Dounin <mdounin@mdounin.ru>
parents:
6
diff
changeset
|
52 |
565939797f5c
Keepalive: fix connection closing and avoid for loop there.
Maxim Dounin <mdounin@mdounin.ru>
parents:
6
diff
changeset
|
53 } 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
|
54 |
565939797f5c
Keepalive: fix connection closing and avoid for loop there.
Maxim Dounin <mdounin@mdounin.ru>
parents:
6
diff
changeset
|
55 |
0
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
56 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
|
57 ngx_http_upstream_srv_conf_t *us); |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
58 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
|
59 void *data); |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
60 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
|
61 void *data, ngx_uint_t state); |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
62 |
1
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
63 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
|
64 static void ngx_http_upstream_keepalive_close_handler(ngx_event_t *ev); |
32
9aa0d263f2a7
Keepalive: ssl connection handling.
Maxim Dounin <mdounin@mdounin.ru>
parents:
31
diff
changeset
|
65 static void ngx_http_upstream_keepalive_close(ngx_connection_t *c); |
9aa0d263f2a7
Keepalive: ssl connection handling.
Maxim Dounin <mdounin@mdounin.ru>
parents:
31
diff
changeset
|
66 |
1
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
67 |
29
c7c4b2d68fdf
Keepalive: set_session and save_session callbacks.
Maxim Dounin <mdounin@mdounin.ru>
parents:
28
diff
changeset
|
68 #if (NGX_HTTP_SSL) |
c7c4b2d68fdf
Keepalive: set_session and save_session callbacks.
Maxim Dounin <mdounin@mdounin.ru>
parents:
28
diff
changeset
|
69 static ngx_int_t ngx_http_upstream_keepalive_set_session( |
c7c4b2d68fdf
Keepalive: set_session and save_session callbacks.
Maxim Dounin <mdounin@mdounin.ru>
parents:
28
diff
changeset
|
70 ngx_peer_connection_t *pc, void *data); |
c7c4b2d68fdf
Keepalive: set_session and save_session callbacks.
Maxim Dounin <mdounin@mdounin.ru>
parents:
28
diff
changeset
|
71 static void ngx_http_upstream_keepalive_save_session(ngx_peer_connection_t *pc, |
c7c4b2d68fdf
Keepalive: set_session and save_session callbacks.
Maxim Dounin <mdounin@mdounin.ru>
parents:
28
diff
changeset
|
72 void *data); |
c7c4b2d68fdf
Keepalive: set_session and save_session callbacks.
Maxim Dounin <mdounin@mdounin.ru>
parents:
28
diff
changeset
|
73 #endif |
c7c4b2d68fdf
Keepalive: set_session and save_session callbacks.
Maxim Dounin <mdounin@mdounin.ru>
parents:
28
diff
changeset
|
74 |
0
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
75 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
|
76 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
|
77 void *conf); |
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_command_t ngx_http_upstream_keepalive_commands[] = { |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
81 |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
82 { ngx_string("keepalive"), |
6
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
83 NGX_HTTP_UPS_CONF|NGX_CONF_TAKE12, |
0
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
84 ngx_http_upstream_keepalive, |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
85 0, |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
86 0, |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
87 NULL }, |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
88 |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
89 ngx_null_command |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
90 }; |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
91 |
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 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
|
94 NULL, /* preconfiguration */ |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
95 NULL, /* postconfiguration */ |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
96 |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
97 NULL, /* create main configuration */ |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
98 NULL, /* init main configuration */ |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
99 |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
100 ngx_http_upstream_keepalive_create_conf, /* create server configuration */ |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
101 NULL, /* merge server configuration */ |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
102 |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
103 NULL, /* create location configuration */ |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
104 NULL /* merge location configuration */ |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
105 }; |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
106 |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
107 |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
108 ngx_module_t ngx_http_upstream_keepalive_module = { |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
109 NGX_MODULE_V1, |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
110 &ngx_http_upstream_keepalive_module_ctx, /* module context */ |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
111 ngx_http_upstream_keepalive_commands, /* module directives */ |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
112 NGX_HTTP_MODULE, /* module type */ |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
113 NULL, /* init master */ |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
114 NULL, /* init module */ |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
115 NULL, /* init process */ |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
116 NULL, /* init thread */ |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
117 NULL, /* exit thread */ |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
118 NULL, /* exit process */ |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
119 NULL, /* exit master */ |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
120 NGX_MODULE_V1_PADDING |
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 |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
123 |
41
17b2dbbbce98
Keepalive: add missing static keyword.
Maxim Dounin <mdounin@mdounin.ru>
parents:
38
diff
changeset
|
124 static ngx_int_t |
0
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
125 ngx_http_upstream_init_keepalive(ngx_conf_t *cf, |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
126 ngx_http_upstream_srv_conf_t *us) |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
127 { |
2
8545bbda9e4b
Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
128 ngx_uint_t i; |
0
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
129 ngx_http_upstream_keepalive_srv_conf_t *kcf; |
2
8545bbda9e4b
Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
130 ngx_http_upstream_keepalive_cache_t *cached; |
0
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
131 |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
132 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, cf->log, 0, |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
133 "init keepalive"); |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
134 |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
135 kcf = ngx_http_conf_upstream_srv_conf(us, |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
136 ngx_http_upstream_keepalive_module); |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
137 |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
138 if (kcf->original_init_upstream(cf, us) != NGX_OK) { |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
139 return NGX_ERROR; |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
140 } |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
141 |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
142 kcf->original_init_peer = us->peer.init; |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
143 |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
144 us->peer.init = ngx_http_upstream_init_keepalive_peer; |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
145 |
2
8545bbda9e4b
Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
146 /* allocate cache items and add to free queue */ |
8545bbda9e4b
Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
147 |
8545bbda9e4b
Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
148 cached = ngx_pcalloc(cf->pool, |
8545bbda9e4b
Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
149 sizeof(ngx_http_upstream_keepalive_cache_t) * kcf->max_cached); |
8545bbda9e4b
Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
150 if (cached == NULL) { |
1
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
151 return NGX_ERROR; |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
152 } |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
153 |
2
8545bbda9e4b
Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
154 ngx_queue_init(&kcf->cache); |
8545bbda9e4b
Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
155 ngx_queue_init(&kcf->free); |
8545bbda9e4b
Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
156 |
8545bbda9e4b
Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
157 for (i = 0; i < kcf->max_cached; i++) { |
8545bbda9e4b
Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
158 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
|
159 cached[i].conf = kcf; |
2
8545bbda9e4b
Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
160 } |
1
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
161 |
0
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
162 return NGX_OK; |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
163 } |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
164 |
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 static ngx_int_t |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
167 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
|
168 ngx_http_upstream_srv_conf_t *us) |
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 ngx_http_upstream_keepalive_peer_data_t *kp; |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
171 ngx_http_upstream_keepalive_srv_conf_t *kcf; |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
172 |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
173 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
|
174 "init keepalive peer"); |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
175 |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
176 kcf = ngx_http_conf_upstream_srv_conf(us, |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
177 ngx_http_upstream_keepalive_module); |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
178 |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
179 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
|
180 if (kp == NULL) { |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
181 return NGX_ERROR; |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
182 } |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
183 |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
184 if (kcf->original_init_peer(r, us) != NGX_OK) { |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
185 return NGX_ERROR; |
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 |
1
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
188 kp->conf = kcf; |
11
15530a464dba
Keepalive: don't cache invalid connections.
Maxim Dounin <mdounin@mdounin.ru>
parents:
10
diff
changeset
|
189 kp->upstream = r->upstream; |
0
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
190 kp->data = r->upstream->peer.data; |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
191 kp->original_get_peer = r->upstream->peer.get; |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
192 kp->original_free_peer = r->upstream->peer.free; |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
193 |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
194 r->upstream->peer.data = kp; |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
195 r->upstream->peer.get = ngx_http_upstream_get_keepalive_peer; |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
196 r->upstream->peer.free = ngx_http_upstream_free_keepalive_peer; |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
197 |
29
c7c4b2d68fdf
Keepalive: set_session and save_session callbacks.
Maxim Dounin <mdounin@mdounin.ru>
parents:
28
diff
changeset
|
198 #if (NGX_HTTP_SSL) |
c7c4b2d68fdf
Keepalive: set_session and save_session callbacks.
Maxim Dounin <mdounin@mdounin.ru>
parents:
28
diff
changeset
|
199 kp->original_set_session = r->upstream->peer.set_session; |
c7c4b2d68fdf
Keepalive: set_session and save_session callbacks.
Maxim Dounin <mdounin@mdounin.ru>
parents:
28
diff
changeset
|
200 kp->original_save_session = r->upstream->peer.save_session; |
c7c4b2d68fdf
Keepalive: set_session and save_session callbacks.
Maxim Dounin <mdounin@mdounin.ru>
parents:
28
diff
changeset
|
201 r->upstream->peer.set_session = ngx_http_upstream_keepalive_set_session; |
c7c4b2d68fdf
Keepalive: set_session and save_session callbacks.
Maxim Dounin <mdounin@mdounin.ru>
parents:
28
diff
changeset
|
202 r->upstream->peer.save_session = ngx_http_upstream_keepalive_save_session; |
c7c4b2d68fdf
Keepalive: set_session and save_session callbacks.
Maxim Dounin <mdounin@mdounin.ru>
parents:
28
diff
changeset
|
203 #endif |
c7c4b2d68fdf
Keepalive: set_session and save_session callbacks.
Maxim Dounin <mdounin@mdounin.ru>
parents:
28
diff
changeset
|
204 |
0
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
205 return NGX_OK; |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
206 } |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
207 |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
208 |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
209 static ngx_int_t |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
210 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
|
211 { |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
212 ngx_http_upstream_keepalive_peer_data_t *kp = data; |
2
8545bbda9e4b
Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
213 ngx_http_upstream_keepalive_cache_t *item; |
0
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
214 |
6
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
215 ngx_int_t rc; |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
216 ngx_queue_t *q, *cache; |
5 | 217 ngx_connection_t *c; |
1
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
218 |
0
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
219 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, pc->log, 0, |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
220 "get keepalive peer"); |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
221 |
11
15530a464dba
Keepalive: don't cache invalid connections.
Maxim Dounin <mdounin@mdounin.ru>
parents:
10
diff
changeset
|
222 kp->failed = 0; |
15530a464dba
Keepalive: don't cache invalid connections.
Maxim Dounin <mdounin@mdounin.ru>
parents:
10
diff
changeset
|
223 |
45
489c5d4318ff
Keepalive: "single" parameter deprecated.
Maxim Dounin <mdounin@mdounin.ru>
parents:
42
diff
changeset
|
224 /* ask balancer */ |
1
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
225 |
6
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
226 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
|
227 |
45
489c5d4318ff
Keepalive: "single" parameter deprecated.
Maxim Dounin <mdounin@mdounin.ru>
parents:
42
diff
changeset
|
228 if (rc != NGX_OK) { |
6
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
229 return rc; |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
230 } |
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 /* search cache for suitable connection */ |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
233 |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
234 cache = &kp->conf->cache; |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
235 |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
236 for (q = ngx_queue_head(cache); |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
237 q != ngx_queue_sentinel(cache); |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
238 q = ngx_queue_next(q)) |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
239 { |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
240 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
|
241 c = item->connection; |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
242 |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
243 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
|
244 item->socklen, pc->socklen) |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
245 == 0) |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
246 { |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
247 ngx_queue_remove(q); |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
248 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
|
249 |
28
baf671881a8d
Keepalive: log connection used.
Maxim Dounin <mdounin@mdounin.ru>
parents:
26
diff
changeset
|
250 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0, |
baf671881a8d
Keepalive: log connection used.
Maxim Dounin <mdounin@mdounin.ru>
parents:
26
diff
changeset
|
251 "get keepalive peer: using connection %p", c); |
baf671881a8d
Keepalive: log connection used.
Maxim Dounin <mdounin@mdounin.ru>
parents:
26
diff
changeset
|
252 |
6
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
253 c->idle = 0; |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
254 c->log = pc->log; |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
255 c->read->log = pc->log; |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
256 c->write->log = pc->log; |
32
9aa0d263f2a7
Keepalive: ssl connection handling.
Maxim Dounin <mdounin@mdounin.ru>
parents:
31
diff
changeset
|
257 #if (NGX_UPSTREAM_KEEPALIVE_PATCHED) |
9aa0d263f2a7
Keepalive: ssl connection handling.
Maxim Dounin <mdounin@mdounin.ru>
parents:
31
diff
changeset
|
258 c->pool->log = pc->log; |
9aa0d263f2a7
Keepalive: ssl connection handling.
Maxim Dounin <mdounin@mdounin.ru>
parents:
31
diff
changeset
|
259 #endif |
6
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 pc->connection = c; |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
262 pc->cached = 1; |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
263 |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
264 return NGX_DONE; |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
265 } |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
266 } |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
267 |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
268 return NGX_OK; |
0
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
269 } |
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 |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
272 static void |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
273 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
|
274 ngx_uint_t state) |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
275 { |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
276 ngx_http_upstream_keepalive_peer_data_t *kp = data; |
2
8545bbda9e4b
Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
277 ngx_http_upstream_keepalive_cache_t *item; |
0
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
278 |
31
78fd926c306d
Keepalive: reduce indentation, no functional changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
30
diff
changeset
|
279 #if !(NGX_UPSTREAM_KEEPALIVE_PATCHED) |
11
15530a464dba
Keepalive: don't cache invalid connections.
Maxim Dounin <mdounin@mdounin.ru>
parents:
10
diff
changeset
|
280 ngx_uint_t status; |
31
78fd926c306d
Keepalive: reduce indentation, no functional changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
30
diff
changeset
|
281 #endif |
11
15530a464dba
Keepalive: don't cache invalid connections.
Maxim Dounin <mdounin@mdounin.ru>
parents:
10
diff
changeset
|
282 ngx_queue_t *q; |
15530a464dba
Keepalive: don't cache invalid connections.
Maxim Dounin <mdounin@mdounin.ru>
parents:
10
diff
changeset
|
283 ngx_connection_t *c; |
15530a464dba
Keepalive: don't cache invalid connections.
Maxim Dounin <mdounin@mdounin.ru>
parents:
10
diff
changeset
|
284 ngx_http_upstream_t *u; |
1
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
285 |
0
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
286 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, pc->log, 0, |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
287 "free keepalive peer"); |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
288 |
11
15530a464dba
Keepalive: don't cache invalid connections.
Maxim Dounin <mdounin@mdounin.ru>
parents:
10
diff
changeset
|
289 /* 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
|
290 |
15530a464dba
Keepalive: don't cache invalid connections.
Maxim Dounin <mdounin@mdounin.ru>
parents:
10
diff
changeset
|
291 if (state & NGX_PEER_FAILED) { |
15530a464dba
Keepalive: don't cache invalid connections.
Maxim Dounin <mdounin@mdounin.ru>
parents:
10
diff
changeset
|
292 kp->failed = 1; |
15530a464dba
Keepalive: don't cache invalid connections.
Maxim Dounin <mdounin@mdounin.ru>
parents:
10
diff
changeset
|
293 } |
15530a464dba
Keepalive: don't cache invalid connections.
Maxim Dounin <mdounin@mdounin.ru>
parents:
10
diff
changeset
|
294 |
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 * cache valid connections |
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 * 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
|
299 * 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
|
300 * 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
|
301 * 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
|
302 * |
30
c5b498c5aa3c
Keepalive: update comments, style.
Maxim Dounin <mdounin@mdounin.ru>
parents:
29
diff
changeset
|
303 * With experimental patches we are able to cache other connections as |
c5b498c5aa3c
Keepalive: update comments, style.
Maxim Dounin <mdounin@mdounin.ru>
parents:
29
diff
changeset
|
304 * well. Connection status is signalled via u->keepalive flag. |
11
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 |
15530a464dba
Keepalive: don't cache invalid connections.
Maxim Dounin <mdounin@mdounin.ru>
parents:
10
diff
changeset
|
307 u = kp->upstream; |
26
cb15f6f4d820
Keepalive: don't cache timed out connections.
Maxim Dounin <mdounin@mdounin.ru>
parents:
24
diff
changeset
|
308 c = pc->connection; |
31
78fd926c306d
Keepalive: reduce indentation, no functional changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
30
diff
changeset
|
309 |
78fd926c306d
Keepalive: reduce indentation, no functional changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
30
diff
changeset
|
310 if (kp->failed |
78fd926c306d
Keepalive: reduce indentation, no functional changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
30
diff
changeset
|
311 || c == NULL |
33
52ca695446d3
Keepalive: more connection validity checks.
Maxim Dounin <mdounin@mdounin.ru>
parents:
32
diff
changeset
|
312 || c->read->eof |
52ca695446d3
Keepalive: more connection validity checks.
Maxim Dounin <mdounin@mdounin.ru>
parents:
32
diff
changeset
|
313 || c->read->error |
31
78fd926c306d
Keepalive: reduce indentation, no functional changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
30
diff
changeset
|
314 || c->read->timedout |
33
52ca695446d3
Keepalive: more connection validity checks.
Maxim Dounin <mdounin@mdounin.ru>
parents:
32
diff
changeset
|
315 || c->write->error |
31
78fd926c306d
Keepalive: reduce indentation, no functional changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
30
diff
changeset
|
316 || c->write->timedout) |
78fd926c306d
Keepalive: reduce indentation, no functional changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
30
diff
changeset
|
317 { |
78fd926c306d
Keepalive: reduce indentation, no functional changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
30
diff
changeset
|
318 goto invalid; |
78fd926c306d
Keepalive: reduce indentation, no functional changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
30
diff
changeset
|
319 } |
78fd926c306d
Keepalive: reduce indentation, no functional changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
30
diff
changeset
|
320 |
78fd926c306d
Keepalive: reduce indentation, no functional changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
30
diff
changeset
|
321 #if (NGX_UPSTREAM_KEEPALIVE_PATCHED) |
78fd926c306d
Keepalive: reduce indentation, no functional changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
30
diff
changeset
|
322 |
78fd926c306d
Keepalive: reduce indentation, no functional changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
30
diff
changeset
|
323 if (!u->keepalive) { |
78fd926c306d
Keepalive: reduce indentation, no functional changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
30
diff
changeset
|
324 goto invalid; |
78fd926c306d
Keepalive: reduce indentation, no functional changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
30
diff
changeset
|
325 } |
78fd926c306d
Keepalive: reduce indentation, no functional changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
30
diff
changeset
|
326 |
78fd926c306d
Keepalive: reduce indentation, no functional changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
30
diff
changeset
|
327 #else |
78fd926c306d
Keepalive: reduce indentation, no functional changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
30
diff
changeset
|
328 |
11
15530a464dba
Keepalive: don't cache invalid connections.
Maxim Dounin <mdounin@mdounin.ru>
parents:
10
diff
changeset
|
329 status = u->headers_in.status_n; |
15530a464dba
Keepalive: don't cache invalid connections.
Maxim Dounin <mdounin@mdounin.ru>
parents:
10
diff
changeset
|
330 |
31
78fd926c306d
Keepalive: reduce indentation, no functional changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
30
diff
changeset
|
331 if (!(status == NGX_HTTP_NOT_FOUND |
78fd926c306d
Keepalive: reduce indentation, no functional changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
30
diff
changeset
|
332 || (status == NGX_HTTP_OK && u->header_sent && u->length == 0))) |
78fd926c306d
Keepalive: reduce indentation, no functional changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
30
diff
changeset
|
333 { |
78fd926c306d
Keepalive: reduce indentation, no functional changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
30
diff
changeset
|
334 goto invalid; |
78fd926c306d
Keepalive: reduce indentation, no functional changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
30
diff
changeset
|
335 } |
78fd926c306d
Keepalive: reduce indentation, no functional changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
30
diff
changeset
|
336 |
37
4574b97220fb
Keepalive: unbreak build without --with-http_ssl_module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
33
diff
changeset
|
337 #if (NGX_HTTP_SSL) |
4574b97220fb
Keepalive: unbreak build without --with-http_ssl_module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
33
diff
changeset
|
338 |
32
9aa0d263f2a7
Keepalive: ssl connection handling.
Maxim Dounin <mdounin@mdounin.ru>
parents:
31
diff
changeset
|
339 /* |
9aa0d263f2a7
Keepalive: ssl connection handling.
Maxim Dounin <mdounin@mdounin.ru>
parents:
31
diff
changeset
|
340 * to cache ssl connections separate pool for peer connection is |
9aa0d263f2a7
Keepalive: ssl connection handling.
Maxim Dounin <mdounin@mdounin.ru>
parents:
31
diff
changeset
|
341 * required, which is only available with patches |
9aa0d263f2a7
Keepalive: ssl connection handling.
Maxim Dounin <mdounin@mdounin.ru>
parents:
31
diff
changeset
|
342 */ |
9aa0d263f2a7
Keepalive: ssl connection handling.
Maxim Dounin <mdounin@mdounin.ru>
parents:
31
diff
changeset
|
343 |
9aa0d263f2a7
Keepalive: ssl connection handling.
Maxim Dounin <mdounin@mdounin.ru>
parents:
31
diff
changeset
|
344 if (c->ssl) { |
9aa0d263f2a7
Keepalive: ssl connection handling.
Maxim Dounin <mdounin@mdounin.ru>
parents:
31
diff
changeset
|
345 goto invalid; |
9aa0d263f2a7
Keepalive: ssl connection handling.
Maxim Dounin <mdounin@mdounin.ru>
parents:
31
diff
changeset
|
346 } |
9aa0d263f2a7
Keepalive: ssl connection handling.
Maxim Dounin <mdounin@mdounin.ru>
parents:
31
diff
changeset
|
347 |
14
28af4b0b32c1
Keepalive: experimental fastcgi support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
11
diff
changeset
|
348 #endif |
31
78fd926c306d
Keepalive: reduce indentation, no functional changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
30
diff
changeset
|
349 |
37
4574b97220fb
Keepalive: unbreak build without --with-http_ssl_module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
33
diff
changeset
|
350 #endif |
4574b97220fb
Keepalive: unbreak build without --with-http_ssl_module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
33
diff
changeset
|
351 |
33
52ca695446d3
Keepalive: more connection validity checks.
Maxim Dounin <mdounin@mdounin.ru>
parents:
32
diff
changeset
|
352 if (ngx_handle_read_event(c->read, 0) != NGX_OK) { |
52ca695446d3
Keepalive: more connection validity checks.
Maxim Dounin <mdounin@mdounin.ru>
parents:
32
diff
changeset
|
353 goto invalid; |
52ca695446d3
Keepalive: more connection validity checks.
Maxim Dounin <mdounin@mdounin.ru>
parents:
32
diff
changeset
|
354 } |
52ca695446d3
Keepalive: more connection validity checks.
Maxim Dounin <mdounin@mdounin.ru>
parents:
32
diff
changeset
|
355 |
31
78fd926c306d
Keepalive: reduce indentation, no functional changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
30
diff
changeset
|
356 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0, |
78fd926c306d
Keepalive: reduce indentation, no functional changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
30
diff
changeset
|
357 "free keepalive peer: saving connection %p", c); |
10
06bd0e50e696
Keepalive: log saving connection.
Maxim Dounin <mdounin@mdounin.ru>
parents:
8
diff
changeset
|
358 |
31
78fd926c306d
Keepalive: reduce indentation, no functional changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
30
diff
changeset
|
359 if (ngx_queue_empty(&kp->conf->free)) { |
3
42e64900483b
Keepalive: always save connections to cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
360 |
31
78fd926c306d
Keepalive: reduce indentation, no functional changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
30
diff
changeset
|
361 q = ngx_queue_last(&kp->conf->cache); |
78fd926c306d
Keepalive: reduce indentation, no functional changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
30
diff
changeset
|
362 ngx_queue_remove(q); |
3
42e64900483b
Keepalive: always save connections to cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
363 |
31
78fd926c306d
Keepalive: reduce indentation, no functional changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
30
diff
changeset
|
364 item = ngx_queue_data(q, ngx_http_upstream_keepalive_cache_t, queue); |
78fd926c306d
Keepalive: reduce indentation, no functional changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
30
diff
changeset
|
365 |
32
9aa0d263f2a7
Keepalive: ssl connection handling.
Maxim Dounin <mdounin@mdounin.ru>
parents:
31
diff
changeset
|
366 ngx_http_upstream_keepalive_close(item->connection); |
3
42e64900483b
Keepalive: always save connections to cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
367 |
31
78fd926c306d
Keepalive: reduce indentation, no functional changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
30
diff
changeset
|
368 } else { |
78fd926c306d
Keepalive: reduce indentation, no functional changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
30
diff
changeset
|
369 q = ngx_queue_head(&kp->conf->free); |
78fd926c306d
Keepalive: reduce indentation, no functional changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
30
diff
changeset
|
370 ngx_queue_remove(q); |
3
42e64900483b
Keepalive: always save connections to cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
371 |
31
78fd926c306d
Keepalive: reduce indentation, no functional changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
30
diff
changeset
|
372 item = ngx_queue_data(q, ngx_http_upstream_keepalive_cache_t, queue); |
78fd926c306d
Keepalive: reduce indentation, no functional changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
30
diff
changeset
|
373 } |
3
42e64900483b
Keepalive: always save connections to cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
374 |
31
78fd926c306d
Keepalive: reduce indentation, no functional changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
30
diff
changeset
|
375 item->connection = c; |
78fd926c306d
Keepalive: reduce indentation, no functional changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
30
diff
changeset
|
376 ngx_queue_insert_head(&kp->conf->cache, q); |
2
8545bbda9e4b
Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
377 |
31
78fd926c306d
Keepalive: reduce indentation, no functional changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
30
diff
changeset
|
378 pc->connection = NULL; |
1
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
379 |
31
78fd926c306d
Keepalive: reduce indentation, no functional changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
30
diff
changeset
|
380 if (c->read->timer_set) { |
78fd926c306d
Keepalive: reduce indentation, no functional changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
30
diff
changeset
|
381 ngx_del_timer(c->read); |
78fd926c306d
Keepalive: reduce indentation, no functional changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
30
diff
changeset
|
382 } |
78fd926c306d
Keepalive: reduce indentation, no functional changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
30
diff
changeset
|
383 if (c->write->timer_set) { |
78fd926c306d
Keepalive: reduce indentation, no functional changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
30
diff
changeset
|
384 ngx_del_timer(c->write); |
78fd926c306d
Keepalive: reduce indentation, no functional changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
30
diff
changeset
|
385 } |
1
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
386 |
31
78fd926c306d
Keepalive: reduce indentation, no functional changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
30
diff
changeset
|
387 c->write->handler = ngx_http_upstream_keepalive_dummy_handler; |
78fd926c306d
Keepalive: reduce indentation, no functional changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
30
diff
changeset
|
388 c->read->handler = ngx_http_upstream_keepalive_close_handler; |
1
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
389 |
31
78fd926c306d
Keepalive: reduce indentation, no functional changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
30
diff
changeset
|
390 c->data = item; |
78fd926c306d
Keepalive: reduce indentation, no functional changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
30
diff
changeset
|
391 c->idle = 1; |
78fd926c306d
Keepalive: reduce indentation, no functional changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
30
diff
changeset
|
392 c->log = ngx_cycle->log; |
78fd926c306d
Keepalive: reduce indentation, no functional changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
30
diff
changeset
|
393 c->read->log = ngx_cycle->log; |
78fd926c306d
Keepalive: reduce indentation, no functional changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
30
diff
changeset
|
394 c->write->log = ngx_cycle->log; |
32
9aa0d263f2a7
Keepalive: ssl connection handling.
Maxim Dounin <mdounin@mdounin.ru>
parents:
31
diff
changeset
|
395 #if (NGX_UPSTREAM_KEEPALIVE_PATCHED) |
9aa0d263f2a7
Keepalive: ssl connection handling.
Maxim Dounin <mdounin@mdounin.ru>
parents:
31
diff
changeset
|
396 c->pool->log = ngx_cycle->log; |
9aa0d263f2a7
Keepalive: ssl connection handling.
Maxim Dounin <mdounin@mdounin.ru>
parents:
31
diff
changeset
|
397 #endif |
6
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
398 |
31
78fd926c306d
Keepalive: reduce indentation, no functional changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
30
diff
changeset
|
399 item->socklen = pc->socklen; |
78fd926c306d
Keepalive: reduce indentation, no functional changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
30
diff
changeset
|
400 ngx_memcpy(&item->sockaddr, pc->sockaddr, pc->socklen); |
78fd926c306d
Keepalive: reduce indentation, no functional changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
30
diff
changeset
|
401 |
42
c53e018dbcf5
Keepalive: do not reject connections with ready flag set.
Maxim Dounin <mdounin@mdounin.ru>
parents:
41
diff
changeset
|
402 if (c->read->ready) { |
c53e018dbcf5
Keepalive: do not reject connections with ready flag set.
Maxim Dounin <mdounin@mdounin.ru>
parents:
41
diff
changeset
|
403 ngx_http_upstream_keepalive_close_handler(c->read); |
c53e018dbcf5
Keepalive: do not reject connections with ready flag set.
Maxim Dounin <mdounin@mdounin.ru>
parents:
41
diff
changeset
|
404 } |
c53e018dbcf5
Keepalive: do not reject connections with ready flag set.
Maxim Dounin <mdounin@mdounin.ru>
parents:
41
diff
changeset
|
405 |
31
78fd926c306d
Keepalive: reduce indentation, no functional changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
30
diff
changeset
|
406 invalid: |
1
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
407 |
38
7e67b2e897df
Keepalive: unbreak build under win32.
Maxim Dounin <mdounin@mdounin.ru>
parents:
37
diff
changeset
|
408 kp->original_free_peer(pc, kp->data, state); |
0
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
409 } |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
410 |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
411 |
1
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
412 static void |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
413 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
|
414 { |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
415 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
|
416 "keepalive dummy handler"); |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
417 } |
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 static void |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
421 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
|
422 { |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
423 ngx_http_upstream_keepalive_srv_conf_t *conf; |
2
8545bbda9e4b
Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
424 ngx_http_upstream_keepalive_cache_t *item; |
1
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
425 |
21
9a4ee6fe1c6d
Keepalive: avoid closing upstream connection on stale events.
Maxim Dounin <mdounin@mdounin.ru>
parents:
18
diff
changeset
|
426 int n; |
9a4ee6fe1c6d
Keepalive: avoid closing upstream connection on stale events.
Maxim Dounin <mdounin@mdounin.ru>
parents:
18
diff
changeset
|
427 char buf[1]; |
1
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
428 ngx_connection_t *c; |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
429 |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
430 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
|
431 "keepalive close handler"); |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
432 |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
433 c = ev->data; |
21
9a4ee6fe1c6d
Keepalive: avoid closing upstream connection on stale events.
Maxim Dounin <mdounin@mdounin.ru>
parents:
18
diff
changeset
|
434 |
24
2ee28064a04a
Keepalive: correctly close connections on gracefull shutdown.
Maxim Dounin <mdounin@mdounin.ru>
parents:
21
diff
changeset
|
435 if (c->close) { |
2ee28064a04a
Keepalive: correctly close connections on gracefull shutdown.
Maxim Dounin <mdounin@mdounin.ru>
parents:
21
diff
changeset
|
436 goto close; |
2ee28064a04a
Keepalive: correctly close connections on gracefull shutdown.
Maxim Dounin <mdounin@mdounin.ru>
parents:
21
diff
changeset
|
437 } |
2ee28064a04a
Keepalive: correctly close connections on gracefull shutdown.
Maxim Dounin <mdounin@mdounin.ru>
parents:
21
diff
changeset
|
438 |
21
9a4ee6fe1c6d
Keepalive: avoid closing upstream connection on stale events.
Maxim Dounin <mdounin@mdounin.ru>
parents:
18
diff
changeset
|
439 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
|
440 |
9a4ee6fe1c6d
Keepalive: avoid closing upstream connection on stale events.
Maxim Dounin <mdounin@mdounin.ru>
parents:
18
diff
changeset
|
441 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
|
442 /* stale event */ |
9a4ee6fe1c6d
Keepalive: avoid closing upstream connection on stale events.
Maxim Dounin <mdounin@mdounin.ru>
parents:
18
diff
changeset
|
443 |
9a4ee6fe1c6d
Keepalive: avoid closing upstream connection on stale events.
Maxim Dounin <mdounin@mdounin.ru>
parents:
18
diff
changeset
|
444 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
|
445 goto close; |
9a4ee6fe1c6d
Keepalive: avoid closing upstream connection on stale events.
Maxim Dounin <mdounin@mdounin.ru>
parents:
18
diff
changeset
|
446 } |
9a4ee6fe1c6d
Keepalive: avoid closing upstream connection on stale events.
Maxim Dounin <mdounin@mdounin.ru>
parents:
18
diff
changeset
|
447 |
9a4ee6fe1c6d
Keepalive: avoid closing upstream connection on stale events.
Maxim Dounin <mdounin@mdounin.ru>
parents:
18
diff
changeset
|
448 return; |
9a4ee6fe1c6d
Keepalive: avoid closing upstream connection on stale events.
Maxim Dounin <mdounin@mdounin.ru>
parents:
18
diff
changeset
|
449 } |
9a4ee6fe1c6d
Keepalive: avoid closing upstream connection on stale events.
Maxim Dounin <mdounin@mdounin.ru>
parents:
18
diff
changeset
|
450 |
9a4ee6fe1c6d
Keepalive: avoid closing upstream connection on stale events.
Maxim Dounin <mdounin@mdounin.ru>
parents:
18
diff
changeset
|
451 close: |
9a4ee6fe1c6d
Keepalive: avoid closing upstream connection on stale events.
Maxim Dounin <mdounin@mdounin.ru>
parents:
18
diff
changeset
|
452 |
8
565939797f5c
Keepalive: fix connection closing and avoid for loop there.
Maxim Dounin <mdounin@mdounin.ru>
parents:
6
diff
changeset
|
453 item = c->data; |
565939797f5c
Keepalive: fix connection closing and avoid for loop there.
Maxim Dounin <mdounin@mdounin.ru>
parents:
6
diff
changeset
|
454 conf = item->conf; |
1
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
455 |
32
9aa0d263f2a7
Keepalive: ssl connection handling.
Maxim Dounin <mdounin@mdounin.ru>
parents:
31
diff
changeset
|
456 ngx_http_upstream_keepalive_close(c); |
9aa0d263f2a7
Keepalive: ssl connection handling.
Maxim Dounin <mdounin@mdounin.ru>
parents:
31
diff
changeset
|
457 |
8
565939797f5c
Keepalive: fix connection closing and avoid for loop there.
Maxim Dounin <mdounin@mdounin.ru>
parents:
6
diff
changeset
|
458 ngx_queue_remove(&item->queue); |
565939797f5c
Keepalive: fix connection closing and avoid for loop there.
Maxim Dounin <mdounin@mdounin.ru>
parents:
6
diff
changeset
|
459 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
|
460 } |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
461 |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
462 |
32
9aa0d263f2a7
Keepalive: ssl connection handling.
Maxim Dounin <mdounin@mdounin.ru>
parents:
31
diff
changeset
|
463 static void |
9aa0d263f2a7
Keepalive: ssl connection handling.
Maxim Dounin <mdounin@mdounin.ru>
parents:
31
diff
changeset
|
464 ngx_http_upstream_keepalive_close(ngx_connection_t *c) |
9aa0d263f2a7
Keepalive: ssl connection handling.
Maxim Dounin <mdounin@mdounin.ru>
parents:
31
diff
changeset
|
465 { |
9aa0d263f2a7
Keepalive: ssl connection handling.
Maxim Dounin <mdounin@mdounin.ru>
parents:
31
diff
changeset
|
466 |
9aa0d263f2a7
Keepalive: ssl connection handling.
Maxim Dounin <mdounin@mdounin.ru>
parents:
31
diff
changeset
|
467 #if (NGX_HTTP_SSL) |
9aa0d263f2a7
Keepalive: ssl connection handling.
Maxim Dounin <mdounin@mdounin.ru>
parents:
31
diff
changeset
|
468 |
9aa0d263f2a7
Keepalive: ssl connection handling.
Maxim Dounin <mdounin@mdounin.ru>
parents:
31
diff
changeset
|
469 if (c->ssl) { |
9aa0d263f2a7
Keepalive: ssl connection handling.
Maxim Dounin <mdounin@mdounin.ru>
parents:
31
diff
changeset
|
470 c->ssl->no_wait_shutdown = 1; |
9aa0d263f2a7
Keepalive: ssl connection handling.
Maxim Dounin <mdounin@mdounin.ru>
parents:
31
diff
changeset
|
471 c->ssl->no_send_shutdown = 1; |
9aa0d263f2a7
Keepalive: ssl connection handling.
Maxim Dounin <mdounin@mdounin.ru>
parents:
31
diff
changeset
|
472 |
9aa0d263f2a7
Keepalive: ssl connection handling.
Maxim Dounin <mdounin@mdounin.ru>
parents:
31
diff
changeset
|
473 if (ngx_ssl_shutdown(c) == NGX_AGAIN) { |
9aa0d263f2a7
Keepalive: ssl connection handling.
Maxim Dounin <mdounin@mdounin.ru>
parents:
31
diff
changeset
|
474 c->ssl->handler = ngx_http_upstream_keepalive_close; |
9aa0d263f2a7
Keepalive: ssl connection handling.
Maxim Dounin <mdounin@mdounin.ru>
parents:
31
diff
changeset
|
475 return; |
9aa0d263f2a7
Keepalive: ssl connection handling.
Maxim Dounin <mdounin@mdounin.ru>
parents:
31
diff
changeset
|
476 } |
9aa0d263f2a7
Keepalive: ssl connection handling.
Maxim Dounin <mdounin@mdounin.ru>
parents:
31
diff
changeset
|
477 } |
9aa0d263f2a7
Keepalive: ssl connection handling.
Maxim Dounin <mdounin@mdounin.ru>
parents:
31
diff
changeset
|
478 |
9aa0d263f2a7
Keepalive: ssl connection handling.
Maxim Dounin <mdounin@mdounin.ru>
parents:
31
diff
changeset
|
479 #endif |
9aa0d263f2a7
Keepalive: ssl connection handling.
Maxim Dounin <mdounin@mdounin.ru>
parents:
31
diff
changeset
|
480 |
9aa0d263f2a7
Keepalive: ssl connection handling.
Maxim Dounin <mdounin@mdounin.ru>
parents:
31
diff
changeset
|
481 #if (NGX_UPSTREAM_KEEPALIVE_PATCHED) |
9aa0d263f2a7
Keepalive: ssl connection handling.
Maxim Dounin <mdounin@mdounin.ru>
parents:
31
diff
changeset
|
482 ngx_destroy_pool(c->pool); |
9aa0d263f2a7
Keepalive: ssl connection handling.
Maxim Dounin <mdounin@mdounin.ru>
parents:
31
diff
changeset
|
483 #endif |
9aa0d263f2a7
Keepalive: ssl connection handling.
Maxim Dounin <mdounin@mdounin.ru>
parents:
31
diff
changeset
|
484 ngx_close_connection(c); |
9aa0d263f2a7
Keepalive: ssl connection handling.
Maxim Dounin <mdounin@mdounin.ru>
parents:
31
diff
changeset
|
485 } |
9aa0d263f2a7
Keepalive: ssl connection handling.
Maxim Dounin <mdounin@mdounin.ru>
parents:
31
diff
changeset
|
486 |
9aa0d263f2a7
Keepalive: ssl connection handling.
Maxim Dounin <mdounin@mdounin.ru>
parents:
31
diff
changeset
|
487 |
29
c7c4b2d68fdf
Keepalive: set_session and save_session callbacks.
Maxim Dounin <mdounin@mdounin.ru>
parents:
28
diff
changeset
|
488 #if (NGX_HTTP_SSL) |
c7c4b2d68fdf
Keepalive: set_session and save_session callbacks.
Maxim Dounin <mdounin@mdounin.ru>
parents:
28
diff
changeset
|
489 |
c7c4b2d68fdf
Keepalive: set_session and save_session callbacks.
Maxim Dounin <mdounin@mdounin.ru>
parents:
28
diff
changeset
|
490 static ngx_int_t |
c7c4b2d68fdf
Keepalive: set_session and save_session callbacks.
Maxim Dounin <mdounin@mdounin.ru>
parents:
28
diff
changeset
|
491 ngx_http_upstream_keepalive_set_session(ngx_peer_connection_t *pc, void *data) |
c7c4b2d68fdf
Keepalive: set_session and save_session callbacks.
Maxim Dounin <mdounin@mdounin.ru>
parents:
28
diff
changeset
|
492 { |
c7c4b2d68fdf
Keepalive: set_session and save_session callbacks.
Maxim Dounin <mdounin@mdounin.ru>
parents:
28
diff
changeset
|
493 ngx_http_upstream_keepalive_peer_data_t *kp = data; |
c7c4b2d68fdf
Keepalive: set_session and save_session callbacks.
Maxim Dounin <mdounin@mdounin.ru>
parents:
28
diff
changeset
|
494 |
c7c4b2d68fdf
Keepalive: set_session and save_session callbacks.
Maxim Dounin <mdounin@mdounin.ru>
parents:
28
diff
changeset
|
495 return kp->original_set_session(pc, kp->data); |
c7c4b2d68fdf
Keepalive: set_session and save_session callbacks.
Maxim Dounin <mdounin@mdounin.ru>
parents:
28
diff
changeset
|
496 } |
c7c4b2d68fdf
Keepalive: set_session and save_session callbacks.
Maxim Dounin <mdounin@mdounin.ru>
parents:
28
diff
changeset
|
497 |
c7c4b2d68fdf
Keepalive: set_session and save_session callbacks.
Maxim Dounin <mdounin@mdounin.ru>
parents:
28
diff
changeset
|
498 |
c7c4b2d68fdf
Keepalive: set_session and save_session callbacks.
Maxim Dounin <mdounin@mdounin.ru>
parents:
28
diff
changeset
|
499 static void |
c7c4b2d68fdf
Keepalive: set_session and save_session callbacks.
Maxim Dounin <mdounin@mdounin.ru>
parents:
28
diff
changeset
|
500 ngx_http_upstream_keepalive_save_session(ngx_peer_connection_t *pc, void *data) |
c7c4b2d68fdf
Keepalive: set_session and save_session callbacks.
Maxim Dounin <mdounin@mdounin.ru>
parents:
28
diff
changeset
|
501 { |
c7c4b2d68fdf
Keepalive: set_session and save_session callbacks.
Maxim Dounin <mdounin@mdounin.ru>
parents:
28
diff
changeset
|
502 ngx_http_upstream_keepalive_peer_data_t *kp = data; |
c7c4b2d68fdf
Keepalive: set_session and save_session callbacks.
Maxim Dounin <mdounin@mdounin.ru>
parents:
28
diff
changeset
|
503 |
c7c4b2d68fdf
Keepalive: set_session and save_session callbacks.
Maxim Dounin <mdounin@mdounin.ru>
parents:
28
diff
changeset
|
504 kp->original_save_session(pc, kp->data); |
c7c4b2d68fdf
Keepalive: set_session and save_session callbacks.
Maxim Dounin <mdounin@mdounin.ru>
parents:
28
diff
changeset
|
505 return; |
c7c4b2d68fdf
Keepalive: set_session and save_session callbacks.
Maxim Dounin <mdounin@mdounin.ru>
parents:
28
diff
changeset
|
506 } |
c7c4b2d68fdf
Keepalive: set_session and save_session callbacks.
Maxim Dounin <mdounin@mdounin.ru>
parents:
28
diff
changeset
|
507 |
c7c4b2d68fdf
Keepalive: set_session and save_session callbacks.
Maxim Dounin <mdounin@mdounin.ru>
parents:
28
diff
changeset
|
508 #endif |
c7c4b2d68fdf
Keepalive: set_session and save_session callbacks.
Maxim Dounin <mdounin@mdounin.ru>
parents:
28
diff
changeset
|
509 |
c7c4b2d68fdf
Keepalive: set_session and save_session callbacks.
Maxim Dounin <mdounin@mdounin.ru>
parents:
28
diff
changeset
|
510 |
0
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
511 static void * |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
512 ngx_http_upstream_keepalive_create_conf(ngx_conf_t *cf) |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
513 { |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
514 ngx_http_upstream_keepalive_srv_conf_t *conf; |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
515 |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
516 conf = ngx_pcalloc(cf->pool, |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
517 sizeof(ngx_http_upstream_keepalive_srv_conf_t)); |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
518 if (conf == NULL) { |
18
2054159546d0
Keepalive: fix create_conf to return NULL on errors.
Maxim Dounin <mdounin@mdounin.ru>
parents:
14
diff
changeset
|
519 return NULL; |
0
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
520 } |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
521 |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
522 /* |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
523 * set by ngx_pcalloc(): |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
524 * |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
525 * conf->original_init_upstream = NULL; |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
526 * conf->original_init_peer = NULL; |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
527 */ |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
528 |
1
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
529 conf->max_cached = 1; |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
530 |
0
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
531 return conf; |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
532 } |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
533 |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
534 |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
535 static char * |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
536 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
|
537 { |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
538 ngx_http_upstream_srv_conf_t *uscf; |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
539 ngx_http_upstream_keepalive_srv_conf_t *kcf; |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
540 |
1
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
541 ngx_int_t n; |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
542 ngx_str_t *value; |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
543 ngx_uint_t i; |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
544 |
0
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
545 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
|
546 |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
547 kcf = ngx_http_conf_upstream_srv_conf(uscf, |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
548 ngx_http_upstream_keepalive_module); |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
549 |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
550 kcf->original_init_upstream = uscf->peer.init_upstream |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
551 ? uscf->peer.init_upstream |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
552 : ngx_http_upstream_init_round_robin; |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
553 |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
554 uscf->peer.init_upstream = ngx_http_upstream_init_keepalive; |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
555 |
1
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
556 /* read options */ |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
557 |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
558 value = cf->args->elts; |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
559 |
6
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
560 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
|
561 |
6
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
562 if (n == NGX_ERROR || n == 0) { |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
563 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
|
564 "invalid value \"%V\" in \"%V\" directive", |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
565 &value[1], &cmd->name); |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
566 return NGX_CONF_ERROR; |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
567 } |
1
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
568 |
6
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
569 kcf->max_cached = n; |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
570 |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
571 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
|
572 |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
573 if (ngx_strcmp(value[i].data, "single") == 0) { |
45
489c5d4318ff
Keepalive: "single" parameter deprecated.
Maxim Dounin <mdounin@mdounin.ru>
parents:
42
diff
changeset
|
574 ngx_conf_log_error(NGX_LOG_WARN, cf, 0, |
489c5d4318ff
Keepalive: "single" parameter deprecated.
Maxim Dounin <mdounin@mdounin.ru>
parents:
42
diff
changeset
|
575 "the \"single\" parameter is deprecated"); |
1
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
576 continue; |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
577 } |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
578 |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
579 goto invalid; |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
580 } |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
581 |
0
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
582 return NGX_CONF_OK; |
1
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
583 |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
584 invalid: |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
585 |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
586 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
|
587 "invalid parameter \"%V\"", &value[i]); |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
588 |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
589 return NGX_CONF_ERROR; |
0
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
590 } |