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.
Files changed (37) hide show
  1. data/VERSION +1 -1
  2. data/bin/nginxtra +1 -1
  3. data/lib/nginxtra.rb +2 -0
  4. data/lib/nginxtra/action.rb +1 -1
  5. data/lib/nginxtra/actions/convert.rb +67 -0
  6. data/lib/nginxtra/actions/install.rb +3 -0
  7. data/lib/nginxtra/cli.rb +20 -0
  8. data/lib/nginxtra/config_converter.rb +324 -0
  9. data/lib/nginxtra/error.rb +3 -0
  10. data/src/nginx/CHANGES +45 -0
  11. data/src/nginx/CHANGES.ru +46 -0
  12. data/src/nginx/src/core/nginx.h +2 -2
  13. data/src/nginx/src/core/ngx_resolver.c +14 -2
  14. data/src/nginx/src/event/ngx_event.c +18 -21
  15. data/src/nginx/src/event/ngx_event.h +0 -6
  16. data/src/nginx/src/event/ngx_event_accept.c +90 -13
  17. data/src/nginx/src/event/ngx_event_openssl.c +1 -0
  18. data/src/nginx/src/http/modules/ngx_http_fastcgi_module.c +26 -4
  19. data/src/nginx/src/http/modules/ngx_http_flv_module.c +1 -1
  20. data/src/nginx/src/http/modules/ngx_http_geo_module.c +62 -74
  21. data/src/nginx/src/http/modules/ngx_http_geoip_module.c +130 -30
  22. data/src/nginx/src/http/modules/ngx_http_gzip_static_module.c +1 -1
  23. data/src/nginx/src/http/modules/ngx_http_mp4_module.c +1 -1
  24. data/src/nginx/src/http/modules/ngx_http_realip_module.c +45 -93
  25. data/src/nginx/src/http/modules/ngx_http_scgi_module.c +2 -0
  26. data/src/nginx/src/http/modules/ngx_http_stub_status_module.c +1 -1
  27. data/src/nginx/src/http/modules/ngx_http_uwsgi_module.c +2 -0
  28. data/src/nginx/src/http/modules/perl/nginx.pm +1 -1
  29. data/src/nginx/src/http/ngx_http_core_module.c +104 -0
  30. data/src/nginx/src/http/ngx_http_core_module.h +3 -0
  31. data/src/nginx/src/http/ngx_http_parse.c +20 -0
  32. data/src/nginx/src/http/ngx_http_request.c +26 -15
  33. data/src/nginx/src/http/ngx_http_script.c +0 -1
  34. data/src/nginx/src/http/ngx_http_upstream_round_robin.c +72 -170
  35. data/src/nginx/src/http/ngx_http_upstream_round_robin.h +1 -0
  36. data/src/nginx/src/os/unix/ngx_errno.h +2 -0
  37. 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) {
@@ -1043,7 +1043,6 @@ ngx_http_script_regex_start_code(ngx_http_script_engine_t *e)
1043
1043
  }
1044
1044
 
1045
1045
  e->buf.len = len;
1046
- e->is_args = le.is_args;
1047
1046
  }
1048
1047
 
1049
1048
  if (code->add_args && r->args.len) {
@@ -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 ngx_uint_t
16
- ngx_http_upstream_get_peer(ngx_http_upstream_rr_peers_t *peers);
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].down ? 0 : server[i].weight;
84
- peers->peer[n].current_weight = peers->peer[n].weight;
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].current_weight = server[i].weight;
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].current_weight = 1;
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].current_weight = 1;
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].current_weight = 1;
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
- if (pc->tries == rrp->peers->number) {
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
- if (now - peer->checked > peer->fail_timeout) {
455
- peer->checked = now;
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
- rrp->tried[n] |= m;
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 ngx_uint_t
599
- ngx_http_upstream_get_peer(ngx_http_upstream_rr_peers_t *peers)
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
- ngx_uint_t i, n, reset = 0;
602
- ngx_http_upstream_rr_peer_t *peer;
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
- peer = &peers->peer[0];
500
+ now = ngx_time();
605
501
 
606
- for ( ;; ) {
502
+ best = NULL;
503
+ total = 0;
607
504
 
608
- for (i = 0; i < peers->number; i++) {
505
+ for (i = 0; i < rrp->peers->number; i++) {
609
506
 
610
- if (peer[i].current_weight <= 0) {
611
- continue;
612
- }
507
+ n = i / (8 * sizeof(uintptr_t));
508
+ m = (uintptr_t) 1 << i % (8 * sizeof(uintptr_t));
613
509
 
614
- n = i;
615
-
616
- while (i < peers->number - 1) {
617
-
618
- i++;
510
+ if (rrp->tried[n] & m) {
511
+ continue;
512
+ }
619
513
 
620
- if (peer[i].current_weight <= 0) {
621
- continue;
622
- }
514
+ peer = &rrp->peers->peer[i];
623
515
 
624
- if (peer[n].current_weight * 1000 / peer[i].current_weight
625
- > peer[n].weight * 1000 / peer[i].weight)
626
- {
627
- return n;
628
- }
516
+ if (peer->down) {
517
+ continue;
518
+ }
629
519
 
630
- n = i;
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
- if (peer[i].current_weight > 0) {
634
- n = i;
635
- }
527
+ peer->current_weight += peer->effective_weight;
528
+ total += peer->effective_weight;
636
529
 
637
- return n;
530
+ if (peer->effective_weight < peer->weight) {
531
+ peer->effective_weight++;
638
532
  }
639
533
 
640
- if (reset++) {
641
- return 0;
534
+ if (best == NULL || peer->current_weight > best->current_weight) {
535
+ best = peer;
642
536
  }
537
+ }
643
538
 
644
- for (i = 0; i < peers->number; i++) {
645
- peer[i].current_weight = peer[i].weight;
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->current_weight -= peer->weight / peer->max_fails;
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->current_weight);
599
+ rrp->current, peer->effective_weight);
692
600
 
693
- if (peer->current_weight < 0) {
694
- peer->current_weight = 0;
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
  }