annotate src/http/modules/ngx_http_upstream_keepalive_module.c @ 9275:199dc0d6b05b default tip

Added max_headers directive. The directive limits the number of request headers accepted from clients. While the total amount of headers is believed to be sufficiently limited by the existing buffer size limits (client_header_buffer_size and large_client_header_buffers), the additional limit on the number of headers might be beneficial to better protect backend servers. Requested by Maksim Yevmenkin.
author Maxim Dounin <mdounin@mdounin.ru>
date Fri, 24 May 2024 00:20:01 +0300
parents 82e174e47663
children
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;
7340
70c6b08973a0 Upstream keepalive: keepalive_requests directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7339
diff changeset
15 ngx_uint_t requests;
7820
fdc3d40979b0 Introduced the "keepalive_time" directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7600
diff changeset
16 ngx_msec_t time;
7339
d9029e113a05 Upstream keepalive: keepalive_timeout directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7338
diff changeset
17 ngx_msec_t timeout;
4127
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_queue_t cache;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
20 ngx_queue_t free;
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_init_pt original_init_upstream;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
23 ngx_http_upstream_init_peer_pt original_init_peer;
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 } ngx_http_upstream_keepalive_srv_conf_t;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
26
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 typedef struct {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
29 ngx_http_upstream_keepalive_srv_conf_t *conf;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
30
6167
87d48f8793b6 Upstream keepalive: reduced diffs to the plus version of nginx.
Roman Arutyunyan <arut@nginx.com>
parents: 5999
diff changeset
31 ngx_queue_t queue;
87d48f8793b6 Upstream keepalive: reduced diffs to the plus version of nginx.
Roman Arutyunyan <arut@nginx.com>
parents: 5999
diff changeset
32 ngx_connection_t *connection;
87d48f8793b6 Upstream keepalive: reduced diffs to the plus version of nginx.
Roman Arutyunyan <arut@nginx.com>
parents: 5999
diff changeset
33
87d48f8793b6 Upstream keepalive: reduced diffs to the plus version of nginx.
Roman Arutyunyan <arut@nginx.com>
parents: 5999
diff changeset
34 socklen_t socklen;
6559
adf25b8d0431 Introduced the ngx_sockaddr_t type.
Ruslan Ermilov <ru@nginx.com>
parents: 6332
diff changeset
35 ngx_sockaddr_t sockaddr;
6167
87d48f8793b6 Upstream keepalive: reduced diffs to the plus version of nginx.
Roman Arutyunyan <arut@nginx.com>
parents: 5999
diff changeset
36
87d48f8793b6 Upstream keepalive: reduced diffs to the plus version of nginx.
Roman Arutyunyan <arut@nginx.com>
parents: 5999
diff changeset
37 } ngx_http_upstream_keepalive_cache_t;
87d48f8793b6 Upstream keepalive: reduced diffs to the plus version of nginx.
Roman Arutyunyan <arut@nginx.com>
parents: 5999
diff changeset
38
87d48f8793b6 Upstream keepalive: reduced diffs to the plus version of nginx.
Roman Arutyunyan <arut@nginx.com>
parents: 5999
diff changeset
39
87d48f8793b6 Upstream keepalive: reduced diffs to the plus version of nginx.
Roman Arutyunyan <arut@nginx.com>
parents: 5999
diff changeset
40 typedef struct {
87d48f8793b6 Upstream keepalive: reduced diffs to the plus version of nginx.
Roman Arutyunyan <arut@nginx.com>
parents: 5999
diff changeset
41 ngx_http_upstream_keepalive_srv_conf_t *conf;
87d48f8793b6 Upstream keepalive: reduced diffs to the plus version of nginx.
Roman Arutyunyan <arut@nginx.com>
parents: 5999
diff changeset
42
4127
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
43 ngx_http_upstream_t *upstream;
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 void *data;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
46
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
47 ngx_event_get_peer_pt original_get_peer;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
48 ngx_event_free_peer_pt original_free_peer;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
49
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
50 #if (NGX_HTTP_SSL)
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
51 ngx_event_set_peer_session_pt original_set_session;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
52 ngx_event_save_peer_session_pt original_save_session;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
53 #endif
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 } ngx_http_upstream_keepalive_peer_data_t;
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
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
58 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
59 ngx_http_upstream_srv_conf_t *us);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
60 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
61 void *data);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
62 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
63 void *data, ngx_uint_t state);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
64
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
65 static void ngx_http_upstream_keepalive_dummy_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_handler(ngx_event_t *ev);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
67 static void ngx_http_upstream_keepalive_close(ngx_connection_t *c);
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"),
5830
3e5b630e0ec9 Upstream keepalive: removed "single" parameter remnants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5213
diff changeset
84 NGX_HTTP_UPS_CONF|NGX_CONF_TAKE1,
4127
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
85 ngx_http_upstream_keepalive,
5213
822b82191940 Upstream keepalive: slightly simplified code.
Ruslan Ermilov <ru@nginx.com>
parents: 5133
diff changeset
86 NGX_HTTP_SRV_CONF_OFFSET,
4127
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
7820
fdc3d40979b0 Introduced the "keepalive_time" directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7600
diff changeset
90 { ngx_string("keepalive_time"),
fdc3d40979b0 Introduced the "keepalive_time" directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7600
diff changeset
91 NGX_HTTP_UPS_CONF|NGX_CONF_TAKE1,
fdc3d40979b0 Introduced the "keepalive_time" directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7600
diff changeset
92 ngx_conf_set_msec_slot,
fdc3d40979b0 Introduced the "keepalive_time" directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7600
diff changeset
93 NGX_HTTP_SRV_CONF_OFFSET,
fdc3d40979b0 Introduced the "keepalive_time" directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7600
diff changeset
94 offsetof(ngx_http_upstream_keepalive_srv_conf_t, time),
fdc3d40979b0 Introduced the "keepalive_time" directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7600
diff changeset
95 NULL },
fdc3d40979b0 Introduced the "keepalive_time" directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7600
diff changeset
96
7339
d9029e113a05 Upstream keepalive: keepalive_timeout directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7338
diff changeset
97 { ngx_string("keepalive_timeout"),
d9029e113a05 Upstream keepalive: keepalive_timeout directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7338
diff changeset
98 NGX_HTTP_UPS_CONF|NGX_CONF_TAKE1,
d9029e113a05 Upstream keepalive: keepalive_timeout directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7338
diff changeset
99 ngx_conf_set_msec_slot,
d9029e113a05 Upstream keepalive: keepalive_timeout directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7338
diff changeset
100 NGX_HTTP_SRV_CONF_OFFSET,
d9029e113a05 Upstream keepalive: keepalive_timeout directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7338
diff changeset
101 offsetof(ngx_http_upstream_keepalive_srv_conf_t, timeout),
d9029e113a05 Upstream keepalive: keepalive_timeout directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7338
diff changeset
102 NULL },
d9029e113a05 Upstream keepalive: keepalive_timeout directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7338
diff changeset
103
7340
70c6b08973a0 Upstream keepalive: keepalive_requests directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7339
diff changeset
104 { ngx_string("keepalive_requests"),
70c6b08973a0 Upstream keepalive: keepalive_requests directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7339
diff changeset
105 NGX_HTTP_UPS_CONF|NGX_CONF_TAKE1,
70c6b08973a0 Upstream keepalive: keepalive_requests directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7339
diff changeset
106 ngx_conf_set_num_slot,
70c6b08973a0 Upstream keepalive: keepalive_requests directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7339
diff changeset
107 NGX_HTTP_SRV_CONF_OFFSET,
70c6b08973a0 Upstream keepalive: keepalive_requests directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7339
diff changeset
108 offsetof(ngx_http_upstream_keepalive_srv_conf_t, requests),
70c6b08973a0 Upstream keepalive: keepalive_requests directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7339
diff changeset
109 NULL },
70c6b08973a0 Upstream keepalive: keepalive_requests directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7339
diff changeset
110
4127
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
111 ngx_null_command
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
112 };
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
113
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
114
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
115 static ngx_http_module_t ngx_http_upstream_keepalive_module_ctx = {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
116 NULL, /* preconfiguration */
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
117 NULL, /* postconfiguration */
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
118
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
119 NULL, /* create main configuration */
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
120 NULL, /* init main configuration */
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 ngx_http_upstream_keepalive_create_conf, /* create server configuration */
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
123 NULL, /* merge server configuration */
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 NULL, /* create location configuration */
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
126 NULL /* merge location configuration */
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
127 };
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
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
130 ngx_module_t ngx_http_upstream_keepalive_module = {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
131 NGX_MODULE_V1,
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
132 &ngx_http_upstream_keepalive_module_ctx, /* module context */
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
133 ngx_http_upstream_keepalive_commands, /* module directives */
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
134 NGX_HTTP_MODULE, /* module type */
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
135 NULL, /* init master */
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
136 NULL, /* init module */
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
137 NULL, /* init process */
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
138 NULL, /* init thread */
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
139 NULL, /* exit thread */
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
140 NULL, /* exit process */
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
141 NULL, /* exit master */
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
142 NGX_MODULE_V1_PADDING
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
143 };
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
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
146 static ngx_int_t
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
147 ngx_http_upstream_init_keepalive(ngx_conf_t *cf,
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
148 ngx_http_upstream_srv_conf_t *us)
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
149 {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
150 ngx_uint_t i;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
151 ngx_http_upstream_keepalive_srv_conf_t *kcf;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
152 ngx_http_upstream_keepalive_cache_t *cached;
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 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, cf->log, 0,
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
155 "init keepalive");
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
156
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
157 kcf = ngx_http_conf_upstream_srv_conf(us,
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
158 ngx_http_upstream_keepalive_module);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
159
7820
fdc3d40979b0 Introduced the "keepalive_time" directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7600
diff changeset
160 ngx_conf_init_msec_value(kcf->time, 3600000);
7339
d9029e113a05 Upstream keepalive: keepalive_timeout directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7338
diff changeset
161 ngx_conf_init_msec_value(kcf->timeout, 60000);
7822
82e174e47663 Changed keepalive_requests default to 1000 (ticket #2155).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7820
diff changeset
162 ngx_conf_init_uint_value(kcf->requests, 1000);
7339
d9029e113a05 Upstream keepalive: keepalive_timeout directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7338
diff changeset
163
4127
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
164 if (kcf->original_init_upstream(cf, us) != NGX_OK) {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
165 return NGX_ERROR;
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
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
168 kcf->original_init_peer = us->peer.init;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
169
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
170 us->peer.init = ngx_http_upstream_init_keepalive_peer;
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 /* allocate cache items and add to free queue */
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 cached = ngx_pcalloc(cf->pool,
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
175 sizeof(ngx_http_upstream_keepalive_cache_t) * kcf->max_cached);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
176 if (cached == NULL) {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
177 return NGX_ERROR;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
178 }
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 ngx_queue_init(&kcf->cache);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
181 ngx_queue_init(&kcf->free);
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 for (i = 0; i < kcf->max_cached; i++) {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
184 ngx_queue_insert_head(&kcf->free, &cached[i].queue);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
185 cached[i].conf = kcf;
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
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
188 return NGX_OK;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
189 }
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
190
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
191
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
192 static ngx_int_t
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
193 ngx_http_upstream_init_keepalive_peer(ngx_http_request_t *r,
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
194 ngx_http_upstream_srv_conf_t *us)
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
195 {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
196 ngx_http_upstream_keepalive_peer_data_t *kp;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
197 ngx_http_upstream_keepalive_srv_conf_t *kcf;
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 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
200 "init keepalive peer");
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
201
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
202 kcf = ngx_http_conf_upstream_srv_conf(us,
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
203 ngx_http_upstream_keepalive_module);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
204
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
205 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
206 if (kp == NULL) {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
207 return NGX_ERROR;
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 if (kcf->original_init_peer(r, us) != NGX_OK) {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
211 return NGX_ERROR;
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
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
214 kp->conf = kcf;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
215 kp->upstream = r->upstream;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
216 kp->data = r->upstream->peer.data;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
217 kp->original_get_peer = r->upstream->peer.get;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
218 kp->original_free_peer = r->upstream->peer.free;
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 r->upstream->peer.data = kp;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
221 r->upstream->peer.get = ngx_http_upstream_get_keepalive_peer;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
222 r->upstream->peer.free = ngx_http_upstream_free_keepalive_peer;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
223
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
224 #if (NGX_HTTP_SSL)
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
225 kp->original_set_session = r->upstream->peer.set_session;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
226 kp->original_save_session = r->upstream->peer.save_session;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
227 r->upstream->peer.set_session = ngx_http_upstream_keepalive_set_session;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
228 r->upstream->peer.save_session = ngx_http_upstream_keepalive_save_session;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
229 #endif
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 return NGX_OK;
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
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 static ngx_int_t
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
236 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
237 {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
238 ngx_http_upstream_keepalive_peer_data_t *kp = data;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
239 ngx_http_upstream_keepalive_cache_t *item;
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 ngx_int_t rc;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
242 ngx_queue_t *q, *cache;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
243 ngx_connection_t *c;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
244
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
245 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, pc->log, 0,
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
246 "get keepalive peer");
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
247
4694
5b5c07dee156 Upstream keepalive: "single" parameter deprecated.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4412
diff changeset
248 /* ask balancer */
4127
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 rc = kp->original_get_peer(pc, kp->data);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
251
4694
5b5c07dee156 Upstream keepalive: "single" parameter deprecated.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4412
diff changeset
252 if (rc != NGX_OK) {
4127
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
253 return rc;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
254 }
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 /* search cache for suitable connection */
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
257
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
258 cache = &kp->conf->cache;
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 for (q = ngx_queue_head(cache);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
261 q != ngx_queue_sentinel(cache);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
262 q = ngx_queue_next(q))
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
263 {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
264 item = ngx_queue_data(q, ngx_http_upstream_keepalive_cache_t, queue);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
265 c = item->connection;
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 if (ngx_memn2cmp((u_char *) &item->sockaddr, (u_char *) pc->sockaddr,
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
268 item->socklen, pc->socklen)
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
269 == 0)
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_queue_remove(q);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
272 ngx_queue_insert_head(&kp->conf->free, q);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
273
6167
87d48f8793b6 Upstream keepalive: reduced diffs to the plus version of nginx.
Roman Arutyunyan <arut@nginx.com>
parents: 5999
diff changeset
274 goto found;
4127
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
275 }
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
276 }
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 return NGX_OK;
6167
87d48f8793b6 Upstream keepalive: reduced diffs to the plus version of nginx.
Roman Arutyunyan <arut@nginx.com>
parents: 5999
diff changeset
279
87d48f8793b6 Upstream keepalive: reduced diffs to the plus version of nginx.
Roman Arutyunyan <arut@nginx.com>
parents: 5999
diff changeset
280 found:
87d48f8793b6 Upstream keepalive: reduced diffs to the plus version of nginx.
Roman Arutyunyan <arut@nginx.com>
parents: 5999
diff changeset
281
87d48f8793b6 Upstream keepalive: reduced diffs to the plus version of nginx.
Roman Arutyunyan <arut@nginx.com>
parents: 5999
diff changeset
282 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0,
87d48f8793b6 Upstream keepalive: reduced diffs to the plus version of nginx.
Roman Arutyunyan <arut@nginx.com>
parents: 5999
diff changeset
283 "get keepalive peer: using connection %p", c);
87d48f8793b6 Upstream keepalive: reduced diffs to the plus version of nginx.
Roman Arutyunyan <arut@nginx.com>
parents: 5999
diff changeset
284
87d48f8793b6 Upstream keepalive: reduced diffs to the plus version of nginx.
Roman Arutyunyan <arut@nginx.com>
parents: 5999
diff changeset
285 c->idle = 0;
87d48f8793b6 Upstream keepalive: reduced diffs to the plus version of nginx.
Roman Arutyunyan <arut@nginx.com>
parents: 5999
diff changeset
286 c->sent = 0;
7600
3939483cd1b5 Upstream keepalive: clearing of c->data in cached connections.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7340
diff changeset
287 c->data = NULL;
6167
87d48f8793b6 Upstream keepalive: reduced diffs to the plus version of nginx.
Roman Arutyunyan <arut@nginx.com>
parents: 5999
diff changeset
288 c->log = pc->log;
87d48f8793b6 Upstream keepalive: reduced diffs to the plus version of nginx.
Roman Arutyunyan <arut@nginx.com>
parents: 5999
diff changeset
289 c->read->log = pc->log;
87d48f8793b6 Upstream keepalive: reduced diffs to the plus version of nginx.
Roman Arutyunyan <arut@nginx.com>
parents: 5999
diff changeset
290 c->write->log = pc->log;
87d48f8793b6 Upstream keepalive: reduced diffs to the plus version of nginx.
Roman Arutyunyan <arut@nginx.com>
parents: 5999
diff changeset
291 c->pool->log = pc->log;
87d48f8793b6 Upstream keepalive: reduced diffs to the plus version of nginx.
Roman Arutyunyan <arut@nginx.com>
parents: 5999
diff changeset
292
7339
d9029e113a05 Upstream keepalive: keepalive_timeout directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7338
diff changeset
293 if (c->read->timer_set) {
d9029e113a05 Upstream keepalive: keepalive_timeout directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7338
diff changeset
294 ngx_del_timer(c->read);
d9029e113a05 Upstream keepalive: keepalive_timeout directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7338
diff changeset
295 }
d9029e113a05 Upstream keepalive: keepalive_timeout directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7338
diff changeset
296
6167
87d48f8793b6 Upstream keepalive: reduced diffs to the plus version of nginx.
Roman Arutyunyan <arut@nginx.com>
parents: 5999
diff changeset
297 pc->connection = c;
87d48f8793b6 Upstream keepalive: reduced diffs to the plus version of nginx.
Roman Arutyunyan <arut@nginx.com>
parents: 5999
diff changeset
298 pc->cached = 1;
87d48f8793b6 Upstream keepalive: reduced diffs to the plus version of nginx.
Roman Arutyunyan <arut@nginx.com>
parents: 5999
diff changeset
299
87d48f8793b6 Upstream keepalive: reduced diffs to the plus version of nginx.
Roman Arutyunyan <arut@nginx.com>
parents: 5999
diff changeset
300 return NGX_DONE;
4127
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
301 }
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
302
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 static void
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
305 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
306 ngx_uint_t state)
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 ngx_http_upstream_keepalive_peer_data_t *kp = data;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
309 ngx_http_upstream_keepalive_cache_t *item;
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 ngx_queue_t *q;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
312 ngx_connection_t *c;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
313 ngx_http_upstream_t *u;
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_debug0(NGX_LOG_DEBUG_HTTP, pc->log, 0,
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
316 "free keepalive peer");
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 /* cache valid connections */
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 u = kp->upstream;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
321 c = pc->connection;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
322
5133
089a662c17d1 Upstream: removed double-free workarounds in peer.free() methods.
Ruslan Ermilov <ru@nginx.com>
parents: 4998
diff changeset
323 if (state & NGX_PEER_FAILED
4127
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
324 || c == NULL
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
325 || c->read->eof
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
326 || c->read->error
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
327 || c->read->timedout
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
328 || c->write->error
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
329 || c->write->timedout)
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 goto invalid;
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
7340
70c6b08973a0 Upstream keepalive: keepalive_requests directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7339
diff changeset
334 if (c->requests >= kp->conf->requests) {
70c6b08973a0 Upstream keepalive: keepalive_requests directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7339
diff changeset
335 goto invalid;
70c6b08973a0 Upstream keepalive: keepalive_requests directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7339
diff changeset
336 }
70c6b08973a0 Upstream keepalive: keepalive_requests directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7339
diff changeset
337
7820
fdc3d40979b0 Introduced the "keepalive_time" directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7600
diff changeset
338 if (ngx_current_msec - c->start_time > kp->conf->time) {
fdc3d40979b0 Introduced the "keepalive_time" directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7600
diff changeset
339 goto invalid;
fdc3d40979b0 Introduced the "keepalive_time" directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7600
diff changeset
340 }
fdc3d40979b0 Introduced the "keepalive_time" directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7600
diff changeset
341
4127
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
342 if (!u->keepalive) {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
343 goto invalid;
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
6332
78b4e10b4367 Upstream: don't keep connections on early responses (ticket #669).
Maxim Dounin <mdounin@mdounin.ru>
parents: 6220
diff changeset
346 if (!u->request_body_sent) {
78b4e10b4367 Upstream: don't keep connections on early responses (ticket #669).
Maxim Dounin <mdounin@mdounin.ru>
parents: 6220
diff changeset
347 goto invalid;
78b4e10b4367 Upstream: don't keep connections on early responses (ticket #669).
Maxim Dounin <mdounin@mdounin.ru>
parents: 6220
diff changeset
348 }
78b4e10b4367 Upstream: don't keep connections on early responses (ticket #669).
Maxim Dounin <mdounin@mdounin.ru>
parents: 6220
diff changeset
349
6220
5e6142609e48 Core: idle connections now closed only once on exiting.
Valentin Bartenev <vbart@nginx.com>
parents: 6167
diff changeset
350 if (ngx_terminate || ngx_exiting) {
5e6142609e48 Core: idle connections now closed only once on exiting.
Valentin Bartenev <vbart@nginx.com>
parents: 6167
diff changeset
351 goto invalid;
5e6142609e48 Core: idle connections now closed only once on exiting.
Valentin Bartenev <vbart@nginx.com>
parents: 6167
diff changeset
352 }
5e6142609e48 Core: idle connections now closed only once on exiting.
Valentin Bartenev <vbart@nginx.com>
parents: 6167
diff changeset
353
4127
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
354 if (ngx_handle_read_event(c->read, 0) != NGX_OK) {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
355 goto invalid;
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 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0,
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
359 "free keepalive peer: saving connection %p", c);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
360
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
361 if (ngx_queue_empty(&kp->conf->free)) {
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 q = ngx_queue_last(&kp->conf->cache);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
364 ngx_queue_remove(q);
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 item = ngx_queue_data(q, ngx_http_upstream_keepalive_cache_t, queue);
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 ngx_http_upstream_keepalive_close(item->connection);
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 } else {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
371 q = ngx_queue_head(&kp->conf->free);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
372 ngx_queue_remove(q);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
373
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
374 item = ngx_queue_data(q, ngx_http_upstream_keepalive_cache_t, queue);
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
6167
87d48f8793b6 Upstream keepalive: reduced diffs to the plus version of nginx.
Roman Arutyunyan <arut@nginx.com>
parents: 5999
diff changeset
377 ngx_queue_insert_head(&kp->conf->cache, q);
87d48f8793b6 Upstream keepalive: reduced diffs to the plus version of nginx.
Roman Arutyunyan <arut@nginx.com>
parents: 5999
diff changeset
378
4127
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
379 item->connection = c;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
380
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
381 pc->connection = NULL;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
382
7339
d9029e113a05 Upstream keepalive: keepalive_timeout directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7338
diff changeset
383 c->read->delayed = 0;
d9029e113a05 Upstream keepalive: keepalive_timeout directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7338
diff changeset
384 ngx_add_timer(c->read, kp->conf->timeout);
d9029e113a05 Upstream keepalive: keepalive_timeout directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7338
diff changeset
385
4127
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
386 if (c->write->timer_set) {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
387 ngx_del_timer(c->write);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
388 }
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->write->handler = ngx_http_upstream_keepalive_dummy_handler;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
391 c->read->handler = ngx_http_upstream_keepalive_close_handler;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
392
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
393 c->data = item;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
394 c->idle = 1;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
395 c->log = ngx_cycle->log;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
396 c->read->log = ngx_cycle->log;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
397 c->write->log = ngx_cycle->log;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
398 c->pool->log = ngx_cycle->log;
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->socklen = pc->socklen;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
401 ngx_memcpy(&item->sockaddr, pc->sockaddr, pc->socklen);
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 if (c->read->ready) {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
404 ngx_http_upstream_keepalive_close_handler(c->read);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
405 }
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 invalid:
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 kp->original_free_peer(pc, kp->data, state);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
410 }
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
411
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 static void
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
414 ngx_http_upstream_keepalive_dummy_handler(ngx_event_t *ev)
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 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, ev->log, 0,
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
417 "keepalive dummy handler");
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
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
421 static void
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
422 ngx_http_upstream_keepalive_close_handler(ngx_event_t *ev)
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 ngx_http_upstream_keepalive_srv_conf_t *conf;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
425 ngx_http_upstream_keepalive_cache_t *item;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
426
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
427 int n;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
428 char buf[1];
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
429 ngx_connection_t *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 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, ev->log, 0,
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
432 "keepalive close handler");
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 c = ev->data;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
435
7339
d9029e113a05 Upstream keepalive: keepalive_timeout directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7338
diff changeset
436 if (c->close || c->read->timedout) {
4127
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
437 goto close;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
438 }
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 n = recv(c->fd, buf, 1, MSG_PEEK);
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 if (n == -1 && ngx_socket_errno == NGX_EAGAIN) {
5999
4d8936b1fc32 Upstream keepalive: drop ready flag on EAGAIN from recv(MSG_PEEK).
Valentin Bartenev <vbart@nginx.com>
parents: 5864
diff changeset
443 ev->ready = 0;
4127
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 if (ngx_handle_read_event(c->read, 0) != NGX_OK) {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
446 goto close;
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
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
449 return;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
450 }
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 close:
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 item = c->data;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
455 conf = item->conf;
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_close(c);
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_queue_remove(&item->queue);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
460 ngx_queue_insert_head(&conf->free, &item->queue);
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
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
464 static void
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
465 ngx_http_upstream_keepalive_close(ngx_connection_t *c)
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 #if (NGX_HTTP_SSL)
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 if (c->ssl) {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
471 c->ssl->no_wait_shutdown = 1;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
472 c->ssl->no_send_shutdown = 1;
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 if (ngx_ssl_shutdown(c) == NGX_AGAIN) {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
475 c->ssl->handler = ngx_http_upstream_keepalive_close;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
476 return;
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 #endif
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
481
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
482 ngx_destroy_pool(c->pool);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
483 ngx_close_connection(c);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
484 }
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
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
487 #if (NGX_HTTP_SSL)
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 static ngx_int_t
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
490 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
491 {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
492 ngx_http_upstream_keepalive_peer_data_t *kp = data;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
493
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
494 return kp->original_set_session(pc, kp->data);
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
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
497
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
498 static void
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
499 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
500 {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
501 ngx_http_upstream_keepalive_peer_data_t *kp = data;
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 kp->original_save_session(pc, kp->data);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
504 return;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
505 }
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 #endif
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
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
510 static void *
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
511 ngx_http_upstream_keepalive_create_conf(ngx_conf_t *cf)
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 ngx_http_upstream_keepalive_srv_conf_t *conf;
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 conf = ngx_pcalloc(cf->pool,
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
516 sizeof(ngx_http_upstream_keepalive_srv_conf_t));
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
517 if (conf == NULL) {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
518 return NULL;
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
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 * set by ngx_pcalloc():
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 * conf->original_init_upstream = NULL;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
525 * conf->original_init_peer = NULL;
6167
87d48f8793b6 Upstream keepalive: reduced diffs to the plus version of nginx.
Roman Arutyunyan <arut@nginx.com>
parents: 5999
diff changeset
526 * conf->max_cached = 0;
4127
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
7820
fdc3d40979b0 Introduced the "keepalive_time" directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7600
diff changeset
529 conf->time = NGX_CONF_UNSET_MSEC;
7339
d9029e113a05 Upstream keepalive: keepalive_timeout directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7338
diff changeset
530 conf->timeout = NGX_CONF_UNSET_MSEC;
7340
70c6b08973a0 Upstream keepalive: keepalive_requests directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7339
diff changeset
531 conf->requests = NGX_CONF_UNSET_UINT;
7339
d9029e113a05 Upstream keepalive: keepalive_timeout directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7338
diff changeset
532
4127
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
533 return conf;
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
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 static char *
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
538 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
539 {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
540 ngx_http_upstream_srv_conf_t *uscf;
5213
822b82191940 Upstream keepalive: slightly simplified code.
Ruslan Ermilov <ru@nginx.com>
parents: 5133
diff changeset
541 ngx_http_upstream_keepalive_srv_conf_t *kcf = conf;
4127
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
542
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
543 ngx_int_t n;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
544 ngx_str_t *value;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
545
6167
87d48f8793b6 Upstream keepalive: reduced diffs to the plus version of nginx.
Roman Arutyunyan <arut@nginx.com>
parents: 5999
diff changeset
546 if (kcf->max_cached) {
4998
82336a9ce26d Upstream keepalive: detect duplicate "keepalive" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 4694
diff changeset
547 return "is duplicate";
82336a9ce26d Upstream keepalive: detect duplicate "keepalive" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 4694
diff changeset
548 }
82336a9ce26d Upstream keepalive: detect duplicate "keepalive" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 4694
diff changeset
549
4127
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
550 /* read options */
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
551
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
552 value = cf->args->elts;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
553
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
554 n = ngx_atoi(value[1].data, value[1].len);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
555
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
556 if (n == NGX_ERROR || n == 0) {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
557 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
558 "invalid value \"%V\" in \"%V\" directive",
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
559 &value[1], &cmd->name);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
560 return NGX_CONF_ERROR;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
561 }
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
562
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
563 kcf->max_cached = n;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
564
7338
46174066b75f Upstream keepalive: comment added.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7165
diff changeset
565 /* init upstream handler */
46174066b75f Upstream keepalive: comment added.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7165
diff changeset
566
6167
87d48f8793b6 Upstream keepalive: reduced diffs to the plus version of nginx.
Roman Arutyunyan <arut@nginx.com>
parents: 5999
diff changeset
567 uscf = ngx_http_conf_get_module_srv_conf(cf, ngx_http_upstream_module);
87d48f8793b6 Upstream keepalive: reduced diffs to the plus version of nginx.
Roman Arutyunyan <arut@nginx.com>
parents: 5999
diff changeset
568
87d48f8793b6 Upstream keepalive: reduced diffs to the plus version of nginx.
Roman Arutyunyan <arut@nginx.com>
parents: 5999
diff changeset
569 kcf->original_init_upstream = uscf->peer.init_upstream
87d48f8793b6 Upstream keepalive: reduced diffs to the plus version of nginx.
Roman Arutyunyan <arut@nginx.com>
parents: 5999
diff changeset
570 ? uscf->peer.init_upstream
87d48f8793b6 Upstream keepalive: reduced diffs to the plus version of nginx.
Roman Arutyunyan <arut@nginx.com>
parents: 5999
diff changeset
571 : ngx_http_upstream_init_round_robin;
87d48f8793b6 Upstream keepalive: reduced diffs to the plus version of nginx.
Roman Arutyunyan <arut@nginx.com>
parents: 5999
diff changeset
572
87d48f8793b6 Upstream keepalive: reduced diffs to the plus version of nginx.
Roman Arutyunyan <arut@nginx.com>
parents: 5999
diff changeset
573 uscf->peer.init_upstream = ngx_http_upstream_init_keepalive;
87d48f8793b6 Upstream keepalive: reduced diffs to the plus version of nginx.
Roman Arutyunyan <arut@nginx.com>
parents: 5999
diff changeset
574
4127
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
575 return NGX_CONF_OK;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
576 }