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