annotate ngx_http_upstream_keepalive_module.c @ 45:489c5d4318ff draft

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