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