annotate src/http/modules/ngx_http_upstream_keepalive_module.c @ 4694:5b5c07dee156

Upstream 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, 18 Jun 2012 14:23:42 +0000
parents d620f497c50f
children 82336a9ce26d
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
4127
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2 /*
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3 * Copyright (C) Maxim Dounin
4412
d620f497c50f Copyright updated.
Maxim Konovalov <maxim@nginx.com>
parents: 4127
diff changeset
4 * Copyright (C) Nginx, Inc.
4127
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
5 */
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
6
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
7
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
8 #include <ngx_config.h>
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
9 #include <ngx_core.h>
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
10 #include <ngx_http.h>
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
11
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
12
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
13 typedef struct {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
14 ngx_uint_t max_cached;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
15
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
16 ngx_queue_t cache;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
17 ngx_queue_t free;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
18
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
19 ngx_http_upstream_init_pt original_init_upstream;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
20 ngx_http_upstream_init_peer_pt original_init_peer;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
21
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
22 } ngx_http_upstream_keepalive_srv_conf_t;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
23
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
24
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
25 typedef struct {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
26 ngx_http_upstream_keepalive_srv_conf_t *conf;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
27
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
28 ngx_http_upstream_t *upstream;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
29
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
30 void *data;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
31
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
32 ngx_event_get_peer_pt original_get_peer;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
33 ngx_event_free_peer_pt original_free_peer;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
34
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
35 #if (NGX_HTTP_SSL)
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
36 ngx_event_set_peer_session_pt original_set_session;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
37 ngx_event_save_peer_session_pt original_save_session;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
38 #endif
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
39
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
40 ngx_uint_t failed; /* unsigned:1 */
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
41
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
42 } ngx_http_upstream_keepalive_peer_data_t;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
43
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
44
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
45 typedef struct {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
46 ngx_http_upstream_keepalive_srv_conf_t *conf;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
47
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
48 ngx_queue_t queue;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
49 ngx_connection_t *connection;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
50
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
51 socklen_t socklen;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
52 u_char sockaddr[NGX_SOCKADDRLEN];
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
53
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
54 } ngx_http_upstream_keepalive_cache_t;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
55
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
56
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
57 static ngx_int_t ngx_http_upstream_init_keepalive_peer(ngx_http_request_t *r,
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
58 ngx_http_upstream_srv_conf_t *us);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
59 static ngx_int_t ngx_http_upstream_get_keepalive_peer(ngx_peer_connection_t *pc,
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
60 void *data);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
61 static void ngx_http_upstream_free_keepalive_peer(ngx_peer_connection_t *pc,
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
62 void *data, ngx_uint_t state);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
63
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
64 static void ngx_http_upstream_keepalive_dummy_handler(ngx_event_t *ev);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
65 static void ngx_http_upstream_keepalive_close_handler(ngx_event_t *ev);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
66 static void ngx_http_upstream_keepalive_close(ngx_connection_t *c);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
67
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
68
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
69 #if (NGX_HTTP_SSL)
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
70 static ngx_int_t ngx_http_upstream_keepalive_set_session(
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
71 ngx_peer_connection_t *pc, void *data);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
72 static void ngx_http_upstream_keepalive_save_session(ngx_peer_connection_t *pc,
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
73 void *data);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
74 #endif
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
75
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
76 static void *ngx_http_upstream_keepalive_create_conf(ngx_conf_t *cf);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
77 static char *ngx_http_upstream_keepalive(ngx_conf_t *cf, ngx_command_t *cmd,
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
78 void *conf);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
79
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
80
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
81 static ngx_command_t ngx_http_upstream_keepalive_commands[] = {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
82
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
83 { ngx_string("keepalive"),
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
84 NGX_HTTP_UPS_CONF|NGX_CONF_TAKE12,
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
85 ngx_http_upstream_keepalive,
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
86 0,
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
87 0,
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
88 NULL },
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
89
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
90 ngx_null_command
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
91 };
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
92
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
93
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
94 static ngx_http_module_t ngx_http_upstream_keepalive_module_ctx = {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
95 NULL, /* preconfiguration */
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
96 NULL, /* postconfiguration */
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
97
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
98 NULL, /* create main configuration */
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
99 NULL, /* init main configuration */
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
100
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
101 ngx_http_upstream_keepalive_create_conf, /* create server configuration */
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
102 NULL, /* merge server configuration */
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
103
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
104 NULL, /* create location configuration */
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
105 NULL /* merge location configuration */
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
106 };
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
107
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
108
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
109 ngx_module_t ngx_http_upstream_keepalive_module = {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
110 NGX_MODULE_V1,
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
111 &ngx_http_upstream_keepalive_module_ctx, /* module context */
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
112 ngx_http_upstream_keepalive_commands, /* module directives */
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
113 NGX_HTTP_MODULE, /* module type */
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
114 NULL, /* init master */
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
115 NULL, /* init module */
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
116 NULL, /* init process */
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
117 NULL, /* init thread */
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
118 NULL, /* exit thread */
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
119 NULL, /* exit process */
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
120 NULL, /* exit master */
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
121 NGX_MODULE_V1_PADDING
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
122 };
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
123
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
124
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
125 static ngx_int_t
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
126 ngx_http_upstream_init_keepalive(ngx_conf_t *cf,
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
127 ngx_http_upstream_srv_conf_t *us)
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
128 {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
129 ngx_uint_t i;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
130 ngx_http_upstream_keepalive_srv_conf_t *kcf;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
131 ngx_http_upstream_keepalive_cache_t *cached;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
132
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
133 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, cf->log, 0,
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
134 "init keepalive");
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
135
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
136 kcf = ngx_http_conf_upstream_srv_conf(us,
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
137 ngx_http_upstream_keepalive_module);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
138
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
139 if (kcf->original_init_upstream(cf, us) != NGX_OK) {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
140 return NGX_ERROR;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
141 }
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
142
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
143 kcf->original_init_peer = us->peer.init;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
144
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
145 us->peer.init = ngx_http_upstream_init_keepalive_peer;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
146
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
147 /* allocate cache items and add to free queue */
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
148
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
149 cached = ngx_pcalloc(cf->pool,
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
150 sizeof(ngx_http_upstream_keepalive_cache_t) * kcf->max_cached);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
151 if (cached == NULL) {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
152 return NGX_ERROR;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
153 }
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
154
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
155 ngx_queue_init(&kcf->cache);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
156 ngx_queue_init(&kcf->free);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
157
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
158 for (i = 0; i < kcf->max_cached; i++) {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
159 ngx_queue_insert_head(&kcf->free, &cached[i].queue);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
160 cached[i].conf = kcf;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
161 }
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
162
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
163 return NGX_OK;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
164 }
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
165
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
166
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
167 static ngx_int_t
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
168 ngx_http_upstream_init_keepalive_peer(ngx_http_request_t *r,
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
169 ngx_http_upstream_srv_conf_t *us)
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
170 {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
171 ngx_http_upstream_keepalive_peer_data_t *kp;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
172 ngx_http_upstream_keepalive_srv_conf_t *kcf;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
173
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
174 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
175 "init keepalive peer");
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
176
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
177 kcf = ngx_http_conf_upstream_srv_conf(us,
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
178 ngx_http_upstream_keepalive_module);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
179
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
180 kp = ngx_palloc(r->pool, sizeof(ngx_http_upstream_keepalive_peer_data_t));
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
181 if (kp == NULL) {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
182 return NGX_ERROR;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
183 }
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
184
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
185 if (kcf->original_init_peer(r, us) != NGX_OK) {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
186 return NGX_ERROR;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
187 }
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
188
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
189 kp->conf = kcf;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
190 kp->upstream = r->upstream;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
191 kp->data = r->upstream->peer.data;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
192 kp->original_get_peer = r->upstream->peer.get;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
193 kp->original_free_peer = r->upstream->peer.free;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
194
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
195 r->upstream->peer.data = kp;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
196 r->upstream->peer.get = ngx_http_upstream_get_keepalive_peer;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
197 r->upstream->peer.free = ngx_http_upstream_free_keepalive_peer;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
198
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
199 #if (NGX_HTTP_SSL)
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
200 kp->original_set_session = r->upstream->peer.set_session;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
201 kp->original_save_session = r->upstream->peer.save_session;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
202 r->upstream->peer.set_session = ngx_http_upstream_keepalive_set_session;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
203 r->upstream->peer.save_session = ngx_http_upstream_keepalive_save_session;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
204 #endif
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
205
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
206 return NGX_OK;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
207 }
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
208
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
209
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
210 static ngx_int_t
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
211 ngx_http_upstream_get_keepalive_peer(ngx_peer_connection_t *pc, void *data)
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
212 {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
213 ngx_http_upstream_keepalive_peer_data_t *kp = data;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
214 ngx_http_upstream_keepalive_cache_t *item;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
215
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
216 ngx_int_t rc;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
217 ngx_queue_t *q, *cache;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
218 ngx_connection_t *c;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
219
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
220 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, pc->log, 0,
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
221 "get keepalive peer");
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
222
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
223 kp->failed = 0;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
224
4694
5b5c07dee156 Upstream keepalive: "single" parameter deprecated.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4412
diff changeset
225 /* ask balancer */
4127
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
226
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
227 rc = kp->original_get_peer(pc, kp->data);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
228
4694
5b5c07dee156 Upstream keepalive: "single" parameter deprecated.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4412
diff changeset
229 if (rc != NGX_OK) {
4127
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
230 return rc;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
231 }
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
232
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
233 /* search cache for suitable connection */
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
234
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
235 cache = &kp->conf->cache;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
236
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
237 for (q = ngx_queue_head(cache);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
238 q != ngx_queue_sentinel(cache);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
239 q = ngx_queue_next(q))
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
240 {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
241 item = ngx_queue_data(q, ngx_http_upstream_keepalive_cache_t, queue);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
242 c = item->connection;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
243
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
244 if (ngx_memn2cmp((u_char *) &item->sockaddr, (u_char *) pc->sockaddr,
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
245 item->socklen, pc->socklen)
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
246 == 0)
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
247 {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
248 ngx_queue_remove(q);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
249 ngx_queue_insert_head(&kp->conf->free, q);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
250
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
251 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0,
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
252 "get keepalive peer: using connection %p", c);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
253
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
254 c->idle = 0;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
255 c->log = pc->log;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
256 c->read->log = pc->log;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
257 c->write->log = pc->log;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
258 c->pool->log = pc->log;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
259
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
260 pc->connection = c;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
261 pc->cached = 1;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
262
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
263 return NGX_DONE;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
264 }
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
265 }
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
266
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
267 return NGX_OK;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
268 }
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
269
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
270
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
271 static void
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
272 ngx_http_upstream_free_keepalive_peer(ngx_peer_connection_t *pc, void *data,
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
273 ngx_uint_t state)
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
274 {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
275 ngx_http_upstream_keepalive_peer_data_t *kp = data;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
276 ngx_http_upstream_keepalive_cache_t *item;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
277
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
278 ngx_queue_t *q;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
279 ngx_connection_t *c;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
280 ngx_http_upstream_t *u;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
281
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
282 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, pc->log, 0,
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
283 "free keepalive peer");
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
284
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
285 /* remember failed state - peer.free() may be called more than once */
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
286
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
287 if (state & NGX_PEER_FAILED) {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
288 kp->failed = 1;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
289 }
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
290
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
291 /* cache valid connections */
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
292
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
293 u = kp->upstream;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
294 c = pc->connection;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
295
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
296 if (kp->failed
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
297 || c == NULL
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
298 || c->read->eof
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
299 || c->read->error
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
300 || c->read->timedout
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
301 || c->write->error
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
302 || c->write->timedout)
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
303 {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
304 goto invalid;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
305 }
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
306
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
307 if (!u->keepalive) {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
308 goto invalid;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
309 }
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
310
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
311 if (ngx_handle_read_event(c->read, 0) != NGX_OK) {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
312 goto invalid;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
313 }
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
314
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
315 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0,
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
316 "free keepalive peer: saving connection %p", c);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
317
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
318 if (ngx_queue_empty(&kp->conf->free)) {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
319
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
320 q = ngx_queue_last(&kp->conf->cache);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
321 ngx_queue_remove(q);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
322
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
323 item = ngx_queue_data(q, ngx_http_upstream_keepalive_cache_t, queue);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
324
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
325 ngx_http_upstream_keepalive_close(item->connection);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
326
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
327 } else {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
328 q = ngx_queue_head(&kp->conf->free);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
329 ngx_queue_remove(q);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
330
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
331 item = ngx_queue_data(q, ngx_http_upstream_keepalive_cache_t, queue);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
332 }
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
333
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
334 item->connection = c;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
335 ngx_queue_insert_head(&kp->conf->cache, q);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
336
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
337 pc->connection = NULL;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
338
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
339 if (c->read->timer_set) {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
340 ngx_del_timer(c->read);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
341 }
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
342 if (c->write->timer_set) {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
343 ngx_del_timer(c->write);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
344 }
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
345
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
346 c->write->handler = ngx_http_upstream_keepalive_dummy_handler;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
347 c->read->handler = ngx_http_upstream_keepalive_close_handler;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
348
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
349 c->data = item;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
350 c->idle = 1;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
351 c->log = ngx_cycle->log;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
352 c->read->log = ngx_cycle->log;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
353 c->write->log = ngx_cycle->log;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
354 c->pool->log = ngx_cycle->log;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
355
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
356 item->socklen = pc->socklen;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
357 ngx_memcpy(&item->sockaddr, pc->sockaddr, pc->socklen);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
358
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
359 if (c->read->ready) {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
360 ngx_http_upstream_keepalive_close_handler(c->read);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
361 }
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
362
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
363 invalid:
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
364
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
365 kp->original_free_peer(pc, kp->data, state);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
366 }
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
367
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
368
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
369 static void
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
370 ngx_http_upstream_keepalive_dummy_handler(ngx_event_t *ev)
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
371 {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
372 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, ev->log, 0,
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
373 "keepalive dummy handler");
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
374 }
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
375
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
376
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
377 static void
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
378 ngx_http_upstream_keepalive_close_handler(ngx_event_t *ev)
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
379 {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
380 ngx_http_upstream_keepalive_srv_conf_t *conf;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
381 ngx_http_upstream_keepalive_cache_t *item;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
382
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
383 int n;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
384 char buf[1];
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
385 ngx_connection_t *c;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
386
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
387 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, ev->log, 0,
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
388 "keepalive close handler");
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
389
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
390 c = ev->data;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
391
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
392 if (c->close) {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
393 goto close;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
394 }
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
395
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
396 n = recv(c->fd, buf, 1, MSG_PEEK);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
397
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
398 if (n == -1 && ngx_socket_errno == NGX_EAGAIN) {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
399 /* stale event */
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
400
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
401 if (ngx_handle_read_event(c->read, 0) != NGX_OK) {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
402 goto close;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
403 }
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
404
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
405 return;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
406 }
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
407
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
408 close:
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
409
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
410 item = c->data;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
411 conf = item->conf;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
412
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
413 ngx_http_upstream_keepalive_close(c);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
414
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
415 ngx_queue_remove(&item->queue);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
416 ngx_queue_insert_head(&conf->free, &item->queue);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
417 }
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
418
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
419
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
420 static void
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
421 ngx_http_upstream_keepalive_close(ngx_connection_t *c)
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
422 {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
423
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
424 #if (NGX_HTTP_SSL)
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
425
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
426 if (c->ssl) {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
427 c->ssl->no_wait_shutdown = 1;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
428 c->ssl->no_send_shutdown = 1;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
429
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
430 if (ngx_ssl_shutdown(c) == NGX_AGAIN) {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
431 c->ssl->handler = ngx_http_upstream_keepalive_close;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
432 return;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
433 }
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
434 }
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
435
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
436 #endif
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
437
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
438 ngx_destroy_pool(c->pool);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
439 ngx_close_connection(c);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
440 }
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
441
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
442
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
443 #if (NGX_HTTP_SSL)
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
444
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
445 static ngx_int_t
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
446 ngx_http_upstream_keepalive_set_session(ngx_peer_connection_t *pc, void *data)
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
447 {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
448 ngx_http_upstream_keepalive_peer_data_t *kp = data;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
449
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
450 return kp->original_set_session(pc, kp->data);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
451 }
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
452
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
453
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
454 static void
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
455 ngx_http_upstream_keepalive_save_session(ngx_peer_connection_t *pc, void *data)
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
456 {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
457 ngx_http_upstream_keepalive_peer_data_t *kp = data;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
458
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
459 kp->original_save_session(pc, kp->data);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
460 return;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
461 }
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
462
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
463 #endif
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
464
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
465
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
466 static void *
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
467 ngx_http_upstream_keepalive_create_conf(ngx_conf_t *cf)
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
468 {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
469 ngx_http_upstream_keepalive_srv_conf_t *conf;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
470
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
471 conf = ngx_pcalloc(cf->pool,
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
472 sizeof(ngx_http_upstream_keepalive_srv_conf_t));
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
473 if (conf == NULL) {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
474 return NULL;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
475 }
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
476
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
477 /*
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
478 * set by ngx_pcalloc():
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
479 *
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
480 * conf->original_init_upstream = NULL;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
481 * conf->original_init_peer = NULL;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
482 */
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
483
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
484 conf->max_cached = 1;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
485
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
486 return conf;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
487 }
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
488
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
489
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
490 static char *
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
491 ngx_http_upstream_keepalive(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
492 {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
493 ngx_http_upstream_srv_conf_t *uscf;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
494 ngx_http_upstream_keepalive_srv_conf_t *kcf;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
495
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
496 ngx_int_t n;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
497 ngx_str_t *value;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
498 ngx_uint_t i;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
499
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
500 uscf = ngx_http_conf_get_module_srv_conf(cf, ngx_http_upstream_module);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
501
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
502 kcf = ngx_http_conf_upstream_srv_conf(uscf,
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
503 ngx_http_upstream_keepalive_module);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
504
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
505 kcf->original_init_upstream = uscf->peer.init_upstream
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
506 ? uscf->peer.init_upstream
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
507 : ngx_http_upstream_init_round_robin;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
508
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
509 uscf->peer.init_upstream = ngx_http_upstream_init_keepalive;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
510
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
511 /* read options */
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
512
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
513 value = cf->args->elts;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
514
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
515 n = ngx_atoi(value[1].data, value[1].len);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
516
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
517 if (n == NGX_ERROR || n == 0) {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
518 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
519 "invalid value \"%V\" in \"%V\" directive",
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
520 &value[1], &cmd->name);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
521 return NGX_CONF_ERROR;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
522 }
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
523
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
524 kcf->max_cached = n;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
525
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
526 for (i = 2; i < cf->args->nelts; i++) {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
527
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
528 if (ngx_strcmp(value[i].data, "single") == 0) {
4694
5b5c07dee156 Upstream keepalive: "single" parameter deprecated.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4412
diff changeset
529 ngx_conf_log_error(NGX_LOG_WARN, cf, 0,
5b5c07dee156 Upstream keepalive: "single" parameter deprecated.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4412
diff changeset
530 "the \"single\" parameter is deprecated");
4127
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
531 continue;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
532 }
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
533
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
534 goto invalid;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
535 }
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
536
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
537 return NGX_CONF_OK;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
538
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
539 invalid:
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
540
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
541 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
542 "invalid parameter \"%V\"", &value[i]);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
543
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
544 return NGX_CONF_ERROR;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
545 }