nginxtra 1.2.1.3 → 1.2.2.3
Sign up to get free protection for your applications and to get access to all the features.
- data/VERSION +1 -1
- data/bin/nginxtra +1 -1
- data/src/nginx/CHANGES +60 -0
- data/src/nginx/CHANGES.ru +57 -0
- data/src/nginx/auto/{endianess → endianness} +5 -5
- data/src/nginx/auto/lib/google-perftools/conf +16 -0
- data/src/nginx/auto/modules +10 -0
- data/src/nginx/auto/options +3 -0
- data/src/nginx/auto/os/conf +2 -0
- data/src/nginx/auto/sources +5 -0
- data/src/nginx/auto/unix +1 -1
- data/src/nginx/src/core/nginx.h +2 -2
- data/src/nginx/src/core/ngx_hash.c +13 -11
- data/src/nginx/src/core/ngx_inet.c +32 -31
- data/src/nginx/src/core/ngx_regex.c +3 -3
- data/src/nginx/src/core/ngx_regex.h +2 -2
- data/src/nginx/src/core/ngx_resolver.c +22 -16
- data/src/nginx/src/event/ngx_event_openssl.c +18 -1
- data/src/nginx/src/http/modules/ngx_http_geo_module.c +1 -1
- data/src/nginx/src/http/modules/ngx_http_geoip_module.c +15 -4
- data/src/nginx/src/http/modules/ngx_http_log_module.c +3 -6
- data/src/nginx/src/http/modules/ngx_http_mp4_module.c +18 -1
- data/src/nginx/src/http/modules/ngx_http_rewrite_module.c +6 -0
- data/src/nginx/src/http/modules/ngx_http_split_clients_module.c +7 -0
- data/src/nginx/src/http/modules/ngx_http_upstream_ip_hash_module.c +44 -17
- data/src/nginx/src/http/modules/ngx_http_upstream_keepalive_module.c +4 -29
- data/src/nginx/src/http/modules/ngx_http_upstream_least_conn_module.c +402 -0
- data/src/nginx/src/http/modules/ngx_http_xslt_filter_module.c +2 -2
- data/src/nginx/src/http/modules/perl/nginx.pm +1 -1
- data/src/nginx/src/http/modules/perl/nginx.xs +1 -1
- data/src/nginx/src/http/ngx_http_core_module.c +1 -1
- data/src/nginx/src/http/ngx_http_header_filter_module.c +2 -2
- data/src/nginx/src/http/ngx_http_request.c +1 -1
- data/src/nginx/src/http/ngx_http_request.h +8 -1
- data/src/nginx/src/http/ngx_http_upstream.c +15 -1
- data/src/nginx/src/http/ngx_http_upstream_round_robin.c +11 -1
- data/src/nginx/src/http/ngx_http_upstream_round_robin.h +5 -1
- data/src/nginx/src/http/ngx_http_variables.c +49 -3
- data/src/nginx/src/os/unix/ngx_errno.c +1 -1
- data/src/nginx/src/os/unix/ngx_errno.h +1 -1
- data/src/nginx/src/os/unix/ngx_freebsd_init.c +2 -2
- data/src/nginx/src/os/unix/ngx_posix_config.h +1 -0
- data/src/nginx/src/os/unix/ngx_process_cycle.c +4 -0
- metadata +5 -4
@@ -28,7 +28,7 @@ typedef struct {
|
|
28
28
|
} ngx_http_geoip_var_t;
|
29
29
|
|
30
30
|
|
31
|
-
typedef
|
31
|
+
typedef char *(*ngx_http_geoip_variable_handler_pt)(GeoIP *, u_long addr);
|
32
32
|
|
33
33
|
static u_long ngx_http_geoip_addr(ngx_http_request_t *r,
|
34
34
|
ngx_http_geoip_conf_t *gcf);
|
@@ -291,7 +291,8 @@ ngx_http_geoip_org_variable(ngx_http_request_t *r,
|
|
291
291
|
ngx_http_geoip_variable_handler_pt handler =
|
292
292
|
(ngx_http_geoip_variable_handler_pt) data;
|
293
293
|
|
294
|
-
|
294
|
+
size_t len;
|
295
|
+
char *val;
|
295
296
|
ngx_http_geoip_conf_t *gcf;
|
296
297
|
|
297
298
|
gcf = ngx_http_get_module_main_conf(r, ngx_http_geoip_module);
|
@@ -306,11 +307,21 @@ ngx_http_geoip_org_variable(ngx_http_request_t *r,
|
|
306
307
|
goto not_found;
|
307
308
|
}
|
308
309
|
|
309
|
-
|
310
|
+
len = ngx_strlen(val);
|
311
|
+
v->data = ngx_pnalloc(r->pool, len);
|
312
|
+
if (v->data == NULL) {
|
313
|
+
ngx_free(val);
|
314
|
+
return NGX_ERROR;
|
315
|
+
}
|
316
|
+
|
317
|
+
ngx_memcpy(v->data, val, len);
|
318
|
+
|
319
|
+
v->len = len;
|
310
320
|
v->valid = 1;
|
311
321
|
v->no_cacheable = 0;
|
312
322
|
v->not_found = 0;
|
313
|
-
|
323
|
+
|
324
|
+
ngx_free(val);
|
314
325
|
|
315
326
|
return NGX_OK;
|
316
327
|
|
@@ -205,7 +205,7 @@ static ngx_http_log_var_t ngx_http_log_vars[] = {
|
|
205
205
|
{ ngx_string("msec"), NGX_TIME_T_LEN + 4, ngx_http_log_msec },
|
206
206
|
{ ngx_string("request_time"), NGX_TIME_T_LEN + 4,
|
207
207
|
ngx_http_log_request_time },
|
208
|
-
{ ngx_string("status"),
|
208
|
+
{ ngx_string("status"), NGX_INT_T_LEN, ngx_http_log_status },
|
209
209
|
{ ngx_string("bytes_sent"), NGX_OFF_T_LEN, ngx_http_log_bytes_sent },
|
210
210
|
{ ngx_string("body_bytes_sent"), NGX_OFF_T_LEN,
|
211
211
|
ngx_http_log_body_bytes_sent },
|
@@ -584,16 +584,13 @@ ngx_http_log_status(ngx_http_request_t *r, u_char *buf, ngx_http_log_op_t *op)
|
|
584
584
|
status = r->headers_out.status;
|
585
585
|
|
586
586
|
} else if (r->http_version == NGX_HTTP_VERSION_9) {
|
587
|
-
|
588
|
-
*buf++ = '0';
|
589
|
-
*buf++ = '9';
|
590
|
-
return buf;
|
587
|
+
status = 9;
|
591
588
|
|
592
589
|
} else {
|
593
590
|
status = 0;
|
594
591
|
}
|
595
592
|
|
596
|
-
return ngx_sprintf(buf, "%
|
593
|
+
return ngx_sprintf(buf, "%03ui", status);
|
597
594
|
}
|
598
595
|
|
599
596
|
|
@@ -1024,6 +1024,10 @@ ngx_http_mp4_read_moov_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size)
|
|
1024
1024
|
+ NGX_HTTP_MP4_MOOV_BUFFER_EXCESS * no_mdat;
|
1025
1025
|
}
|
1026
1026
|
|
1027
|
+
if (ngx_http_mp4_read(mp4, (size_t) atom_data_size) != NGX_OK) {
|
1028
|
+
return NGX_ERROR;
|
1029
|
+
}
|
1030
|
+
|
1027
1031
|
mp4->trak.elts = &mp4->traks;
|
1028
1032
|
mp4->trak.size = sizeof(ngx_http_mp4_trak_t);
|
1029
1033
|
mp4->trak.nalloc = 2;
|
@@ -1044,6 +1048,12 @@ ngx_http_mp4_read_moov_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size)
|
|
1044
1048
|
mp4->buffer_start = mp4->buffer_pos;
|
1045
1049
|
mp4->buffer_size = NGX_HTTP_MP4_MOOV_BUFFER_EXCESS;
|
1046
1050
|
|
1051
|
+
if (mp4->buffer_start + mp4->buffer_size > mp4->buffer_end) {
|
1052
|
+
mp4->buffer = NULL;
|
1053
|
+
mp4->buffer_pos = NULL;
|
1054
|
+
mp4->buffer_end = NULL;
|
1055
|
+
}
|
1056
|
+
|
1047
1057
|
} else {
|
1048
1058
|
/* skip atoms after moov atom */
|
1049
1059
|
mp4->offset = mp4->end;
|
@@ -2488,7 +2498,13 @@ found:
|
|
2488
2498
|
|
2489
2499
|
ngx_mp4_set_32value(entry->chunk, 1);
|
2490
2500
|
|
2491
|
-
if (trak->chunk_samples) {
|
2501
|
+
if (trak->chunk_samples && next_chunk - trak->start_chunk == 2) {
|
2502
|
+
|
2503
|
+
/* last chunk in the entry */
|
2504
|
+
|
2505
|
+
ngx_mp4_set_32value(entry->samples, samples - trak->chunk_samples);
|
2506
|
+
|
2507
|
+
} else if (trak->chunk_samples) {
|
2492
2508
|
|
2493
2509
|
first = &trak->stsc_chunk_entry;
|
2494
2510
|
ngx_mp4_set_32value(first->chunk, 1);
|
@@ -2504,6 +2520,7 @@ found:
|
|
2504
2520
|
|
2505
2521
|
ngx_mp4_set_32value(entry->chunk, 2);
|
2506
2522
|
|
2523
|
+
entries++;
|
2507
2524
|
atom_size += sizeof(ngx_mp4_stsc_entry_t);
|
2508
2525
|
}
|
2509
2526
|
|
@@ -485,6 +485,12 @@ ngx_http_rewrite_return(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
|
|
485
485
|
|
486
486
|
} else {
|
487
487
|
|
488
|
+
if (ret->status > 999) {
|
489
|
+
ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
|
490
|
+
"invalid return code \"%V\"", &value[1]);
|
491
|
+
return NGX_CONF_ERROR;
|
492
|
+
}
|
493
|
+
|
488
494
|
if (cf->args->nelts == 2) {
|
489
495
|
return NGX_CONF_OK;
|
490
496
|
}
|
@@ -138,6 +138,13 @@ ngx_conf_split_clients_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
|
|
138
138
|
}
|
139
139
|
|
140
140
|
name = value[2];
|
141
|
+
|
142
|
+
if (name.len < 2 || name.data[0] != '$') {
|
143
|
+
ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
|
144
|
+
"invalid variable name \"%V\"", &name);
|
145
|
+
return NGX_CONF_ERROR;
|
146
|
+
}
|
147
|
+
|
141
148
|
name.len--;
|
142
149
|
name.data++;
|
143
150
|
|
@@ -16,7 +16,8 @@ typedef struct {
|
|
16
16
|
|
17
17
|
ngx_uint_t hash;
|
18
18
|
|
19
|
-
u_char
|
19
|
+
u_char addrlen;
|
20
|
+
u_char *addr;
|
20
21
|
|
21
22
|
u_char tries;
|
22
23
|
|
@@ -76,7 +77,10 @@ ngx_module_t ngx_http_upstream_ip_hash_module = {
|
|
76
77
|
};
|
77
78
|
|
78
79
|
|
79
|
-
|
80
|
+
static u_char ngx_http_upstream_ip_hash_pseudo_addr[3];
|
81
|
+
|
82
|
+
|
83
|
+
static ngx_int_t
|
80
84
|
ngx_http_upstream_init_ip_hash(ngx_conf_t *cf, ngx_http_upstream_srv_conf_t *us)
|
81
85
|
{
|
82
86
|
if (ngx_http_upstream_init_round_robin(cf, us) != NGX_OK) {
|
@@ -93,8 +97,10 @@ static ngx_int_t
|
|
93
97
|
ngx_http_upstream_init_ip_hash_peer(ngx_http_request_t *r,
|
94
98
|
ngx_http_upstream_srv_conf_t *us)
|
95
99
|
{
|
96
|
-
u_char *p;
|
97
100
|
struct sockaddr_in *sin;
|
101
|
+
#if (NGX_HAVE_INET6)
|
102
|
+
struct sockaddr_in6 *sin6;
|
103
|
+
#endif
|
98
104
|
ngx_http_upstream_ip_hash_peer_data_t *iphp;
|
99
105
|
|
100
106
|
iphp = ngx_palloc(r->pool, sizeof(ngx_http_upstream_ip_hash_peer_data_t));
|
@@ -110,20 +116,25 @@ ngx_http_upstream_init_ip_hash_peer(ngx_http_request_t *r,
|
|
110
116
|
|
111
117
|
r->upstream->peer.get = ngx_http_upstream_get_ip_hash_peer;
|
112
118
|
|
113
|
-
|
114
|
-
|
115
|
-
if (r->connection->sockaddr->sa_family == AF_INET) {
|
119
|
+
switch (r->connection->sockaddr->sa_family) {
|
116
120
|
|
121
|
+
case AF_INET:
|
117
122
|
sin = (struct sockaddr_in *) r->connection->sockaddr;
|
118
|
-
|
119
|
-
iphp->
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
iphp->addr
|
126
|
-
iphp->
|
123
|
+
iphp->addr = (u_char *) &sin->sin_addr.s_addr;
|
124
|
+
iphp->addrlen = 3;
|
125
|
+
break;
|
126
|
+
|
127
|
+
#if (NGX_HAVE_INET6)
|
128
|
+
case AF_INET6:
|
129
|
+
sin6 = (struct sockaddr_in6 *) r->connection->sockaddr;
|
130
|
+
iphp->addr = (u_char *) &sin6->sin6_addr.s6_addr;
|
131
|
+
iphp->addrlen = 16;
|
132
|
+
break;
|
133
|
+
#endif
|
134
|
+
|
135
|
+
default:
|
136
|
+
iphp->addr = ngx_http_upstream_ip_hash_pseudo_addr;
|
137
|
+
iphp->addrlen = 3;
|
127
138
|
}
|
128
139
|
|
129
140
|
iphp->hash = 89;
|
@@ -140,6 +151,7 @@ ngx_http_upstream_get_ip_hash_peer(ngx_peer_connection_t *pc, void *data)
|
|
140
151
|
ngx_http_upstream_ip_hash_peer_data_t *iphp = data;
|
141
152
|
|
142
153
|
time_t now;
|
154
|
+
ngx_int_t w;
|
143
155
|
uintptr_t m;
|
144
156
|
ngx_uint_t i, n, p, hash;
|
145
157
|
ngx_http_upstream_rr_peer_t *peer;
|
@@ -162,11 +174,25 @@ ngx_http_upstream_get_ip_hash_peer(ngx_peer_connection_t *pc, void *data)
|
|
162
174
|
|
163
175
|
for ( ;; ) {
|
164
176
|
|
165
|
-
for (i = 0; i <
|
177
|
+
for (i = 0; i < iphp->addrlen; i++) {
|
166
178
|
hash = (hash * 113 + iphp->addr[i]) % 6271;
|
167
179
|
}
|
168
180
|
|
169
|
-
|
181
|
+
if (!iphp->rrp.peers->weighted) {
|
182
|
+
p = hash % iphp->rrp.peers->number;
|
183
|
+
|
184
|
+
} else {
|
185
|
+
w = hash % iphp->rrp.peers->total_weight;
|
186
|
+
|
187
|
+
for (i = 0; i < iphp->rrp.peers->number; i++) {
|
188
|
+
w -= iphp->rrp.peers->peer[i].weight;
|
189
|
+
if (w < 0) {
|
190
|
+
break;
|
191
|
+
}
|
192
|
+
}
|
193
|
+
|
194
|
+
p = i;
|
195
|
+
}
|
170
196
|
|
171
197
|
n = p / (8 * sizeof(uintptr_t));
|
172
198
|
m = (uintptr_t) 1 << p % (8 * sizeof(uintptr_t));
|
@@ -229,6 +255,7 @@ ngx_http_upstream_ip_hash(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
|
|
229
255
|
uscf->peer.init_upstream = ngx_http_upstream_init_ip_hash;
|
230
256
|
|
231
257
|
uscf->flags = NGX_HTTP_UPSTREAM_CREATE
|
258
|
+
|NGX_HTTP_UPSTREAM_WEIGHT
|
232
259
|
|NGX_HTTP_UPSTREAM_MAX_FAILS
|
233
260
|
|NGX_HTTP_UPSTREAM_FAIL_TIMEOUT
|
234
261
|
|NGX_HTTP_UPSTREAM_DOWN;
|
@@ -12,7 +12,6 @@
|
|
12
12
|
|
13
13
|
typedef struct {
|
14
14
|
ngx_uint_t max_cached;
|
15
|
-
ngx_uint_t single; /* unsigned:1 */
|
16
15
|
|
17
16
|
ngx_queue_t cache;
|
18
17
|
ngx_queue_t free;
|
@@ -223,36 +222,11 @@ ngx_http_upstream_get_keepalive_peer(ngx_peer_connection_t *pc, void *data)
|
|
223
222
|
|
224
223
|
kp->failed = 0;
|
225
224
|
|
226
|
-
/*
|
227
|
-
|
228
|
-
if (kp->conf->single && !ngx_queue_empty(&kp->conf->cache)) {
|
229
|
-
|
230
|
-
q = ngx_queue_head(&kp->conf->cache);
|
231
|
-
|
232
|
-
item = ngx_queue_data(q, ngx_http_upstream_keepalive_cache_t, queue);
|
233
|
-
c = item->connection;
|
234
|
-
|
235
|
-
ngx_queue_remove(q);
|
236
|
-
ngx_queue_insert_head(&kp->conf->free, q);
|
237
|
-
|
238
|
-
ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0,
|
239
|
-
"get keepalive peer: using connection %p", c);
|
240
|
-
|
241
|
-
c->idle = 0;
|
242
|
-
c->log = pc->log;
|
243
|
-
c->read->log = pc->log;
|
244
|
-
c->write->log = pc->log;
|
245
|
-
c->pool->log = pc->log;
|
246
|
-
|
247
|
-
pc->connection = c;
|
248
|
-
pc->cached = 1;
|
249
|
-
|
250
|
-
return NGX_DONE;
|
251
|
-
}
|
225
|
+
/* ask balancer */
|
252
226
|
|
253
227
|
rc = kp->original_get_peer(pc, kp->data);
|
254
228
|
|
255
|
-
if (
|
229
|
+
if (rc != NGX_OK) {
|
256
230
|
return rc;
|
257
231
|
}
|
258
232
|
|
@@ -552,7 +526,8 @@ ngx_http_upstream_keepalive(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
|
|
552
526
|
for (i = 2; i < cf->args->nelts; i++) {
|
553
527
|
|
554
528
|
if (ngx_strcmp(value[i].data, "single") == 0) {
|
555
|
-
|
529
|
+
ngx_conf_log_error(NGX_LOG_WARN, cf, 0,
|
530
|
+
"the \"single\" parameter is deprecated");
|
556
531
|
continue;
|
557
532
|
}
|
558
533
|
|