nginxtra 1.2.5.7 → 1.2.6.7
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/bin/nginxtra +1 -1
- data/bin/nginxtra_rails +1 -1
- data/lib/nginxtra/version.rb +1 -1
- data/vendor/nginx/CHANGES +11 -0
- data/vendor/nginx/CHANGES.ru +11 -0
- data/vendor/nginx/src/core/nginx.h +2 -2
- data/vendor/nginx/src/core/ngx_connection.c +2 -0
- data/vendor/nginx/src/core/ngx_cycle.c +3 -1
- data/vendor/nginx/src/core/ngx_shmtx.c +3 -3
- data/vendor/nginx/src/http/modules/ngx_http_dav_module.c +5 -0
- data/vendor/nginx/src/http/modules/perl/nginx.pm +1 -1
- data/vendor/nginx/src/http/ngx_http_header_filter_module.c +1 -1
- data/vendor/nginx/src/http/ngx_http_request_body.c +51 -42
- data/vendor/nginx/src/http/ngx_http_special_response.c +3 -2
- data/vendor/nginx/src/http/ngx_http_upstream.c +9 -2
- data/vendor/nginx/src/http/ngx_http_upstream_round_robin.c +4 -0
- data/vendor/nginx/src/http/ngx_http_variables.c +76 -5
- data/vendor/nginx/src/os/unix/ngx_files.c +4 -0
- data/vendor/nginx/src/os/unix/ngx_process_cycle.c +24 -17
- metadata +348 -342
data/bin/nginxtra
CHANGED
data/bin/nginxtra_rails
CHANGED
data/lib/nginxtra/version.rb
CHANGED
data/vendor/nginx/CHANGES
CHANGED
@@ -1,4 +1,15 @@
|
|
1
1
|
|
2
|
+
Changes with nginx 1.2.6 11 Dec 2012
|
3
|
+
|
4
|
+
*) Feature: the $request_time and $msec variables can now be used not
|
5
|
+
only in the "log_format" directive.
|
6
|
+
|
7
|
+
*) Bugfix: cache manager and cache loader processes might not be able to
|
8
|
+
start if more than 512 listen sockets were used.
|
9
|
+
|
10
|
+
*) Bugfix: in the ngx_http_dav_module.
|
11
|
+
|
12
|
+
|
2
13
|
Changes with nginx 1.2.5 13 Nov 2012
|
3
14
|
|
4
15
|
*) Feature: the "optional_no_ca" parameter of the "ssl_verify_client"
|
data/vendor/nginx/CHANGES.ru
CHANGED
@@ -1,4 +1,15 @@
|
|
1
1
|
|
2
|
+
Изменения в nginx 1.2.6 11.12.2012
|
3
|
+
|
4
|
+
*) Добавление: переменные $request_time и $msec теперь можно
|
5
|
+
использовать не только в директиве log_format.
|
6
|
+
|
7
|
+
*) Исправление: cache manager и cache loader могли не запускаться, если
|
8
|
+
использовалось более 512 listen-сокетов.
|
9
|
+
|
10
|
+
*) Исправление: в модуле ngx_http_dav_module.
|
11
|
+
|
12
|
+
|
2
13
|
Изменения в nginx 1.2.5 13.11.2012
|
3
14
|
|
4
15
|
*) Добавление: параметр optional_no_ca директивы ssl_verify_client.
|
@@ -447,7 +447,9 @@ ngx_init_cycle(ngx_cycle_t *old_cycle)
|
|
447
447
|
continue;
|
448
448
|
}
|
449
449
|
|
450
|
-
if (shm_zone[i].
|
450
|
+
if (shm_zone[i].tag == oshm_zone[n].tag
|
451
|
+
&& shm_zone[i].shm.size == oshm_zone[n].shm.size)
|
452
|
+
{
|
451
453
|
shm_zone[i].shm.addr = oshm_zone[n].shm.addr;
|
452
454
|
|
453
455
|
if (shm_zone[i].init(&shm_zone[i], oshm_zone[n].data)
|
@@ -117,11 +117,11 @@ ngx_shmtx_lock(ngx_shmtx_t *mtx)
|
|
117
117
|
"sem_wait() failed while waiting on shmtx");
|
118
118
|
break;
|
119
119
|
}
|
120
|
-
|
121
|
-
ngx_log_debug0(NGX_LOG_DEBUG_CORE, ngx_cycle->log, 0,
|
122
|
-
"shmtx awoke");
|
123
120
|
}
|
124
121
|
|
122
|
+
ngx_log_debug0(NGX_LOG_DEBUG_CORE, ngx_cycle->log, 0,
|
123
|
+
"shmtx awoke");
|
124
|
+
|
125
125
|
continue;
|
126
126
|
}
|
127
127
|
|
@@ -209,6 +209,11 @@ ngx_http_dav_put_handler(ngx_http_request_t *r)
|
|
209
209
|
ngx_ext_rename_file_t ext;
|
210
210
|
ngx_http_dav_loc_conf_t *dlcf;
|
211
211
|
|
212
|
+
if (r->request_body == NULL || r->request_body->temp_file == NULL) {
|
213
|
+
ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);
|
214
|
+
return;
|
215
|
+
}
|
216
|
+
|
212
217
|
ngx_http_map_uri_to_path(r, &path, &root, 0);
|
213
218
|
|
214
219
|
path.len--;
|
@@ -112,7 +112,7 @@ static ngx_str_t ngx_http_status_lines[] = {
|
|
112
112
|
#define NGX_HTTP_OFF_5XX (NGX_HTTP_LAST_4XX - 400 + NGX_HTTP_OFF_4XX)
|
113
113
|
|
114
114
|
ngx_string("500 Internal Server Error"),
|
115
|
-
ngx_string("501
|
115
|
+
ngx_string("501 Not Implemented"),
|
116
116
|
ngx_string("502 Bad Gateway"),
|
117
117
|
ngx_string("503 Service Temporarily Unavailable"),
|
118
118
|
ngx_string("504 Gateway Time-out"),
|
@@ -31,9 +31,9 @@ ngx_http_read_client_request_body(ngx_http_request_t *r,
|
|
31
31
|
{
|
32
32
|
size_t preread;
|
33
33
|
ssize_t size;
|
34
|
+
ngx_int_t rc;
|
34
35
|
ngx_buf_t *b;
|
35
36
|
ngx_chain_t *cl, **next;
|
36
|
-
ngx_temp_file_t *tf;
|
37
37
|
ngx_http_request_body_t *rb;
|
38
38
|
ngx_http_core_loc_conf_t *clcf;
|
39
39
|
|
@@ -45,12 +45,14 @@ ngx_http_read_client_request_body(ngx_http_request_t *r,
|
|
45
45
|
}
|
46
46
|
|
47
47
|
if (ngx_http_test_expect(r) != NGX_OK) {
|
48
|
-
|
48
|
+
rc = NGX_HTTP_INTERNAL_SERVER_ERROR;
|
49
|
+
goto done;
|
49
50
|
}
|
50
51
|
|
51
52
|
rb = ngx_pcalloc(r->pool, sizeof(ngx_http_request_body_t));
|
52
53
|
if (rb == NULL) {
|
53
|
-
|
54
|
+
rc = NGX_HTTP_INTERNAL_SERVER_ERROR;
|
55
|
+
goto done;
|
54
56
|
}
|
55
57
|
|
56
58
|
r->request_body = rb;
|
@@ -65,31 +67,9 @@ ngx_http_read_client_request_body(ngx_http_request_t *r,
|
|
65
67
|
if (r->headers_in.content_length_n == 0) {
|
66
68
|
|
67
69
|
if (r->request_body_in_file_only) {
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
}
|
72
|
-
|
73
|
-
tf->file.fd = NGX_INVALID_FILE;
|
74
|
-
tf->file.log = r->connection->log;
|
75
|
-
tf->path = clcf->client_body_temp_path;
|
76
|
-
tf->pool = r->pool;
|
77
|
-
tf->warn = "a client request body is buffered to a temporary file";
|
78
|
-
tf->log_level = r->request_body_file_log_level;
|
79
|
-
tf->persistent = r->request_body_in_persistent_file;
|
80
|
-
tf->clean = r->request_body_in_clean_file;
|
81
|
-
|
82
|
-
if (r->request_body_file_group_access) {
|
83
|
-
tf->access = 0660;
|
84
|
-
}
|
85
|
-
|
86
|
-
rb->temp_file = tf;
|
87
|
-
|
88
|
-
if (ngx_create_temp_file(&tf->file, tf->path, tf->pool,
|
89
|
-
tf->persistent, tf->clean, tf->access)
|
90
|
-
!= NGX_OK)
|
91
|
-
{
|
92
|
-
return NGX_HTTP_INTERNAL_SERVER_ERROR;
|
70
|
+
if (ngx_http_write_request_body(r, NULL) != NGX_OK) {
|
71
|
+
rc = NGX_HTTP_INTERNAL_SERVER_ERROR;
|
72
|
+
goto done;
|
93
73
|
}
|
94
74
|
}
|
95
75
|
|
@@ -119,7 +99,8 @@ ngx_http_read_client_request_body(ngx_http_request_t *r,
|
|
119
99
|
|
120
100
|
b = ngx_calloc_buf(r->pool);
|
121
101
|
if (b == NULL) {
|
122
|
-
|
102
|
+
rc = NGX_HTTP_INTERNAL_SERVER_ERROR;
|
103
|
+
goto done;
|
123
104
|
}
|
124
105
|
|
125
106
|
b->temporary = 1;
|
@@ -130,7 +111,8 @@ ngx_http_read_client_request_body(ngx_http_request_t *r,
|
|
130
111
|
|
131
112
|
rb->bufs = ngx_alloc_chain_link(r->pool);
|
132
113
|
if (rb->bufs == NULL) {
|
133
|
-
|
114
|
+
rc = NGX_HTTP_INTERNAL_SERVER_ERROR;
|
115
|
+
goto done;
|
134
116
|
}
|
135
117
|
|
136
118
|
rb->bufs->buf = b;
|
@@ -148,7 +130,8 @@ ngx_http_read_client_request_body(ngx_http_request_t *r,
|
|
148
130
|
|
149
131
|
if (r->request_body_in_file_only) {
|
150
132
|
if (ngx_http_write_request_body(r, rb->bufs) != NGX_OK) {
|
151
|
-
|
133
|
+
rc = NGX_HTTP_INTERNAL_SERVER_ERROR;
|
134
|
+
goto done;
|
152
135
|
}
|
153
136
|
}
|
154
137
|
|
@@ -175,7 +158,8 @@ ngx_http_read_client_request_body(ngx_http_request_t *r,
|
|
175
158
|
|
176
159
|
r->read_event_handler = ngx_http_read_client_request_body_handler;
|
177
160
|
|
178
|
-
|
161
|
+
rc = ngx_http_do_read_client_request_body(r);
|
162
|
+
goto done;
|
179
163
|
}
|
180
164
|
|
181
165
|
next = &rb->bufs->next;
|
@@ -205,12 +189,14 @@ ngx_http_read_client_request_body(ngx_http_request_t *r,
|
|
205
189
|
|
206
190
|
rb->buf = ngx_create_temp_buf(r->pool, size);
|
207
191
|
if (rb->buf == NULL) {
|
208
|
-
|
192
|
+
rc = NGX_HTTP_INTERNAL_SERVER_ERROR;
|
193
|
+
goto done;
|
209
194
|
}
|
210
195
|
|
211
196
|
cl = ngx_alloc_chain_link(r->pool);
|
212
197
|
if (cl == NULL) {
|
213
|
-
|
198
|
+
rc = NGX_HTTP_INTERNAL_SERVER_ERROR;
|
199
|
+
goto done;
|
214
200
|
}
|
215
201
|
|
216
202
|
cl->buf = rb->buf;
|
@@ -235,7 +221,15 @@ ngx_http_read_client_request_body(ngx_http_request_t *r,
|
|
235
221
|
|
236
222
|
r->read_event_handler = ngx_http_read_client_request_body_handler;
|
237
223
|
|
238
|
-
|
224
|
+
rc = ngx_http_do_read_client_request_body(r);
|
225
|
+
|
226
|
+
done:
|
227
|
+
|
228
|
+
if (rc >= NGX_HTTP_SPECIAL_RESPONSE) {
|
229
|
+
r->main->count--;
|
230
|
+
}
|
231
|
+
|
232
|
+
return rc;
|
239
233
|
}
|
240
234
|
|
241
235
|
|
@@ -419,6 +413,19 @@ ngx_http_write_request_body(ngx_http_request_t *r, ngx_chain_t *body)
|
|
419
413
|
}
|
420
414
|
|
421
415
|
rb->temp_file = tf;
|
416
|
+
|
417
|
+
if (body == NULL) {
|
418
|
+
/* empty body with r->request_body_in_file_only */
|
419
|
+
|
420
|
+
if (ngx_create_temp_file(&tf->file, tf->path, tf->pool,
|
421
|
+
tf->persistent, tf->clean, tf->access)
|
422
|
+
!= NGX_OK)
|
423
|
+
{
|
424
|
+
return NGX_ERROR;
|
425
|
+
}
|
426
|
+
|
427
|
+
return NGX_OK;
|
428
|
+
}
|
422
429
|
}
|
423
430
|
|
424
431
|
n = ngx_write_chain_to_temp_file(rb->temp_file, body);
|
@@ -475,19 +482,21 @@ ngx_http_discard_request_body(ngx_http_request_t *r)
|
|
475
482
|
}
|
476
483
|
}
|
477
484
|
|
485
|
+
if (ngx_http_read_discarded_request_body(r) == NGX_OK) {
|
486
|
+
r->lingering_close = 0;
|
487
|
+
return NGX_OK;
|
488
|
+
}
|
489
|
+
|
490
|
+
/* == NGX_AGAIN */
|
491
|
+
|
478
492
|
r->read_event_handler = ngx_http_discarded_request_body_handler;
|
479
493
|
|
480
494
|
if (ngx_handle_read_event(rev, 0) != NGX_OK) {
|
481
495
|
return NGX_HTTP_INTERNAL_SERVER_ERROR;
|
482
496
|
}
|
483
497
|
|
484
|
-
|
485
|
-
|
486
|
-
|
487
|
-
} else {
|
488
|
-
r->count++;
|
489
|
-
r->discard_body = 1;
|
490
|
-
}
|
498
|
+
r->count++;
|
499
|
+
r->discard_body = 1;
|
491
500
|
|
492
501
|
return NGX_OK;
|
493
502
|
}
|
@@ -260,9 +260,9 @@ static char ngx_http_error_500_page[] =
|
|
260
260
|
|
261
261
|
static char ngx_http_error_501_page[] =
|
262
262
|
"<html>" CRLF
|
263
|
-
"<head><title>501
|
263
|
+
"<head><title>501 Not Implemented</title></head>" CRLF
|
264
264
|
"<body bgcolor=\"white\">" CRLF
|
265
|
-
"<center><h1>501
|
265
|
+
"<center><h1>501 Not Implemented</h1></center>" CRLF
|
266
266
|
;
|
267
267
|
|
268
268
|
|
@@ -384,6 +384,7 @@ ngx_http_special_response_handler(ngx_http_request_t *r, ngx_int_t error)
|
|
384
384
|
case NGX_HTTPS_CERT_ERROR:
|
385
385
|
case NGX_HTTPS_NO_CERT:
|
386
386
|
case NGX_HTTP_INTERNAL_SERVER_ERROR:
|
387
|
+
case NGX_HTTP_NOT_IMPLEMENTED:
|
387
388
|
r->keepalive = 0;
|
388
389
|
}
|
389
390
|
}
|
@@ -1809,9 +1809,16 @@ ngx_http_upstream_test_connect(ngx_connection_t *c)
|
|
1809
1809
|
#if (NGX_HAVE_KQUEUE)
|
1810
1810
|
|
1811
1811
|
if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) {
|
1812
|
-
if (c->write->pending_eof) {
|
1812
|
+
if (c->write->pending_eof || c->read->pending_eof) {
|
1813
|
+
if (c->write->pending_eof) {
|
1814
|
+
err = c->write->kq_errno;
|
1815
|
+
|
1816
|
+
} else {
|
1817
|
+
err = c->read->kq_errno;
|
1818
|
+
}
|
1819
|
+
|
1813
1820
|
c->log->action = "connecting to upstream";
|
1814
|
-
(void) ngx_connection_error(c,
|
1821
|
+
(void) ngx_connection_error(c, err,
|
1815
1822
|
"kevent() reported that connect() failed");
|
1816
1823
|
return NGX_ERROR;
|
1817
1824
|
}
|
@@ -79,6 +79,8 @@ static ngx_int_t ngx_http_variable_request_body(ngx_http_request_t *r,
|
|
79
79
|
ngx_http_variable_value_t *v, uintptr_t data);
|
80
80
|
static ngx_int_t ngx_http_variable_request_body_file(ngx_http_request_t *r,
|
81
81
|
ngx_http_variable_value_t *v, uintptr_t data);
|
82
|
+
static ngx_int_t ngx_http_variable_request_time(ngx_http_request_t *r,
|
83
|
+
ngx_http_variable_value_t *v, uintptr_t data);
|
82
84
|
static ngx_int_t ngx_http_variable_status(ngx_http_request_t *r,
|
83
85
|
ngx_http_variable_value_t *v, uintptr_t data);
|
84
86
|
|
@@ -108,6 +110,8 @@ static ngx_int_t ngx_http_variable_hostname(ngx_http_request_t *r,
|
|
108
110
|
ngx_http_variable_value_t *v, uintptr_t data);
|
109
111
|
static ngx_int_t ngx_http_variable_pid(ngx_http_request_t *r,
|
110
112
|
ngx_http_variable_value_t *v, uintptr_t data);
|
113
|
+
static ngx_int_t ngx_http_variable_msec(ngx_http_request_t *r,
|
114
|
+
ngx_http_variable_value_t *v, uintptr_t data);
|
111
115
|
|
112
116
|
/*
|
113
117
|
* TODO:
|
@@ -237,6 +241,9 @@ static ngx_http_variable_t ngx_http_core_variables[] = {
|
|
237
241
|
ngx_http_variable_request_body_file,
|
238
242
|
0, 0, 0 },
|
239
243
|
|
244
|
+
{ ngx_string("request_time"), NULL, ngx_http_variable_request_time,
|
245
|
+
0, NGX_HTTP_VAR_NOCACHEABLE, 0 },
|
246
|
+
|
240
247
|
{ ngx_string("status"), NULL,
|
241
248
|
ngx_http_variable_status, 0,
|
242
249
|
NGX_HTTP_VAR_NOCACHEABLE, 0 },
|
@@ -285,6 +292,9 @@ static ngx_http_variable_t ngx_http_core_variables[] = {
|
|
285
292
|
{ ngx_string("pid"), NULL, ngx_http_variable_pid,
|
286
293
|
0, 0, 0 },
|
287
294
|
|
295
|
+
{ ngx_string("msec"), NULL, ngx_http_variable_msec,
|
296
|
+
0, NGX_HTTP_VAR_NOCACHEABLE, 0 },
|
297
|
+
|
288
298
|
#if (NGX_HAVE_TCP_INFO)
|
289
299
|
{ ngx_string("tcpinfo_rtt"), NULL, ngx_http_variable_tcpinfo,
|
290
300
|
0, NGX_HTTP_VAR_NOCACHEABLE, 0 },
|
@@ -1757,7 +1767,7 @@ ngx_http_variable_request_body(ngx_http_request_t *r,
|
|
1757
1767
|
{
|
1758
1768
|
u_char *p;
|
1759
1769
|
size_t len;
|
1760
|
-
ngx_buf_t *buf
|
1770
|
+
ngx_buf_t *buf;
|
1761
1771
|
ngx_chain_t *cl;
|
1762
1772
|
|
1763
1773
|
if (r->request_body == NULL
|
@@ -1782,8 +1792,13 @@ ngx_http_variable_request_body(ngx_http_request_t *r,
|
|
1782
1792
|
return NGX_OK;
|
1783
1793
|
}
|
1784
1794
|
|
1785
|
-
|
1786
|
-
|
1795
|
+
len = buf->last - buf->pos;
|
1796
|
+
cl = cl->next;
|
1797
|
+
|
1798
|
+
for ( /* void */ ; cl; cl = cl->next) {
|
1799
|
+
buf = cl->buf;
|
1800
|
+
len += buf->last - buf->pos;
|
1801
|
+
}
|
1787
1802
|
|
1788
1803
|
p = ngx_pnalloc(r->pool, len);
|
1789
1804
|
if (p == NULL) {
|
@@ -1791,9 +1806,12 @@ ngx_http_variable_request_body(ngx_http_request_t *r,
|
|
1791
1806
|
}
|
1792
1807
|
|
1793
1808
|
v->data = p;
|
1809
|
+
cl = r->request_body->bufs;
|
1794
1810
|
|
1795
|
-
|
1796
|
-
|
1811
|
+
for ( /* void */ ; cl; cl = cl->next) {
|
1812
|
+
buf = cl->buf;
|
1813
|
+
p = ngx_cpymem(p, buf->pos, buf->last - buf->pos);
|
1814
|
+
}
|
1797
1815
|
|
1798
1816
|
v->len = len;
|
1799
1817
|
v->valid = 1;
|
@@ -1824,6 +1842,35 @@ ngx_http_variable_request_body_file(ngx_http_request_t *r,
|
|
1824
1842
|
}
|
1825
1843
|
|
1826
1844
|
|
1845
|
+
static ngx_int_t
|
1846
|
+
ngx_http_variable_request_time(ngx_http_request_t *r,
|
1847
|
+
ngx_http_variable_value_t *v, uintptr_t data)
|
1848
|
+
{
|
1849
|
+
u_char *p;
|
1850
|
+
ngx_time_t *tp;
|
1851
|
+
ngx_msec_int_t ms;
|
1852
|
+
|
1853
|
+
p = ngx_pnalloc(r->pool, NGX_TIME_T_LEN + 4);
|
1854
|
+
if (p == NULL) {
|
1855
|
+
return NGX_ERROR;
|
1856
|
+
}
|
1857
|
+
|
1858
|
+
tp = ngx_timeofday();
|
1859
|
+
|
1860
|
+
ms = (ngx_msec_int_t)
|
1861
|
+
((tp->sec - r->start_sec) * 1000 + (tp->msec - r->start_msec));
|
1862
|
+
ms = ngx_max(ms, 0);
|
1863
|
+
|
1864
|
+
v->len = ngx_sprintf(p, "%T.%03M", ms / 1000, ms % 1000) - p;
|
1865
|
+
v->valid = 1;
|
1866
|
+
v->no_cacheable = 0;
|
1867
|
+
v->not_found = 0;
|
1868
|
+
v->data = p;
|
1869
|
+
|
1870
|
+
return NGX_OK;
|
1871
|
+
}
|
1872
|
+
|
1873
|
+
|
1827
1874
|
static ngx_int_t
|
1828
1875
|
ngx_http_variable_connection(ngx_http_request_t *r,
|
1829
1876
|
ngx_http_variable_value_t *v, uintptr_t data)
|
@@ -1915,6 +1962,30 @@ ngx_http_variable_pid(ngx_http_request_t *r,
|
|
1915
1962
|
}
|
1916
1963
|
|
1917
1964
|
|
1965
|
+
static ngx_int_t
|
1966
|
+
ngx_http_variable_msec(ngx_http_request_t *r,
|
1967
|
+
ngx_http_variable_value_t *v, uintptr_t data)
|
1968
|
+
{
|
1969
|
+
u_char *p;
|
1970
|
+
ngx_time_t *tp;
|
1971
|
+
|
1972
|
+
p = ngx_pnalloc(r->pool, NGX_TIME_T_LEN + 4);
|
1973
|
+
if (p == NULL) {
|
1974
|
+
return NGX_ERROR;
|
1975
|
+
}
|
1976
|
+
|
1977
|
+
tp = ngx_timeofday();
|
1978
|
+
|
1979
|
+
v->len = ngx_sprintf(p, "%T.%03M", tp->sec, tp->msec) - p;
|
1980
|
+
v->valid = 1;
|
1981
|
+
v->no_cacheable = 0;
|
1982
|
+
v->not_found = 0;
|
1983
|
+
v->data = p;
|
1984
|
+
|
1985
|
+
return NGX_OK;
|
1986
|
+
}
|
1987
|
+
|
1988
|
+
|
1918
1989
|
void *
|
1919
1990
|
ngx_http_map_find(ngx_http_request_t *r, ngx_http_map_t *map, ngx_str_t *match)
|
1920
1991
|
{
|
@@ -241,8 +241,12 @@ ngx_write_chain_to_file(ngx_file_t *file, ngx_chain_t *cl, off_t offset,
|
|
241
241
|
return NGX_ERROR;
|
242
242
|
}
|
243
243
|
|
244
|
+
ngx_log_debug2(NGX_LOG_DEBUG_CORE, file->log, 0,
|
245
|
+
"writev: %d, %z", file->fd, n);
|
246
|
+
|
244
247
|
file->sys_offset += n;
|
245
248
|
file->offset += n;
|
249
|
+
offset += n;
|
246
250
|
total += n;
|
247
251
|
|
248
252
|
} while (cl);
|
@@ -20,7 +20,7 @@ static void ngx_signal_worker_processes(ngx_cycle_t *cycle, int signo);
|
|
20
20
|
static ngx_uint_t ngx_reap_children(ngx_cycle_t *cycle);
|
21
21
|
static void ngx_master_process_exit(ngx_cycle_t *cycle);
|
22
22
|
static void ngx_worker_process_cycle(ngx_cycle_t *cycle, void *data);
|
23
|
-
static void ngx_worker_process_init(ngx_cycle_t *cycle,
|
23
|
+
static void ngx_worker_process_init(ngx_cycle_t *cycle, ngx_int_t worker);
|
24
24
|
static void ngx_worker_process_exit(ngx_cycle_t *cycle);
|
25
25
|
static void ngx_channel_handler(ngx_event_t *ev);
|
26
26
|
#if (NGX_THREADS)
|
@@ -62,7 +62,6 @@ ngx_int_t ngx_threads_n;
|
|
62
62
|
#endif
|
63
63
|
|
64
64
|
|
65
|
-
uint64_t cpu_affinity;
|
66
65
|
static u_char master_process[] = "master process";
|
67
66
|
|
68
67
|
|
@@ -360,10 +359,8 @@ ngx_start_worker_processes(ngx_cycle_t *cycle, ngx_int_t n, ngx_int_t type)
|
|
360
359
|
|
361
360
|
for (i = 0; i < n; i++) {
|
362
361
|
|
363
|
-
|
364
|
-
|
365
|
-
ngx_spawn_process(cycle, ngx_worker_process_cycle, NULL,
|
366
|
-
"worker process", type);
|
362
|
+
ngx_spawn_process(cycle, ngx_worker_process_cycle,
|
363
|
+
(void *) (intptr_t) i, "worker process", type);
|
367
364
|
|
368
365
|
ch.pid = ngx_processes[ngx_process_slot].pid;
|
369
366
|
ch.slot = ngx_process_slot;
|
@@ -371,8 +368,6 @@ ngx_start_worker_processes(ngx_cycle_t *cycle, ngx_int_t n, ngx_int_t type)
|
|
371
368
|
|
372
369
|
ngx_pass_open_channel(cycle, &ch);
|
373
370
|
}
|
374
|
-
|
375
|
-
cpu_affinity = 0;
|
376
371
|
}
|
377
372
|
|
378
373
|
|
@@ -726,12 +721,14 @@ ngx_master_process_exit(ngx_cycle_t *cycle)
|
|
726
721
|
static void
|
727
722
|
ngx_worker_process_cycle(ngx_cycle_t *cycle, void *data)
|
728
723
|
{
|
724
|
+
ngx_int_t worker = (intptr_t) data;
|
725
|
+
|
729
726
|
ngx_uint_t i;
|
730
727
|
ngx_connection_t *c;
|
731
728
|
|
732
729
|
ngx_process = NGX_PROCESS_WORKER;
|
733
730
|
|
734
|
-
ngx_worker_process_init(cycle,
|
731
|
+
ngx_worker_process_init(cycle, worker);
|
735
732
|
|
736
733
|
ngx_setproctitle("worker process");
|
737
734
|
|
@@ -837,9 +834,10 @@ ngx_worker_process_cycle(ngx_cycle_t *cycle, void *data)
|
|
837
834
|
|
838
835
|
|
839
836
|
static void
|
840
|
-
ngx_worker_process_init(ngx_cycle_t *cycle,
|
837
|
+
ngx_worker_process_init(ngx_cycle_t *cycle, ngx_int_t worker)
|
841
838
|
{
|
842
839
|
sigset_t set;
|
840
|
+
uint64_t cpu_affinity;
|
843
841
|
ngx_int_t n;
|
844
842
|
ngx_uint_t i;
|
845
843
|
struct rlimit rlmt;
|
@@ -853,7 +851,7 @@ ngx_worker_process_init(ngx_cycle_t *cycle, ngx_uint_t priority)
|
|
853
851
|
|
854
852
|
ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_core_module);
|
855
853
|
|
856
|
-
if (
|
854
|
+
if (worker >= 0 && ccf->priority != 0) {
|
857
855
|
if (setpriority(PRIO_PROCESS, 0, ccf->priority) == -1) {
|
858
856
|
ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
|
859
857
|
"setpriority(%d) failed", ccf->priority);
|
@@ -917,8 +915,12 @@ ngx_worker_process_init(ngx_cycle_t *cycle, ngx_uint_t priority)
|
|
917
915
|
}
|
918
916
|
}
|
919
917
|
|
920
|
-
if (
|
921
|
-
|
918
|
+
if (worker >= 0) {
|
919
|
+
cpu_affinity = ngx_get_cpu_affinity(worker);
|
920
|
+
|
921
|
+
if (cpu_affinity) {
|
922
|
+
ngx_setaffinity(cpu_affinity, cycle->log);
|
923
|
+
}
|
922
924
|
}
|
923
925
|
|
924
926
|
#if (NGX_HAVE_PR_SET_DUMPABLE)
|
@@ -1294,14 +1296,19 @@ ngx_cache_manager_process_cycle(ngx_cycle_t *cycle, void *data)
|
|
1294
1296
|
void *ident[4];
|
1295
1297
|
ngx_event_t ev;
|
1296
1298
|
|
1297
|
-
|
1298
|
-
|
1299
|
+
/*
|
1300
|
+
* Set correct process type since closing listening Unix domain socket
|
1301
|
+
* in a master process also removes the Unix domain socket file.
|
1302
|
+
*/
|
1299
1303
|
ngx_process = NGX_PROCESS_HELPER;
|
1300
1304
|
|
1301
|
-
ngx_worker_process_init(cycle, 0);
|
1302
|
-
|
1303
1305
|
ngx_close_listening_sockets(cycle);
|
1304
1306
|
|
1307
|
+
/* Set a moderate number of connections for a helper process. */
|
1308
|
+
cycle->connection_n = 512;
|
1309
|
+
|
1310
|
+
ngx_worker_process_init(cycle, -1);
|
1311
|
+
|
1305
1312
|
ngx_memzero(&ev, sizeof(ngx_event_t));
|
1306
1313
|
ev.handler = ctx->handler;
|
1307
1314
|
ev.data = ident;
|