annotate ngx_http_upstream_keepalive_module.c @ 1:ca955a7f651b

Keepalive: common cache for all backends. Known limitations: Connections cached to the upstream pool as a whole, not to individual backend servers, and therefore load distribution may be less than ideal (especially under light load).
author Maxim Dounin <mdounin@mdounin.ru>
date Wed, 22 Oct 2008 03:52:29 +0400
parents 725ee11164f3
children 8545bbda9e4b
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
11
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
12 typedef struct {
1
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
13 ngx_uint_t max_cached;
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
14 ngx_uint_t last_cached;
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
15
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
16 ngx_connection_t **cached;
0
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
17
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
18 ngx_http_upstream_init_pt original_init_upstream;
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
19 ngx_http_upstream_init_peer_pt original_init_peer;
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
20
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
21 } ngx_http_upstream_keepalive_srv_conf_t;
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
22
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
23 typedef struct {
1
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
24 ngx_http_upstream_keepalive_srv_conf_t *conf;
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
25
0
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
26 void *data;
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
27
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
28 ngx_event_get_peer_pt original_get_peer;
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
29 ngx_event_free_peer_pt original_free_peer;
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
30
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
31 } ngx_http_upstream_keepalive_peer_data_t;
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
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
34 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
35 ngx_http_upstream_srv_conf_t *us);
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
36 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
37 void *data);
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
38 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
39 void *data, ngx_uint_t state);
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
40
1
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
41 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
42 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
43
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
44
0
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
45 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
46 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
47 void *conf);
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
48
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
49
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
50 static ngx_command_t ngx_http_upstream_keepalive_commands[] = {
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
51
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
52 { ngx_string("keepalive"),
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
53 NGX_HTTP_UPS_CONF|NGX_CONF_NOARGS,
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
54 ngx_http_upstream_keepalive,
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
55 0,
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
56 0,
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
57 NULL },
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
58
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
59 ngx_null_command
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
60 };
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_http_module_t ngx_http_upstream_keepalive_module_ctx = {
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
64 NULL, /* preconfiguration */
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
65 NULL, /* postconfiguration */
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
66
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
67 NULL, /* create main configuration */
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
68 NULL, /* init main configuration */
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
69
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
70 ngx_http_upstream_keepalive_create_conf, /* create server configuration */
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
71 NULL, /* merge server configuration */
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
72
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
73 NULL, /* create location configuration */
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
74 NULL /* merge location configuration */
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
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
77
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
78 ngx_module_t ngx_http_upstream_keepalive_module = {
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
79 NGX_MODULE_V1,
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
80 &ngx_http_upstream_keepalive_module_ctx, /* module context */
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
81 ngx_http_upstream_keepalive_commands, /* module directives */
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
82 NGX_HTTP_MODULE, /* module type */
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
83 NULL, /* init master */
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
84 NULL, /* init module */
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
85 NULL, /* init process */
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
86 NULL, /* init thread */
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
87 NULL, /* exit thread */
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
88 NULL, /* exit process */
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
89 NULL, /* exit master */
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
90 NGX_MODULE_V1_PADDING
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 ngx_int_t
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
95 ngx_http_upstream_init_keepalive(ngx_conf_t *cf,
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
96 ngx_http_upstream_srv_conf_t *us)
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 ngx_http_upstream_keepalive_srv_conf_t *kcf;
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
99
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
100 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, cf->log, 0,
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
101 "init keepalive");
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
102
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
103 kcf = ngx_http_conf_upstream_srv_conf(us,
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
104 ngx_http_upstream_keepalive_module);
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 if (kcf->original_init_upstream(cf, us) != NGX_OK) {
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
107 return NGX_ERROR;
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
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
110 kcf->original_init_peer = us->peer.init;
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
111
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
112 us->peer.init = ngx_http_upstream_init_keepalive_peer;
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
113
1
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
114 kcf->cached = ngx_pcalloc(cf->pool,
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
115 sizeof(ngx_connection_t *) * kcf->max_cached);
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
116 if (kcf->cached == NULL) {
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
117 return NGX_ERROR;
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
118 }
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
119
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
120
0
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
121 return NGX_OK;
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
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
125 static ngx_int_t
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
126 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
127 ngx_http_upstream_srv_conf_t *us)
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
128 {
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
129 ngx_http_upstream_keepalive_peer_data_t *kp;
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
130 ngx_http_upstream_keepalive_srv_conf_t *kcf;
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
131
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
132 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
133 "init keepalive peer");
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
134
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
135 kcf = ngx_http_conf_upstream_srv_conf(us,
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
136 ngx_http_upstream_keepalive_module);
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
137
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
138 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
139 if (kp == NULL) {
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 if (kcf->original_init_peer(r, us) != NGX_OK) {
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
144 return NGX_ERROR;
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
145 }
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
146
1
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
147 kp->conf = kcf;
0
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
148 kp->data = r->upstream->peer.data;
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
149 kp->original_get_peer = r->upstream->peer.get;
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
150 kp->original_free_peer = r->upstream->peer.free;
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
151
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
152 r->upstream->peer.data = kp;
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
153 r->upstream->peer.get = ngx_http_upstream_get_keepalive_peer;
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
154 r->upstream->peer.free = ngx_http_upstream_free_keepalive_peer;
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 return NGX_OK;
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
157 }
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
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
160 static ngx_int_t
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
161 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
162 {
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
163 ngx_http_upstream_keepalive_peer_data_t *kp = data;
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
164
1
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
165 ngx_connection_t *c;
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
166
0
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
167 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, pc->log, 0,
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
168 "get keepalive peer");
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
169
1
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
170 /* XXX single pool of cached connections */
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
171
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
172 if (kp->conf->last_cached) {
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
173
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
174 c = kp->conf->cached[--kp->conf->last_cached];
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
175
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
176 c->idle = 0;
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
177 c->log = pc->log;
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
178 c->read->log = pc->log;
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
179 c->write->log = pc->log;
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
180
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
181 pc->connection = c;
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
182 pc->cached = 1;
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
183
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
184 return NGX_DONE;
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
185 }
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
186
0
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
187 return kp->original_get_peer(pc, kp->data);
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
188 }
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
189
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
190
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
191 static void
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
192 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
193 ngx_uint_t state)
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 ngx_http_upstream_keepalive_peer_data_t *kp = data;
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
196
1
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
197 ngx_connection_t *c;
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
198
0
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
199 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, pc->log, 0,
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
200 "free keepalive peer");
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
201
1
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
202 if (!(state & NGX_PEER_FAILED)
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
203 && pc->connection != NULL
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
204 && kp->conf->last_cached < kp->conf->max_cached)
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
205 {
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
206 c = pc->connection;
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
207
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
208 kp->conf->cached[kp->conf->last_cached++] = c;
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
209 pc->connection = NULL;
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
210
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
211 if (c->read->timer_set) {
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
212 ngx_del_timer(c->read);
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 if (c->write->timer_set) {
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
215 ngx_del_timer(c->write);
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
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
218 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
219 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
220
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
221 c->data = kp->conf;
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
222 c->idle = 1;
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
223 c->log = ngx_cycle->log;
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
224 c->read->log = ngx_cycle->log;
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
225 c->write->log = ngx_cycle->log;
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
226 }
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
227
0
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
228 return kp->original_free_peer(pc, kp->data, state);
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
229 }
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
230
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
231
1
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
232 static void
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
233 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
234 {
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
235 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
236 "keepalive dummy handler");
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
237 }
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
238
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
239
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
240 static void
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
241 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
242 {
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
243 ngx_http_upstream_keepalive_srv_conf_t *conf;
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
244
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
245 ngx_uint_t i;
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
246 ngx_connection_t *c;
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 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
249 "keepalive close handler");
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 c = ev->data;
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
252 conf = c->data;
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
253
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
254 for (i = 0; i < conf->last_cached; i++) {
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
255 if (conf->cached[i] == c) {
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
256
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
257 conf->cached[i] = conf->cached[--conf->last_cached];
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
258
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
259 ngx_close_connection(c);
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
260 return;
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
261 }
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
262 }
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
263
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
264 ngx_log_error(NGX_LOG_ALERT, ev->log, 0,
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
265 "keepalive close handler: unknown connection %p", c);
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
266 ngx_close_connection(c);
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
267 }
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
268
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 static void *
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
271 ngx_http_upstream_keepalive_create_conf(ngx_conf_t *cf)
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
272 {
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
273 ngx_http_upstream_keepalive_srv_conf_t *conf;
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
274
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
275 conf = ngx_pcalloc(cf->pool,
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
276 sizeof(ngx_http_upstream_keepalive_srv_conf_t));
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
277 if (conf == NULL) {
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
278 return NGX_CONF_ERROR;
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
279 }
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
280
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
281 /*
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
282 * set by ngx_pcalloc():
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
283 *
1
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
284 * conf->last_cached = 0;
0
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
285 * conf->original_init_upstream = NULL;
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
286 * conf->original_init_peer = NULL;
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
287 */
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
288
1
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
289 conf->max_cached = 1;
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
290
0
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
291 return conf;
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
292 }
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
293
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
294
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
295 static char *
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
296 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
297 {
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
298 ngx_http_upstream_srv_conf_t *uscf;
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
299 ngx_http_upstream_keepalive_srv_conf_t *kcf;
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
300
1
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
301 ngx_int_t n;
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
302 ngx_str_t *value;
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
303 ngx_uint_t i;
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
304
0
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
305 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
306
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
307 kcf = ngx_http_conf_upstream_srv_conf(uscf,
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
308 ngx_http_upstream_keepalive_module);
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
309
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
310 kcf->original_init_upstream = uscf->peer.init_upstream
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
311 ? uscf->peer.init_upstream
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
312 : ngx_http_upstream_init_round_robin;
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
313
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
314 uscf->peer.init_upstream = ngx_http_upstream_init_keepalive;
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
315
1
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
316 /* read options */
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
317
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
318 value = cf->args->elts;
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 for (i = 1; i < cf->args->nelts; i++) {
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
321
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
322 if (ngx_strncmp(value[i].data, "cached=", 7) == 0) {
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
323 n = ngx_atoi(&value[i].data[7], value[i].len - 7);
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
324
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
325 if (n == NGX_ERROR) {
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
326 goto invalid;
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
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
329 kcf->max_cached = n;
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 continue;
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
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
334 goto invalid;
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
0
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
337 return NGX_CONF_OK;
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 invalid:
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_conf_log_error(NGX_LOG_EMERG, cf, 0,
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
342 "invalid parameter \"%V\"", &value[i]);
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 return NGX_CONF_ERROR;
0
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
345 }