Mercurial > hg > ngx_http_upstream_keepalive
annotate ngx_http_upstream_keepalive_module.c @ 42:c53e018dbcf5
Keepalive: do not reject connections with ready flag set.
Instead, call read event handler explicitly to test if there are actually
any unexpected data. This fixes unbuffered proxy connections not being
cached with epoll and rtsig event methods.
author | Maxim Dounin <mdounin@mdounin.ru> |
---|---|
date | Thu, 08 Sep 2011 17:12:07 +0400 |
parents | 17b2dbbbce98 |
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 } |