Mercurial > hg > ngx_http_upstream_keepalive
annotate ngx_http_upstream_keepalive_module.c @ 8:565939797f5c 0.1
Keepalive: fix connection closing and avoid for loop there.
1. Adding cache item to free queue was missed.
2. Loop over all cached connections isn't optimal, replace it with simple
queue remove at cost of storing config pointer in each cache item.
author | Maxim Dounin <mdounin@mdounin.ru> |
---|---|
date | Fri, 24 Oct 2008 15:51:17 +0400 |
parents | bef88ba0b378 |
children | 06bd0e50e696 |
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 |
0
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
28 void *data; |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
29 |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
30 ngx_event_get_peer_pt original_get_peer; |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
31 ngx_event_free_peer_pt original_free_peer; |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
32 |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
33 } ngx_http_upstream_keepalive_peer_data_t; |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
34 |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
35 |
8
565939797f5c
Keepalive: fix connection closing and avoid for loop there.
Maxim Dounin <mdounin@mdounin.ru>
parents:
6
diff
changeset
|
36 typedef struct { |
565939797f5c
Keepalive: fix connection closing and avoid for loop there.
Maxim Dounin <mdounin@mdounin.ru>
parents:
6
diff
changeset
|
37 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
|
38 |
565939797f5c
Keepalive: fix connection closing and avoid for loop there.
Maxim Dounin <mdounin@mdounin.ru>
parents:
6
diff
changeset
|
39 ngx_queue_t queue; |
565939797f5c
Keepalive: fix connection closing and avoid for loop there.
Maxim Dounin <mdounin@mdounin.ru>
parents:
6
diff
changeset
|
40 ngx_connection_t *connection; |
565939797f5c
Keepalive: fix connection closing and avoid for loop there.
Maxim Dounin <mdounin@mdounin.ru>
parents:
6
diff
changeset
|
41 |
565939797f5c
Keepalive: fix connection closing and avoid for loop there.
Maxim Dounin <mdounin@mdounin.ru>
parents:
6
diff
changeset
|
42 socklen_t socklen; |
565939797f5c
Keepalive: fix connection closing and avoid for loop there.
Maxim Dounin <mdounin@mdounin.ru>
parents:
6
diff
changeset
|
43 struct sockaddr_storage sockaddr; |
565939797f5c
Keepalive: fix connection closing and avoid for loop there.
Maxim Dounin <mdounin@mdounin.ru>
parents:
6
diff
changeset
|
44 |
565939797f5c
Keepalive: fix connection closing and avoid for loop there.
Maxim Dounin <mdounin@mdounin.ru>
parents:
6
diff
changeset
|
45 } 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
|
46 |
565939797f5c
Keepalive: fix connection closing and avoid for loop there.
Maxim Dounin <mdounin@mdounin.ru>
parents:
6
diff
changeset
|
47 |
0
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
48 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
|
49 ngx_http_upstream_srv_conf_t *us); |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
50 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
|
51 void *data); |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
52 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
|
53 void *data, ngx_uint_t state); |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
54 |
1
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
55 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
|
56 static void ngx_http_upstream_keepalive_close_handler(ngx_event_t *ev); |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
57 |
0
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
58 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
|
59 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
|
60 void *conf); |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
61 |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
62 |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
63 static ngx_command_t ngx_http_upstream_keepalive_commands[] = { |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
64 |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
65 { ngx_string("keepalive"), |
6
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
66 NGX_HTTP_UPS_CONF|NGX_CONF_TAKE12, |
0
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
67 ngx_http_upstream_keepalive, |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
68 0, |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
69 0, |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
70 NULL }, |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
71 |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
72 ngx_null_command |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
73 }; |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
74 |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
75 |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
76 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
|
77 NULL, /* preconfiguration */ |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
78 NULL, /* postconfiguration */ |
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 NULL, /* create main configuration */ |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
81 NULL, /* init main configuration */ |
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_http_upstream_keepalive_create_conf, /* create server configuration */ |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
84 NULL, /* merge server configuration */ |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
85 |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
86 NULL, /* create location configuration */ |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
87 NULL /* merge location configuration */ |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
88 }; |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
89 |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
90 |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
91 ngx_module_t ngx_http_upstream_keepalive_module = { |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
92 NGX_MODULE_V1, |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
93 &ngx_http_upstream_keepalive_module_ctx, /* module context */ |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
94 ngx_http_upstream_keepalive_commands, /* module directives */ |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
95 NGX_HTTP_MODULE, /* module type */ |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
96 NULL, /* init master */ |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
97 NULL, /* init module */ |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
98 NULL, /* init process */ |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
99 NULL, /* init thread */ |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
100 NULL, /* exit thread */ |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
101 NULL, /* exit process */ |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
102 NULL, /* exit master */ |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
103 NGX_MODULE_V1_PADDING |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
104 }; |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
105 |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
106 |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
107 ngx_int_t |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
108 ngx_http_upstream_init_keepalive(ngx_conf_t *cf, |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
109 ngx_http_upstream_srv_conf_t *us) |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
110 { |
2
8545bbda9e4b
Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
111 ngx_uint_t i; |
0
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
112 ngx_http_upstream_keepalive_srv_conf_t *kcf; |
2
8545bbda9e4b
Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
113 ngx_http_upstream_keepalive_cache_t *cached; |
0
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
114 |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
115 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, cf->log, 0, |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
116 "init keepalive"); |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
117 |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
118 kcf = ngx_http_conf_upstream_srv_conf(us, |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
119 ngx_http_upstream_keepalive_module); |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
120 |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
121 if (kcf->original_init_upstream(cf, us) != NGX_OK) { |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
122 return NGX_ERROR; |
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 |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
125 kcf->original_init_peer = us->peer.init; |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
126 |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
127 us->peer.init = ngx_http_upstream_init_keepalive_peer; |
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 /* allocate cache items and add to free queue */ |
8545bbda9e4b
Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
130 |
8545bbda9e4b
Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
131 cached = ngx_pcalloc(cf->pool, |
8545bbda9e4b
Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
132 sizeof(ngx_http_upstream_keepalive_cache_t) * kcf->max_cached); |
8545bbda9e4b
Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
133 if (cached == NULL) { |
1
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
134 return NGX_ERROR; |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
135 } |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
136 |
2
8545bbda9e4b
Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
137 ngx_queue_init(&kcf->cache); |
8545bbda9e4b
Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
138 ngx_queue_init(&kcf->free); |
8545bbda9e4b
Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
139 |
8545bbda9e4b
Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
140 for (i = 0; i < kcf->max_cached; i++) { |
8545bbda9e4b
Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
141 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
|
142 cached[i].conf = kcf; |
2
8545bbda9e4b
Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
143 } |
1
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
144 |
0
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
145 return NGX_OK; |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
146 } |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
147 |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
148 |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
149 static ngx_int_t |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
150 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
|
151 ngx_http_upstream_srv_conf_t *us) |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
152 { |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
153 ngx_http_upstream_keepalive_peer_data_t *kp; |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
154 ngx_http_upstream_keepalive_srv_conf_t *kcf; |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
155 |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
156 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
|
157 "init keepalive peer"); |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
158 |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
159 kcf = ngx_http_conf_upstream_srv_conf(us, |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
160 ngx_http_upstream_keepalive_module); |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
161 |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
162 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
|
163 if (kp == NULL) { |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
164 return NGX_ERROR; |
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 if (kcf->original_init_peer(r, us) != NGX_OK) { |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
168 return NGX_ERROR; |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
169 } |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
170 |
1
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
171 kp->conf = kcf; |
0
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
172 kp->data = r->upstream->peer.data; |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
173 kp->original_get_peer = r->upstream->peer.get; |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
174 kp->original_free_peer = r->upstream->peer.free; |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
175 |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
176 r->upstream->peer.data = kp; |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
177 r->upstream->peer.get = ngx_http_upstream_get_keepalive_peer; |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
178 r->upstream->peer.free = ngx_http_upstream_free_keepalive_peer; |
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 return NGX_OK; |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
181 } |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
182 |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
183 |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
184 static ngx_int_t |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
185 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
|
186 { |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
187 ngx_http_upstream_keepalive_peer_data_t *kp = data; |
2
8545bbda9e4b
Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
188 ngx_http_upstream_keepalive_cache_t *item; |
0
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
189 |
6
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
190 ngx_int_t rc; |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
191 ngx_queue_t *q, *cache; |
5 | 192 ngx_connection_t *c; |
1
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
193 |
0
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
194 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, pc->log, 0, |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
195 "get keepalive peer"); |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
196 |
6
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
197 /* single pool of cached connections */ |
1
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
198 |
6
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
199 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
|
200 |
8545bbda9e4b
Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
201 q = ngx_queue_head(&kp->conf->cache); |
8545bbda9e4b
Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
202 ngx_queue_remove(q); |
1
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
203 |
2
8545bbda9e4b
Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
204 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
|
205 c = item->connection; |
8545bbda9e4b
Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
206 |
8545bbda9e4b
Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
207 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
|
208 |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
209 c->idle = 0; |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
210 c->log = pc->log; |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
211 c->read->log = pc->log; |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
212 c->write->log = pc->log; |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
213 |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
214 pc->connection = c; |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
215 pc->cached = 1; |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
216 |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
217 return NGX_DONE; |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
218 } |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
219 |
6
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
220 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
|
221 |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
222 if (kp->conf->single || rc != NGX_OK) { |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
223 return rc; |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
224 } |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
225 |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
226 /* search cache for suitable connection */ |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
227 |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
228 cache = &kp->conf->cache; |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
229 |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
230 for (q = ngx_queue_head(cache); |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
231 q != ngx_queue_sentinel(cache); |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
232 q = ngx_queue_next(q)) |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
233 { |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
234 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
|
235 c = item->connection; |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
236 |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
237 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
|
238 item->socklen, pc->socklen) |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
239 == 0) |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
240 { |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
241 ngx_queue_remove(q); |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
242 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
|
243 |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
244 c->idle = 0; |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
245 c->log = pc->log; |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
246 c->read->log = pc->log; |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
247 c->write->log = pc->log; |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
248 |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
249 pc->connection = c; |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
250 pc->cached = 1; |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
251 |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
252 return NGX_DONE; |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
253 } |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
254 } |
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 return NGX_OK; |
0
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
257 } |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
258 |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
259 |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
260 static void |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
261 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
|
262 ngx_uint_t state) |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
263 { |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
264 ngx_http_upstream_keepalive_peer_data_t *kp = data; |
2
8545bbda9e4b
Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
265 ngx_http_upstream_keepalive_cache_t *item; |
0
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
266 |
2
8545bbda9e4b
Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
267 ngx_queue_t *q; |
1
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
268 ngx_connection_t *c; |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
269 |
0
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
270 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, pc->log, 0, |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
271 "free keepalive peer"); |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
272 |
1
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
273 if (!(state & NGX_PEER_FAILED) |
3
42e64900483b
Keepalive: always save connections to cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
274 && pc->connection != NULL) |
1
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
275 { |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
276 c = pc->connection; |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
277 |
3
42e64900483b
Keepalive: always save connections to cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
278 if (ngx_queue_empty(&kp->conf->free)) { |
42e64900483b
Keepalive: always save connections to cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
279 |
42e64900483b
Keepalive: always save connections to cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
280 q = ngx_queue_last(&kp->conf->cache); |
42e64900483b
Keepalive: always save connections to cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
281 ngx_queue_remove(q); |
42e64900483b
Keepalive: always save connections to cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
282 |
42e64900483b
Keepalive: always save connections to cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
283 item = ngx_queue_data(q, ngx_http_upstream_keepalive_cache_t, |
42e64900483b
Keepalive: always save connections to cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
284 queue); |
42e64900483b
Keepalive: always save connections to cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
285 |
42e64900483b
Keepalive: always save connections to cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
286 ngx_close_connection(item->connection); |
2
8545bbda9e4b
Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
287 |
3
42e64900483b
Keepalive: always save connections to cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
288 } else { |
42e64900483b
Keepalive: always save connections to cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
289 q = ngx_queue_head(&kp->conf->free); |
42e64900483b
Keepalive: always save connections to cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
290 ngx_queue_remove(q); |
42e64900483b
Keepalive: always save connections to cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
291 |
42e64900483b
Keepalive: always save connections to cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
292 item = ngx_queue_data(q, ngx_http_upstream_keepalive_cache_t, |
42e64900483b
Keepalive: always save connections to cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
293 queue); |
42e64900483b
Keepalive: always save connections to cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
294 } |
42e64900483b
Keepalive: always save connections to cache.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
295 |
2
8545bbda9e4b
Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
296 item->connection = c; |
8545bbda9e4b
Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
297 ngx_queue_insert_head(&kp->conf->cache, q); |
8545bbda9e4b
Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
298 |
1
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
299 pc->connection = NULL; |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
300 |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
301 if (c->read->timer_set) { |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
302 ngx_del_timer(c->read); |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
303 } |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
304 if (c->write->timer_set) { |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
305 ngx_del_timer(c->write); |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
306 } |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
307 |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
308 c->write->handler = ngx_http_upstream_keepalive_dummy_handler; |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
309 c->read->handler = ngx_http_upstream_keepalive_close_handler; |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
310 |
8
565939797f5c
Keepalive: fix connection closing and avoid for loop there.
Maxim Dounin <mdounin@mdounin.ru>
parents:
6
diff
changeset
|
311 c->data = item; |
1
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
312 c->idle = 1; |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
313 c->log = ngx_cycle->log; |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
314 c->read->log = ngx_cycle->log; |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
315 c->write->log = ngx_cycle->log; |
6
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
316 |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
317 item->socklen = pc->socklen; |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
318 ngx_memcpy(&item->sockaddr, pc->sockaddr, pc->socklen); |
1
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
319 } |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
320 |
0
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
321 return kp->original_free_peer(pc, kp->data, state); |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
322 } |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
323 |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
324 |
1
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
325 static void |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
326 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
|
327 { |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
328 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
|
329 "keepalive dummy handler"); |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
330 } |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
331 |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
332 |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
333 static void |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
334 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
|
335 { |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
336 ngx_http_upstream_keepalive_srv_conf_t *conf; |
2
8545bbda9e4b
Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
337 ngx_http_upstream_keepalive_cache_t *item; |
1
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
338 |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
339 ngx_connection_t *c; |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
340 |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
341 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
|
342 "keepalive close handler"); |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
343 |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
344 c = ev->data; |
8
565939797f5c
Keepalive: fix connection closing and avoid for loop there.
Maxim Dounin <mdounin@mdounin.ru>
parents:
6
diff
changeset
|
345 item = c->data; |
565939797f5c
Keepalive: fix connection closing and avoid for loop there.
Maxim Dounin <mdounin@mdounin.ru>
parents:
6
diff
changeset
|
346 conf = item->conf; |
1
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
347 |
8
565939797f5c
Keepalive: fix connection closing and avoid for loop there.
Maxim Dounin <mdounin@mdounin.ru>
parents:
6
diff
changeset
|
348 ngx_queue_remove(&item->queue); |
565939797f5c
Keepalive: fix connection closing and avoid for loop there.
Maxim Dounin <mdounin@mdounin.ru>
parents:
6
diff
changeset
|
349 ngx_close_connection(item->connection); |
565939797f5c
Keepalive: fix connection closing and avoid for loop there.
Maxim Dounin <mdounin@mdounin.ru>
parents:
6
diff
changeset
|
350 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
|
351 } |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
352 |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
353 |
0
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
354 static void * |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
355 ngx_http_upstream_keepalive_create_conf(ngx_conf_t *cf) |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
356 { |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
357 ngx_http_upstream_keepalive_srv_conf_t *conf; |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
358 |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
359 conf = ngx_pcalloc(cf->pool, |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
360 sizeof(ngx_http_upstream_keepalive_srv_conf_t)); |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
361 if (conf == NULL) { |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
362 return NGX_CONF_ERROR; |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
363 } |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
364 |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
365 /* |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
366 * set by ngx_pcalloc(): |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
367 * |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
368 * conf->original_init_upstream = NULL; |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
369 * conf->original_init_peer = NULL; |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
370 */ |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
371 |
1
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
372 conf->max_cached = 1; |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
373 |
0
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
374 return conf; |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
375 } |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
376 |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
377 |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
378 static char * |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
379 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
|
380 { |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
381 ngx_http_upstream_srv_conf_t *uscf; |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
382 ngx_http_upstream_keepalive_srv_conf_t *kcf; |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
383 |
1
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
384 ngx_int_t n; |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
385 ngx_str_t *value; |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
386 ngx_uint_t i; |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
387 |
0
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
388 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
|
389 |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
390 kcf = ngx_http_conf_upstream_srv_conf(uscf, |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
391 ngx_http_upstream_keepalive_module); |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
392 |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
393 kcf->original_init_upstream = uscf->peer.init_upstream |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
394 ? uscf->peer.init_upstream |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
395 : ngx_http_upstream_init_round_robin; |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
396 |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
397 uscf->peer.init_upstream = ngx_http_upstream_init_keepalive; |
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
398 |
1
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
399 /* read options */ |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
400 |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
401 value = cf->args->elts; |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
402 |
6
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
403 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
|
404 |
6
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
405 if (n == NGX_ERROR || n == 0) { |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
406 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
|
407 "invalid value \"%V\" in \"%V\" directive", |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
408 &value[1], &cmd->name); |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
409 return NGX_CONF_ERROR; |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
410 } |
1
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
411 |
6
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
412 kcf->max_cached = n; |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
413 |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
414 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
|
415 |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
416 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
|
417 |
bef88ba0b378
Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
418 kcf->single = 1; |
1
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
419 |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
420 continue; |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
421 } |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
422 |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
423 goto invalid; |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
424 } |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
425 |
0
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
426 return NGX_CONF_OK; |
1
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
427 |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
428 invalid: |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
429 |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
430 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
431 "invalid parameter \"%V\"", &value[i]); |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
432 |
ca955a7f651b
Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
433 return NGX_CONF_ERROR; |
0
725ee11164f3
Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
434 } |