annotate src/http/modules/ngx_http_upstream_keepalive_module.c @ 5204:a64c8a5da336

PCRE: retain input pattern for all regular expressions. Previously, input pattern was kept only for regular expressions with named captures, which resulted in error log entries without input pattern for PCRE errors that occured while processing regular expressions without them. Signed-off-by: Piotr Sikora <piotr@cloudflare.com>
author Piotr Sikora <piotr@cloudflare.com>
date Thu, 02 May 2013 03:26:36 -0700
parents 089a662c17d1
children 822b82191940
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_http_upstream_keepalive_peer_data_t;
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
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
43 typedef struct {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
44 ngx_http_upstream_keepalive_srv_conf_t *conf;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
45
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
46 ngx_queue_t queue;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
47 ngx_connection_t *connection;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
48
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
49 socklen_t socklen;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
50 u_char sockaddr[NGX_SOCKADDRLEN];
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
51
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
52 } ngx_http_upstream_keepalive_cache_t;
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
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
55 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
56 ngx_http_upstream_srv_conf_t *us);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
57 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
58 void *data);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
59 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
60 void *data, ngx_uint_t state);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
61
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
62 static void ngx_http_upstream_keepalive_dummy_handler(ngx_event_t *ev);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
63 static void ngx_http_upstream_keepalive_close_handler(ngx_event_t *ev);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
64 static void ngx_http_upstream_keepalive_close(ngx_connection_t *c);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
65
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
66
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
67 #if (NGX_HTTP_SSL)
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
68 static ngx_int_t ngx_http_upstream_keepalive_set_session(
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
69 ngx_peer_connection_t *pc, void *data);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
70 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
71 void *data);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
72 #endif
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
73
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
74 static void *ngx_http_upstream_keepalive_create_conf(ngx_conf_t *cf);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
75 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
76 void *conf);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
77
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
78
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
79 static ngx_command_t ngx_http_upstream_keepalive_commands[] = {
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 { ngx_string("keepalive"),
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
82 NGX_HTTP_UPS_CONF|NGX_CONF_TAKE12,
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
83 ngx_http_upstream_keepalive,
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
84 0,
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
85 0,
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
86 NULL },
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
87
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
88 ngx_null_command
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
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 static ngx_http_module_t ngx_http_upstream_keepalive_module_ctx = {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
93 NULL, /* preconfiguration */
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
94 NULL, /* postconfiguration */
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
95
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
96 NULL, /* create main configuration */
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
97 NULL, /* init main configuration */
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
98
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
99 ngx_http_upstream_keepalive_create_conf, /* create server configuration */
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
100 NULL, /* merge server configuration */
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
101
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
102 NULL, /* create location configuration */
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
103 NULL /* merge location configuration */
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
104 };
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
105
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 ngx_module_t ngx_http_upstream_keepalive_module = {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
108 NGX_MODULE_V1,
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
109 &ngx_http_upstream_keepalive_module_ctx, /* module context */
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
110 ngx_http_upstream_keepalive_commands, /* module directives */
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
111 NGX_HTTP_MODULE, /* module type */
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
112 NULL, /* init master */
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
113 NULL, /* init module */
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
114 NULL, /* init process */
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
115 NULL, /* init thread */
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
116 NULL, /* exit thread */
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
117 NULL, /* exit process */
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
118 NULL, /* exit master */
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
119 NGX_MODULE_V1_PADDING
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
120 };
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
121
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 static ngx_int_t
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
124 ngx_http_upstream_init_keepalive(ngx_conf_t *cf,
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
125 ngx_http_upstream_srv_conf_t *us)
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
126 {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
127 ngx_uint_t i;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
128 ngx_http_upstream_keepalive_srv_conf_t *kcf;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
129 ngx_http_upstream_keepalive_cache_t *cached;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
130
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
131 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, cf->log, 0,
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
132 "init keepalive");
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
133
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
134 kcf = ngx_http_conf_upstream_srv_conf(us,
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
135 ngx_http_upstream_keepalive_module);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
136
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
137 if (kcf->original_init_upstream(cf, us) != NGX_OK) {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
138 return NGX_ERROR;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
139 }
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
140
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
141 kcf->original_init_peer = us->peer.init;
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 us->peer.init = ngx_http_upstream_init_keepalive_peer;
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 /* allocate cache items and add to free queue */
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 cached = ngx_pcalloc(cf->pool,
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
148 sizeof(ngx_http_upstream_keepalive_cache_t) * kcf->max_cached);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
149 if (cached == NULL) {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
150 return NGX_ERROR;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
151 }
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
152
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
153 ngx_queue_init(&kcf->cache);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
154 ngx_queue_init(&kcf->free);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
155
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
156 for (i = 0; i < kcf->max_cached; i++) {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
157 ngx_queue_insert_head(&kcf->free, &cached[i].queue);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
158 cached[i].conf = kcf;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
159 }
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
160
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
161 return NGX_OK;
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
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 static ngx_int_t
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
166 ngx_http_upstream_init_keepalive_peer(ngx_http_request_t *r,
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
167 ngx_http_upstream_srv_conf_t *us)
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
168 {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
169 ngx_http_upstream_keepalive_peer_data_t *kp;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
170 ngx_http_upstream_keepalive_srv_conf_t *kcf;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
171
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
172 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
173 "init keepalive peer");
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
174
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
175 kcf = ngx_http_conf_upstream_srv_conf(us,
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
176 ngx_http_upstream_keepalive_module);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
177
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
178 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
179 if (kp == NULL) {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
180 return NGX_ERROR;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
181 }
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
182
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
183 if (kcf->original_init_peer(r, us) != NGX_OK) {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
184 return NGX_ERROR;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
185 }
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
186
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
187 kp->conf = kcf;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
188 kp->upstream = r->upstream;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
189 kp->data = r->upstream->peer.data;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
190 kp->original_get_peer = r->upstream->peer.get;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
191 kp->original_free_peer = r->upstream->peer.free;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
192
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
193 r->upstream->peer.data = kp;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
194 r->upstream->peer.get = ngx_http_upstream_get_keepalive_peer;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
195 r->upstream->peer.free = ngx_http_upstream_free_keepalive_peer;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
196
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
197 #if (NGX_HTTP_SSL)
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
198 kp->original_set_session = r->upstream->peer.set_session;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
199 kp->original_save_session = r->upstream->peer.save_session;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
200 r->upstream->peer.set_session = ngx_http_upstream_keepalive_set_session;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
201 r->upstream->peer.save_session = ngx_http_upstream_keepalive_save_session;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
202 #endif
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
203
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
204 return NGX_OK;
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
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 static ngx_int_t
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
209 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
210 {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
211 ngx_http_upstream_keepalive_peer_data_t *kp = data;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
212 ngx_http_upstream_keepalive_cache_t *item;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
213
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
214 ngx_int_t rc;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
215 ngx_queue_t *q, *cache;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
216 ngx_connection_t *c;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
217
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
218 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, pc->log, 0,
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
219 "get keepalive peer");
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
220
4694
5b5c07dee156 Upstream keepalive: "single" parameter deprecated.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4412
diff changeset
221 /* ask balancer */
4127
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 rc = kp->original_get_peer(pc, kp->data);
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 if (rc != NGX_OK) {
4127
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
226 return rc;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
227 }
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
228
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
229 /* search cache for suitable connection */
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
230
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
231 cache = &kp->conf->cache;
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 for (q = ngx_queue_head(cache);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
234 q != ngx_queue_sentinel(cache);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
235 q = ngx_queue_next(q))
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 item = ngx_queue_data(q, ngx_http_upstream_keepalive_cache_t, queue);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
238 c = item->connection;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
239
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
240 if (ngx_memn2cmp((u_char *) &item->sockaddr, (u_char *) pc->sockaddr,
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
241 item->socklen, pc->socklen)
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
242 == 0)
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 ngx_queue_remove(q);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
245 ngx_queue_insert_head(&kp->conf->free, q);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
246
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
247 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0,
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
248 "get keepalive peer: using connection %p", c);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
249
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
250 c->idle = 0;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
251 c->log = pc->log;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
252 c->read->log = pc->log;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
253 c->write->log = pc->log;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
254 c->pool->log = pc->log;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
255
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
256 pc->connection = c;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
257 pc->cached = 1;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
258
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
259 return NGX_DONE;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
260 }
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
261 }
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_OK;
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 static void
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
268 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
269 ngx_uint_t state)
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 ngx_http_upstream_keepalive_peer_data_t *kp = data;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
272 ngx_http_upstream_keepalive_cache_t *item;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
273
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
274 ngx_queue_t *q;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
275 ngx_connection_t *c;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
276 ngx_http_upstream_t *u;
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_log_debug0(NGX_LOG_DEBUG_HTTP, pc->log, 0,
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
279 "free keepalive peer");
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
280
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
281 /* cache valid connections */
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
282
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
283 u = kp->upstream;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
284 c = pc->connection;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
285
5133
089a662c17d1 Upstream: removed double-free workarounds in peer.free() methods.
Ruslan Ermilov <ru@nginx.com>
parents: 4998
diff changeset
286 if (state & NGX_PEER_FAILED
4127
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
287 || c == NULL
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
288 || c->read->eof
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
289 || c->read->error
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
290 || c->read->timedout
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
291 || c->write->error
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
292 || c->write->timedout)
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
293 {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
294 goto invalid;
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
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
297 if (!u->keepalive) {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
298 goto invalid;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
299 }
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
300
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
301 if (ngx_handle_read_event(c->read, 0) != NGX_OK) {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
302 goto invalid;
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
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
305 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0,
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
306 "free keepalive peer: saving connection %p", c);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
307
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
308 if (ngx_queue_empty(&kp->conf->free)) {
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 q = ngx_queue_last(&kp->conf->cache);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
311 ngx_queue_remove(q);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
312
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
313 item = ngx_queue_data(q, ngx_http_upstream_keepalive_cache_t, queue);
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_http_upstream_keepalive_close(item->connection);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
316
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
317 } else {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
318 q = ngx_queue_head(&kp->conf->free);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
319 ngx_queue_remove(q);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
320
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
321 item = ngx_queue_data(q, ngx_http_upstream_keepalive_cache_t, queue);
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
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
324 item->connection = c;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
325 ngx_queue_insert_head(&kp->conf->cache, q);
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 pc->connection = NULL;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
328
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
329 if (c->read->timer_set) {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
330 ngx_del_timer(c->read);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
331 }
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
332 if (c->write->timer_set) {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
333 ngx_del_timer(c->write);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
334 }
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
335
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
336 c->write->handler = ngx_http_upstream_keepalive_dummy_handler;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
337 c->read->handler = ngx_http_upstream_keepalive_close_handler;
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 c->data = item;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
340 c->idle = 1;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
341 c->log = ngx_cycle->log;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
342 c->read->log = ngx_cycle->log;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
343 c->write->log = ngx_cycle->log;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
344 c->pool->log = ngx_cycle->log;
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 item->socklen = pc->socklen;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
347 ngx_memcpy(&item->sockaddr, pc->sockaddr, pc->socklen);
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 if (c->read->ready) {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
350 ngx_http_upstream_keepalive_close_handler(c->read);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
351 }
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
352
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
353 invalid:
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
354
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
355 kp->original_free_peer(pc, kp->data, state);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
356 }
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
357
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 static void
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
360 ngx_http_upstream_keepalive_dummy_handler(ngx_event_t *ev)
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 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, ev->log, 0,
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
363 "keepalive dummy handler");
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
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 static void
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
368 ngx_http_upstream_keepalive_close_handler(ngx_event_t *ev)
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
369 {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
370 ngx_http_upstream_keepalive_srv_conf_t *conf;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
371 ngx_http_upstream_keepalive_cache_t *item;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
372
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
373 int n;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
374 char buf[1];
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
375 ngx_connection_t *c;
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 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, ev->log, 0,
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
378 "keepalive close handler");
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 c = ev->data;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
381
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
382 if (c->close) {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
383 goto close;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
384 }
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
385
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
386 n = recv(c->fd, buf, 1, MSG_PEEK);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
387
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
388 if (n == -1 && ngx_socket_errno == NGX_EAGAIN) {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
389 /* stale event */
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
390
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
391 if (ngx_handle_read_event(c->read, 0) != NGX_OK) {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
392 goto close;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
393 }
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 return;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
396 }
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 close:
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
399
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
400 item = c->data;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
401 conf = item->conf;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
402
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
403 ngx_http_upstream_keepalive_close(c);
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 ngx_queue_remove(&item->queue);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
406 ngx_queue_insert_head(&conf->free, &item->queue);
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
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 static void
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
411 ngx_http_upstream_keepalive_close(ngx_connection_t *c)
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
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
414 #if (NGX_HTTP_SSL)
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
415
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
416 if (c->ssl) {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
417 c->ssl->no_wait_shutdown = 1;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
418 c->ssl->no_send_shutdown = 1;
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 if (ngx_ssl_shutdown(c) == NGX_AGAIN) {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
421 c->ssl->handler = ngx_http_upstream_keepalive_close;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
422 return;
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 }
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 #endif
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
427
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
428 ngx_destroy_pool(c->pool);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
429 ngx_close_connection(c);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
430 }
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
431
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
432
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
433 #if (NGX_HTTP_SSL)
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 static ngx_int_t
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
436 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
437 {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
438 ngx_http_upstream_keepalive_peer_data_t *kp = data;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
439
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
440 return kp->original_set_session(pc, kp->data);
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
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
444 static void
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
445 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
446 {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
447 ngx_http_upstream_keepalive_peer_data_t *kp = data;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
448
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
449 kp->original_save_session(pc, kp->data);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
450 return;
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 #endif
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
454
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
455
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
456 static void *
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
457 ngx_http_upstream_keepalive_create_conf(ngx_conf_t *cf)
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 ngx_http_upstream_keepalive_srv_conf_t *conf;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
460
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
461 conf = ngx_pcalloc(cf->pool,
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
462 sizeof(ngx_http_upstream_keepalive_srv_conf_t));
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
463 if (conf == NULL) {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
464 return NULL;
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
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
467 /*
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
468 * set by ngx_pcalloc():
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
469 *
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
470 * conf->original_init_upstream = NULL;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
471 * conf->original_init_peer = NULL;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
472 */
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
473
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
474 conf->max_cached = 1;
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 return conf;
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
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 static char *
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
481 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
482 {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
483 ngx_http_upstream_srv_conf_t *uscf;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
484 ngx_http_upstream_keepalive_srv_conf_t *kcf;
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 ngx_int_t n;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
487 ngx_str_t *value;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
488 ngx_uint_t i;
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 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
491
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
492 kcf = ngx_http_conf_upstream_srv_conf(uscf,
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
493 ngx_http_upstream_keepalive_module);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
494
4998
82336a9ce26d Upstream keepalive: detect duplicate "keepalive" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 4694
diff changeset
495 if (kcf->original_init_upstream) {
82336a9ce26d Upstream keepalive: detect duplicate "keepalive" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 4694
diff changeset
496 return "is duplicate";
82336a9ce26d Upstream keepalive: detect duplicate "keepalive" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 4694
diff changeset
497 }
82336a9ce26d Upstream keepalive: detect duplicate "keepalive" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 4694
diff changeset
498
4127
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
499 kcf->original_init_upstream = uscf->peer.init_upstream
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
500 ? uscf->peer.init_upstream
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
501 : ngx_http_upstream_init_round_robin;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
502
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
503 uscf->peer.init_upstream = ngx_http_upstream_init_keepalive;
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 /* read options */
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
506
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
507 value = cf->args->elts;
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 n = ngx_atoi(value[1].data, value[1].len);
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 if (n == NGX_ERROR || n == 0) {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
512 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
513 "invalid value \"%V\" in \"%V\" directive",
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
514 &value[1], &cmd->name);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
515 return NGX_CONF_ERROR;
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
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
518 kcf->max_cached = n;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
519
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
520 for (i = 2; i < cf->args->nelts; i++) {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
521
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
522 if (ngx_strcmp(value[i].data, "single") == 0) {
4694
5b5c07dee156 Upstream keepalive: "single" parameter deprecated.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4412
diff changeset
523 ngx_conf_log_error(NGX_LOG_WARN, cf, 0,
5b5c07dee156 Upstream keepalive: "single" parameter deprecated.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4412
diff changeset
524 "the \"single\" parameter is deprecated");
4127
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
525 continue;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
526 }
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 goto invalid;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
529 }
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
530
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
531 return NGX_CONF_OK;
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 invalid:
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
534
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
535 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
536 "invalid parameter \"%V\"", &value[i]);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
537
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
538 return NGX_CONF_ERROR;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
539 }