nginxtra 1.2.0.1 → 1.2.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/VERSION +1 -1
- data/bin/nginxtra +1 -1
- data/lib/nginxtra.rb +2 -0
- data/lib/nginxtra/action.rb +1 -1
- data/lib/nginxtra/actions/convert.rb +67 -0
- data/lib/nginxtra/actions/install.rb +3 -0
- data/lib/nginxtra/cli.rb +20 -0
- data/lib/nginxtra/config_converter.rb +324 -0
- data/lib/nginxtra/error.rb +3 -0
- data/src/nginx/CHANGES +45 -0
- data/src/nginx/CHANGES.ru +46 -0
- data/src/nginx/src/core/nginx.h +2 -2
- data/src/nginx/src/core/ngx_resolver.c +14 -2
- data/src/nginx/src/event/ngx_event.c +18 -21
- data/src/nginx/src/event/ngx_event.h +0 -6
- data/src/nginx/src/event/ngx_event_accept.c +90 -13
- data/src/nginx/src/event/ngx_event_openssl.c +1 -0
- data/src/nginx/src/http/modules/ngx_http_fastcgi_module.c +26 -4
- data/src/nginx/src/http/modules/ngx_http_flv_module.c +1 -1
- data/src/nginx/src/http/modules/ngx_http_geo_module.c +62 -74
- data/src/nginx/src/http/modules/ngx_http_geoip_module.c +130 -30
- data/src/nginx/src/http/modules/ngx_http_gzip_static_module.c +1 -1
- data/src/nginx/src/http/modules/ngx_http_mp4_module.c +1 -1
- data/src/nginx/src/http/modules/ngx_http_realip_module.c +45 -93
- data/src/nginx/src/http/modules/ngx_http_scgi_module.c +2 -0
- data/src/nginx/src/http/modules/ngx_http_stub_status_module.c +1 -1
- data/src/nginx/src/http/modules/ngx_http_uwsgi_module.c +2 -0
- data/src/nginx/src/http/modules/perl/nginx.pm +1 -1
- data/src/nginx/src/http/ngx_http_core_module.c +104 -0
- data/src/nginx/src/http/ngx_http_core_module.h +3 -0
- data/src/nginx/src/http/ngx_http_parse.c +20 -0
- data/src/nginx/src/http/ngx_http_request.c +26 -15
- data/src/nginx/src/http/ngx_http_script.c +0 -1
- data/src/nginx/src/http/ngx_http_upstream_round_robin.c +72 -170
- data/src/nginx/src/http/ngx_http_upstream_round_robin.h +1 -0
- data/src/nginx/src/os/unix/ngx_errno.h +2 -0
- metadata +6 -4
@@ -513,6 +513,9 @@ ngx_int_t ngx_http_write_filter(ngx_http_request_t *r, ngx_chain_t *chain);
|
|
513
513
|
ngx_int_t ngx_http_set_disable_symlinks(ngx_http_request_t *r,
|
514
514
|
ngx_http_core_loc_conf_t *clcf, ngx_str_t *path, ngx_open_file_info_t *of);
|
515
515
|
|
516
|
+
ngx_int_t ngx_http_get_forwarded_addr(ngx_http_request_t *r, ngx_addr_t *addr,
|
517
|
+
u_char *xff, size_t xfflen, ngx_array_t *proxies, int recursive);
|
518
|
+
|
516
519
|
|
517
520
|
extern ngx_module_t ngx_http_core_module;
|
518
521
|
|
@@ -543,6 +543,13 @@ ngx_http_parse_request_line(ngx_http_request_t *r, ngx_buf_t *b)
|
|
543
543
|
|
544
544
|
switch (ch) {
|
545
545
|
case '/':
|
546
|
+
#if (NGX_WIN32)
|
547
|
+
if (r->uri_ext == p) {
|
548
|
+
r->complex_uri = 1;
|
549
|
+
state = sw_uri;
|
550
|
+
break;
|
551
|
+
}
|
552
|
+
#endif
|
546
553
|
r->uri_ext = NULL;
|
547
554
|
state = sw_after_slash_in_uri;
|
548
555
|
break;
|
@@ -1117,6 +1124,12 @@ ngx_http_parse_complex_uri(ngx_http_request_t *r, ngx_uint_t merge_slashes)
|
|
1117
1124
|
switch(ch) {
|
1118
1125
|
#if (NGX_WIN32)
|
1119
1126
|
case '\\':
|
1127
|
+
if (u - 2 >= r->uri.data
|
1128
|
+
&& *(u - 1) == '.' && *(u - 2) != '.')
|
1129
|
+
{
|
1130
|
+
u--;
|
1131
|
+
}
|
1132
|
+
|
1120
1133
|
r->uri_ext = NULL;
|
1121
1134
|
|
1122
1135
|
if (p == r->uri_start + r->uri.len) {
|
@@ -1134,6 +1147,13 @@ ngx_http_parse_complex_uri(ngx_http_request_t *r, ngx_uint_t merge_slashes)
|
|
1134
1147
|
break;
|
1135
1148
|
#endif
|
1136
1149
|
case '/':
|
1150
|
+
#if (NGX_WIN32)
|
1151
|
+
if (u - 2 >= r->uri.data
|
1152
|
+
&& *(u - 1) == '.' && *(u - 2) != '.')
|
1153
|
+
{
|
1154
|
+
u--;
|
1155
|
+
}
|
1156
|
+
#endif
|
1137
1157
|
r->uri_ext = NULL;
|
1138
1158
|
state = sw_slash;
|
1139
1159
|
*u++ = ch;
|
@@ -812,7 +812,28 @@ ngx_http_process_request_line(ngx_event_t *rev)
|
|
812
812
|
|
813
813
|
#if (NGX_WIN32)
|
814
814
|
{
|
815
|
-
u_char *p;
|
815
|
+
u_char *p, *last;
|
816
|
+
|
817
|
+
p = r->uri.data;
|
818
|
+
last = r->uri.data + r->uri.len;
|
819
|
+
|
820
|
+
while (p < last) {
|
821
|
+
|
822
|
+
if (*p++ == ':') {
|
823
|
+
|
824
|
+
/*
|
825
|
+
* this check covers "::$data", "::$index_allocation" and
|
826
|
+
* ":$i30:$index_allocation"
|
827
|
+
*/
|
828
|
+
|
829
|
+
if (p < last && *p == '$') {
|
830
|
+
ngx_log_error(NGX_LOG_INFO, c->log, 0,
|
831
|
+
"client sent unsafe win32 URI");
|
832
|
+
ngx_http_finalize_request(r, NGX_HTTP_BAD_REQUEST);
|
833
|
+
return;
|
834
|
+
}
|
835
|
+
}
|
836
|
+
}
|
816
837
|
|
817
838
|
p = r->uri.data + r->uri.len - 1;
|
818
839
|
|
@@ -828,11 +849,6 @@ ngx_http_process_request_line(ngx_event_t *rev)
|
|
828
849
|
continue;
|
829
850
|
}
|
830
851
|
|
831
|
-
if (ngx_strncasecmp(p - 6, (u_char *) "::$data", 7) == 0) {
|
832
|
-
p -= 7;
|
833
|
-
continue;
|
834
|
-
}
|
835
|
-
|
836
852
|
break;
|
837
853
|
}
|
838
854
|
|
@@ -1933,7 +1949,6 @@ ngx_http_finalize_request(ngx_http_request_t *r, ngx_int_t rc)
|
|
1933
1949
|
|
1934
1950
|
if (rc == NGX_OK && r->filter_finalize) {
|
1935
1951
|
c->error = 1;
|
1936
|
-
return;
|
1937
1952
|
}
|
1938
1953
|
|
1939
1954
|
if (rc == NGX_DECLINED) {
|
@@ -2001,14 +2016,6 @@ ngx_http_finalize_request(ngx_http_request_t *r, ngx_int_t rc)
|
|
2001
2016
|
return;
|
2002
2017
|
}
|
2003
2018
|
|
2004
|
-
#if (NGX_DEBUG)
|
2005
|
-
if (r != c->data) {
|
2006
|
-
ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,
|
2007
|
-
"http finalize non-active request: \"%V?%V\"",
|
2008
|
-
&r->uri, &r->args);
|
2009
|
-
}
|
2010
|
-
#endif
|
2011
|
-
|
2012
2019
|
pr = r->parent;
|
2013
2020
|
|
2014
2021
|
if (r == c->data) {
|
@@ -2042,6 +2049,10 @@ ngx_http_finalize_request(ngx_http_request_t *r, ngx_int_t rc)
|
|
2042
2049
|
|
2043
2050
|
} else {
|
2044
2051
|
|
2052
|
+
ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,
|
2053
|
+
"http finalize non-active request: \"%V?%V\"",
|
2054
|
+
&r->uri, &r->args);
|
2055
|
+
|
2045
2056
|
r->write_event_handler = ngx_http_request_finalizer;
|
2046
2057
|
|
2047
2058
|
if (r->waited) {
|
@@ -12,8 +12,8 @@
|
|
12
12
|
|
13
13
|
static ngx_int_t ngx_http_upstream_cmp_servers(const void *one,
|
14
14
|
const void *two);
|
15
|
-
static
|
16
|
-
|
15
|
+
static ngx_http_upstream_rr_peer_t *ngx_http_upstream_get_peer(
|
16
|
+
ngx_http_upstream_rr_peer_data_t *rrp);
|
17
17
|
|
18
18
|
#if (NGX_HTTP_SSL)
|
19
19
|
|
@@ -80,8 +80,9 @@ ngx_http_upstream_init_round_robin(ngx_conf_t *cf,
|
|
80
80
|
peers->peer[n].max_fails = server[i].max_fails;
|
81
81
|
peers->peer[n].fail_timeout = server[i].fail_timeout;
|
82
82
|
peers->peer[n].down = server[i].down;
|
83
|
-
peers->peer[n].weight = server[i].
|
84
|
-
peers->peer[n].
|
83
|
+
peers->peer[n].weight = server[i].weight;
|
84
|
+
peers->peer[n].effective_weight = server[i].weight;
|
85
|
+
peers->peer[n].current_weight = 0;
|
85
86
|
n++;
|
86
87
|
}
|
87
88
|
}
|
@@ -131,7 +132,8 @@ ngx_http_upstream_init_round_robin(ngx_conf_t *cf,
|
|
131
132
|
backup->peer[n].socklen = server[i].addrs[j].socklen;
|
132
133
|
backup->peer[n].name = server[i].addrs[j].name;
|
133
134
|
backup->peer[n].weight = server[i].weight;
|
134
|
-
backup->peer[n].
|
135
|
+
backup->peer[n].effective_weight = server[i].weight;
|
136
|
+
backup->peer[n].current_weight = 0;
|
135
137
|
backup->peer[n].max_fails = server[i].max_fails;
|
136
138
|
backup->peer[n].fail_timeout = server[i].fail_timeout;
|
137
139
|
backup->peer[n].down = server[i].down;
|
@@ -190,7 +192,8 @@ ngx_http_upstream_init_round_robin(ngx_conf_t *cf,
|
|
190
192
|
peers->peer[i].socklen = u.addrs[i].socklen;
|
191
193
|
peers->peer[i].name = u.addrs[i].name;
|
192
194
|
peers->peer[i].weight = 1;
|
193
|
-
peers->peer[i].
|
195
|
+
peers->peer[i].effective_weight = 1;
|
196
|
+
peers->peer[i].current_weight = 0;
|
194
197
|
peers->peer[i].max_fails = 1;
|
195
198
|
peers->peer[i].fail_timeout = 10;
|
196
199
|
}
|
@@ -306,7 +309,8 @@ ngx_http_upstream_create_round_robin_peer(ngx_http_request_t *r,
|
|
306
309
|
peers->peer[0].socklen = ur->socklen;
|
307
310
|
peers->peer[0].name = ur->host;
|
308
311
|
peers->peer[0].weight = 1;
|
309
|
-
peers->peer[0].
|
312
|
+
peers->peer[0].effective_weight = 1;
|
313
|
+
peers->peer[0].current_weight = 0;
|
310
314
|
peers->peer[0].max_fails = 1;
|
311
315
|
peers->peer[0].fail_timeout = 10;
|
312
316
|
|
@@ -338,7 +342,8 @@ ngx_http_upstream_create_round_robin_peer(ngx_http_request_t *r,
|
|
338
342
|
peers->peer[i].name.len = len;
|
339
343
|
peers->peer[i].name.data = p;
|
340
344
|
peers->peer[i].weight = 1;
|
341
|
-
peers->peer[i].
|
345
|
+
peers->peer[i].effective_weight = 1;
|
346
|
+
peers->peer[i].current_weight = 0;
|
342
347
|
peers->peer[i].max_fails = 1;
|
343
348
|
peers->peer[i].fail_timeout = 10;
|
344
349
|
}
|
@@ -378,8 +383,6 @@ ngx_http_upstream_get_round_robin_peer(ngx_peer_connection_t *pc, void *data)
|
|
378
383
|
{
|
379
384
|
ngx_http_upstream_rr_peer_data_t *rrp = data;
|
380
385
|
|
381
|
-
time_t now;
|
382
|
-
uintptr_t m;
|
383
386
|
ngx_int_t rc;
|
384
387
|
ngx_uint_t i, n;
|
385
388
|
ngx_connection_t *c;
|
@@ -389,8 +392,6 @@ ngx_http_upstream_get_round_robin_peer(ngx_peer_connection_t *pc, void *data)
|
|
389
392
|
ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0,
|
390
393
|
"get rr peer, try: %ui", pc->tries);
|
391
394
|
|
392
|
-
now = ngx_time();
|
393
|
-
|
394
395
|
/* ngx_lock_mutex(rrp->peers->mutex); */
|
395
396
|
|
396
397
|
if (rrp->peers->last_cached) {
|
@@ -423,118 +424,15 @@ ngx_http_upstream_get_round_robin_peer(ngx_peer_connection_t *pc, void *data)
|
|
423
424
|
|
424
425
|
/* there are several peers */
|
425
426
|
|
426
|
-
|
427
|
-
|
428
|
-
/* it's a first try - get a current peer */
|
429
|
-
|
430
|
-
i = pc->tries;
|
431
|
-
|
432
|
-
for ( ;; ) {
|
433
|
-
rrp->current = ngx_http_upstream_get_peer(rrp->peers);
|
434
|
-
|
435
|
-
ngx_log_debug2(NGX_LOG_DEBUG_HTTP, pc->log, 0,
|
436
|
-
"get rr peer, current: %ui %i",
|
437
|
-
rrp->current,
|
438
|
-
rrp->peers->peer[rrp->current].current_weight);
|
439
|
-
|
440
|
-
n = rrp->current / (8 * sizeof(uintptr_t));
|
441
|
-
m = (uintptr_t) 1 << rrp->current % (8 * sizeof(uintptr_t));
|
442
|
-
|
443
|
-
if (!(rrp->tried[n] & m)) {
|
444
|
-
peer = &rrp->peers->peer[rrp->current];
|
445
|
-
|
446
|
-
if (!peer->down) {
|
447
|
-
|
448
|
-
if (peer->max_fails == 0
|
449
|
-
|| peer->fails < peer->max_fails)
|
450
|
-
{
|
451
|
-
break;
|
452
|
-
}
|
427
|
+
peer = ngx_http_upstream_get_peer(rrp);
|
453
428
|
|
454
|
-
|
455
|
-
|
456
|
-
break;
|
457
|
-
}
|
458
|
-
|
459
|
-
peer->current_weight = 0;
|
460
|
-
|
461
|
-
} else {
|
462
|
-
rrp->tried[n] |= m;
|
463
|
-
}
|
464
|
-
|
465
|
-
pc->tries--;
|
466
|
-
}
|
467
|
-
|
468
|
-
if (pc->tries == 0) {
|
469
|
-
goto failed;
|
470
|
-
}
|
471
|
-
|
472
|
-
if (--i == 0) {
|
473
|
-
ngx_log_error(NGX_LOG_ALERT, pc->log, 0,
|
474
|
-
"round robin upstream stuck on %ui tries",
|
475
|
-
pc->tries);
|
476
|
-
goto failed;
|
477
|
-
}
|
478
|
-
}
|
479
|
-
|
480
|
-
peer->current_weight--;
|
481
|
-
|
482
|
-
} else {
|
483
|
-
|
484
|
-
i = pc->tries;
|
485
|
-
|
486
|
-
for ( ;; ) {
|
487
|
-
n = rrp->current / (8 * sizeof(uintptr_t));
|
488
|
-
m = (uintptr_t) 1 << rrp->current % (8 * sizeof(uintptr_t));
|
489
|
-
|
490
|
-
if (!(rrp->tried[n] & m)) {
|
491
|
-
|
492
|
-
peer = &rrp->peers->peer[rrp->current];
|
493
|
-
|
494
|
-
if (!peer->down) {
|
495
|
-
|
496
|
-
if (peer->max_fails == 0
|
497
|
-
|| peer->fails < peer->max_fails)
|
498
|
-
{
|
499
|
-
break;
|
500
|
-
}
|
501
|
-
|
502
|
-
if (now - peer->checked > peer->fail_timeout) {
|
503
|
-
peer->checked = now;
|
504
|
-
break;
|
505
|
-
}
|
506
|
-
|
507
|
-
peer->current_weight = 0;
|
508
|
-
|
509
|
-
} else {
|
510
|
-
rrp->tried[n] |= m;
|
511
|
-
}
|
512
|
-
|
513
|
-
pc->tries--;
|
514
|
-
}
|
515
|
-
|
516
|
-
rrp->current++;
|
517
|
-
|
518
|
-
if (rrp->current >= rrp->peers->number) {
|
519
|
-
rrp->current = 0;
|
520
|
-
}
|
521
|
-
|
522
|
-
if (pc->tries == 0) {
|
523
|
-
goto failed;
|
524
|
-
}
|
525
|
-
|
526
|
-
if (--i == 0) {
|
527
|
-
ngx_log_error(NGX_LOG_ALERT, pc->log, 0,
|
528
|
-
"round robin upstream stuck on %ui tries",
|
529
|
-
pc->tries);
|
530
|
-
goto failed;
|
531
|
-
}
|
532
|
-
}
|
533
|
-
|
534
|
-
peer->current_weight--;
|
429
|
+
if (peer == NULL) {
|
430
|
+
goto failed;
|
535
431
|
}
|
536
432
|
|
537
|
-
|
433
|
+
ngx_log_debug2(NGX_LOG_DEBUG_HTTP, pc->log, 0,
|
434
|
+
"get rr peer, current: %ui %i",
|
435
|
+
rrp->current, peer->current_weight);
|
538
436
|
}
|
539
437
|
|
540
438
|
pc->sockaddr = peer->sockaddr;
|
@@ -545,11 +443,6 @@ ngx_http_upstream_get_round_robin_peer(ngx_peer_connection_t *pc, void *data)
|
|
545
443
|
|
546
444
|
if (pc->tries == 1 && rrp->peers->next) {
|
547
445
|
pc->tries += rrp->peers->next->number;
|
548
|
-
|
549
|
-
n = rrp->peers->next->number / (8 * sizeof(uintptr_t)) + 1;
|
550
|
-
for (i = 0; i < n; i++) {
|
551
|
-
rrp->tried[i] = 0;
|
552
|
-
}
|
553
446
|
}
|
554
447
|
|
555
448
|
return NGX_OK;
|
@@ -595,56 +488,71 @@ failed:
|
|
595
488
|
}
|
596
489
|
|
597
490
|
|
598
|
-
static
|
599
|
-
ngx_http_upstream_get_peer(
|
491
|
+
static ngx_http_upstream_rr_peer_t *
|
492
|
+
ngx_http_upstream_get_peer(ngx_http_upstream_rr_peer_data_t *rrp)
|
600
493
|
{
|
601
|
-
|
602
|
-
|
494
|
+
time_t now;
|
495
|
+
uintptr_t m;
|
496
|
+
ngx_int_t total;
|
497
|
+
ngx_uint_t i, n;
|
498
|
+
ngx_http_upstream_rr_peer_t *peer, *best;
|
603
499
|
|
604
|
-
|
500
|
+
now = ngx_time();
|
605
501
|
|
606
|
-
|
502
|
+
best = NULL;
|
503
|
+
total = 0;
|
607
504
|
|
608
|
-
|
505
|
+
for (i = 0; i < rrp->peers->number; i++) {
|
609
506
|
|
610
|
-
|
611
|
-
|
612
|
-
}
|
507
|
+
n = i / (8 * sizeof(uintptr_t));
|
508
|
+
m = (uintptr_t) 1 << i % (8 * sizeof(uintptr_t));
|
613
509
|
|
614
|
-
|
615
|
-
|
616
|
-
|
617
|
-
|
618
|
-
i++;
|
510
|
+
if (rrp->tried[n] & m) {
|
511
|
+
continue;
|
512
|
+
}
|
619
513
|
|
620
|
-
|
621
|
-
continue;
|
622
|
-
}
|
514
|
+
peer = &rrp->peers->peer[i];
|
623
515
|
|
624
|
-
|
625
|
-
|
626
|
-
|
627
|
-
return n;
|
628
|
-
}
|
516
|
+
if (peer->down) {
|
517
|
+
continue;
|
518
|
+
}
|
629
519
|
|
630
|
-
|
631
|
-
|
520
|
+
if (peer->max_fails
|
521
|
+
&& peer->fails >= peer->max_fails
|
522
|
+
&& now - peer->checked <= peer->fail_timeout)
|
523
|
+
{
|
524
|
+
continue;
|
525
|
+
}
|
632
526
|
|
633
|
-
|
634
|
-
|
635
|
-
}
|
527
|
+
peer->current_weight += peer->effective_weight;
|
528
|
+
total += peer->effective_weight;
|
636
529
|
|
637
|
-
|
530
|
+
if (peer->effective_weight < peer->weight) {
|
531
|
+
peer->effective_weight++;
|
638
532
|
}
|
639
533
|
|
640
|
-
if (
|
641
|
-
|
534
|
+
if (best == NULL || peer->current_weight > best->current_weight) {
|
535
|
+
best = peer;
|
642
536
|
}
|
537
|
+
}
|
643
538
|
|
644
|
-
|
645
|
-
|
646
|
-
}
|
539
|
+
if (best == NULL) {
|
540
|
+
return NULL;
|
647
541
|
}
|
542
|
+
|
543
|
+
i = best - &rrp->peers->peer[0];
|
544
|
+
|
545
|
+
rrp->current = i;
|
546
|
+
|
547
|
+
n = i / (8 * sizeof(uintptr_t));
|
548
|
+
m = (uintptr_t) 1 << i % (8 * sizeof(uintptr_t));
|
549
|
+
|
550
|
+
rrp->tried[n] |= m;
|
551
|
+
|
552
|
+
best->current_weight -= total;
|
553
|
+
best->checked = now;
|
554
|
+
|
555
|
+
return best;
|
648
556
|
}
|
649
557
|
|
650
558
|
|
@@ -683,15 +591,15 @@ ngx_http_upstream_free_round_robin_peer(ngx_peer_connection_t *pc, void *data,
|
|
683
591
|
peer->checked = now;
|
684
592
|
|
685
593
|
if (peer->max_fails) {
|
686
|
-
peer->
|
594
|
+
peer->effective_weight -= peer->weight / peer->max_fails;
|
687
595
|
}
|
688
596
|
|
689
597
|
ngx_log_debug2(NGX_LOG_DEBUG_HTTP, pc->log, 0,
|
690
598
|
"free rr peer failed: %ui %i",
|
691
|
-
rrp->current, peer->
|
599
|
+
rrp->current, peer->effective_weight);
|
692
600
|
|
693
|
-
if (peer->
|
694
|
-
peer->
|
601
|
+
if (peer->effective_weight < 0) {
|
602
|
+
peer->effective_weight = 0;
|
695
603
|
}
|
696
604
|
|
697
605
|
/* ngx_unlock_mutex(rrp->peers->mutex); */
|
@@ -705,12 +613,6 @@ ngx_http_upstream_free_round_robin_peer(ngx_peer_connection_t *pc, void *data,
|
|
705
613
|
}
|
706
614
|
}
|
707
615
|
|
708
|
-
rrp->current++;
|
709
|
-
|
710
|
-
if (rrp->current >= rrp->peers->number) {
|
711
|
-
rrp->current = 0;
|
712
|
-
}
|
713
|
-
|
714
616
|
if (pc->tries) {
|
715
617
|
pc->tries--;
|
716
618
|
}
|