Slice Module behavior over SSL

2019-05-08 Thread Carey Gister
Hi,

I noticed that if I configure a server to use the slice module it will happily 
read slices of the appropriate size as fast as the upstream server can deliver 
them.

However, if I configure the same server to run over SSL it requests the slices 
at a rate consonant with the speed with which the my client application is 
consuming the data -- in my case about 4MB per second.

This behavior can be easily confirmed from my server access logs and I can 
provide a sample configuration file.

Can anyone explain this behavior?

Carey Gister


___
nginx-devel mailing list
nginx-devel@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-devel

Re: [nginx] slice module issue

2017-06-20 Thread 洪志道
Wow, thank you for your patience.

Perfect!!!

Btw, The ctx of slice module is really a good skill.

On Wed, Jun 21, 2017 at 2:43 AM, Roman Arutyunyan <a...@nginx.com> wrote:

> Hi,
>
> Here's a simple configuration for your case.
>
> map $http_range $proxy_range {
> volatile;
> ~,   $http_range;
> default  $slice_range;
> }
>
> server {
> listen 8000;
> location / {
> slice 100;
> proxy_set_header Range $proxy_range;
> proxy_pass http://127.0.0.1:9000;
> }
> }
>
>
> Note that at request level the slice module is enabled by evaluating the
> $slice_range variable.
>
>
> On Wed, Jun 21, 2017 at 12:45:07AM +0800, 洪志道 wrote:
> > Well, it's a good idea, but it's not satisfied yet.
> >
> > Now we assume users want to ignore the slice feature
> > when the multi-range request is coming.
> >
> > How about let slice directive support if scope?
> >
> > Such as the following.
> >
> > map $http_range $need_slice {
> >  ...
> > }
> >
> > map $slice_range $x_slice_range {
> >  ...
> > }
> >
> > server {
> >if ($need_slice) {
> >slice 100;
> >}
> >
> >proxy_set_header Range $x_slice_range;
> > }
> >
> > --- a/src/http/modules/ngx_http_slice_filter_module.c Mon May 29
> 23:33:38
> > 2017 +0300
> > +++ b/src/http/modules/ngx_http_slice_filter_module.c Tue Jun 20
> 12:37:34
> > 2017 -0400
> > @@ -51,7 +51,8 @@
> >  static ngx_command_t  ngx_http_slice_filter_commands[] = {
> >
> >  { ngx_string("slice"),
> > -
> >  NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
> > +
> >  NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|
> NGX_HTTP_LIF_CONF
> > + NGX_CONF_TAKE1,
> >ngx_conf_set_size_slot,
> >NGX_HTTP_LOC_CONF_OFFSET,
> >offsetof(ngx_http_slice_loc_conf_t, size),
> >
> > On Wed, Jun 21, 2017 at 12:31 AM, Roman Arutyunyan <a...@nginx.com>
> wrote:
> >
> > > You can pass a mapped variable to "proxy_set_header Range" which falls
> back
> > > to whatever you want for multi-range requests.
> > >
> > > On Tue, Jun 20, 2017 at 03:47:02PM +, 洪志道 wrote:
> > > > If we wan't to slice in the case of multi-page, how to achieve it?
> > > >
> > > > 洪志道 <hongzhi...@gmail.com>于2017年6月20日 周二23:21写道:
> > > >
> > > > > You said the module doesn't support multi-range, it means nothing
> to
> > > > > support slice feature through $slice_range.
> > > > > Anyway we can avoid it by access handle, but it's still
> unconvinient.
> > > > >
> > > > > Roman Arutyunyan <a...@nginx.com>于2017年6月20日 周二21:34写道:
> > > > >
> > > > >> That would disable slicing at all.
> > > > >>
> > > > >> On Tue, Jun 20, 2017 at 12:42:30PM +, 洪志道 wrote:
> > > > >> > Do you think it's better to set $slice_range not found as if
> > > multi-range
> > > > >> > request?
> > > > >> >
> > > > >> > Roman Arutyunyan <a...@nginx.com>于2017年6月20日 周二20:09写道:
> > > > >> >
> > > > >> > > Hi,
> > > > >> > >
> > > > >> > > On Tue, Jun 20, 2017 at 02:25:14AM +0800, 洪志道 wrote:
> > > > >> > > > Hi!
> > > > >> > > >
> > > > >> > > > Have a look at the following example first.
> > > > >> > > >
> > > > >> > > > server {
> > > > >> > > >   listen  80;
> > > > >> > > >
> > > > >> > > >   location / {
> > > > >> > > >   slice 10;
> > > > >> > > >   proxy_set_header  Range $slice_range;
> > > > >> > > >   proxy_pass http://127.0.0.1:81;
> > > > >> > > >   }
> > > > >> > > > }
> > > > >> > > >
> > > > >> > > >
> > > > >> > > > server {
> > > > >> > > >   listen  81;
> > > > >> > > >root  html;
> > > > >> > >

Re: [nginx] slice module issue

2017-06-20 Thread Roman Arutyunyan
Hi,

Here's a simple configuration for your case.

map $http_range $proxy_range {
volatile;
~,   $http_range;
default  $slice_range;
}

server {
listen 8000;
location / {
slice 100;
proxy_set_header Range $proxy_range;
proxy_pass http://127.0.0.1:9000;
}
}


Note that at request level the slice module is enabled by evaluating the
$slice_range variable.


On Wed, Jun 21, 2017 at 12:45:07AM +0800, 洪志道 wrote:
> Well, it's a good idea, but it's not satisfied yet.
> 
> Now we assume users want to ignore the slice feature
> when the multi-range request is coming.
> 
> How about let slice directive support if scope?
> 
> Such as the following.
> 
> map $http_range $need_slice {
>  ...
> }
> 
> map $slice_range $x_slice_range {
>  ...
> }
> 
> server {
>if ($need_slice) {
>slice 100;
>}
> 
>proxy_set_header Range $x_slice_range;
> }
> 
> --- a/src/http/modules/ngx_http_slice_filter_module.c Mon May 29 23:33:38
> 2017 +0300
> +++ b/src/http/modules/ngx_http_slice_filter_module.c Tue Jun 20 12:37:34
> 2017 -0400
> @@ -51,7 +51,8 @@
>  static ngx_command_t  ngx_http_slice_filter_commands[] = {
> 
>  { ngx_string("slice"),
> -
>  NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
> +
>  NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF
> + NGX_CONF_TAKE1,
>ngx_conf_set_size_slot,
>NGX_HTTP_LOC_CONF_OFFSET,
>offsetof(ngx_http_slice_loc_conf_t, size),
> 
> On Wed, Jun 21, 2017 at 12:31 AM, Roman Arutyunyan <a...@nginx.com> wrote:
> 
> > You can pass a mapped variable to "proxy_set_header Range" which falls back
> > to whatever you want for multi-range requests.
> >
> > On Tue, Jun 20, 2017 at 03:47:02PM +, 洪志道 wrote:
> > > If we wan't to slice in the case of multi-page, how to achieve it?
> > >
> > > 洪志道 <hongzhi...@gmail.com>于2017年6月20日 周二23:21写道:
> > >
> > > > You said the module doesn't support multi-range, it means nothing to
> > > > support slice feature through $slice_range.
> > > > Anyway we can avoid it by access handle, but it's still unconvinient.
> > > >
> > > > Roman Arutyunyan <a...@nginx.com>于2017年6月20日 周二21:34写道:
> > > >
> > > >> That would disable slicing at all.
> > > >>
> > > >> On Tue, Jun 20, 2017 at 12:42:30PM +, 洪志道 wrote:
> > > >> > Do you think it's better to set $slice_range not found as if
> > multi-range
> > > >> > request?
> > > >> >
> > > >> > Roman Arutyunyan <a...@nginx.com>于2017年6月20日 周二20:09写道:
> > > >> >
> > > >> > > Hi,
> > > >> > >
> > > >> > > On Tue, Jun 20, 2017 at 02:25:14AM +0800, 洪志道 wrote:
> > > >> > > > Hi!
> > > >> > > >
> > > >> > > > Have a look at the following example first.
> > > >> > > >
> > > >> > > > server {
> > > >> > > >   listen  80;
> > > >> > > >
> > > >> > > >   location / {
> > > >> > > >   slice 10;
> > > >> > > >   proxy_set_header  Range $slice_range;
> > > >> > > >   proxy_pass http://127.0.0.1:81;
> > > >> > > >   }
> > > >> > > > }
> > > >> > > >
> > > >> > > >
> > > >> > > > server {
> > > >> > > >   listen  81;
> > > >> > > >root  html;
> > > >> > > > }
> > > >> > > >
> > > >> > > > Then we start a request with curl.
> > > >> > > > > curl http://my.test.com/ -x 127.1:80 -H "range: bytes=1-50,
> > 2-51"
> > > >> > > >
> > > >> > > > We get a response of the whole file that differs from
> > expectation
> > > >> (1-50,
> > > >> > > > 2-51).
> > > >> > > >
> > > >> > > > It seems that slice module doesn't support multi-range
> > (separated by
> > > >> > > > commas),
> > > >> > >
> > > >> > > Yes,

Re: [nginx] slice module issue

2017-06-20 Thread 洪志道
I hope slice module can satisfy customer requirements.

Now the key point is users want to control the behavior of slice.
And this is common.

Here's the patch, take a look please!

diff -r 5e05118678af src/http/modules/ngx_http_slice_filter_module.c
--- a/src/http/modules/ngx_http_slice_filter_module.c Mon May 29 23:33:38
2017 +0300
+++ b/src/http/modules/ngx_http_slice_filter_module.c Tue Jun 20 13:17:17
2017 -0400
@@ -12,6 +12,7 @@

 typedef struct {
 size_t   size;
+ngx_flag_t   always;
 } ngx_http_slice_loc_conf_t;


@@ -57,6 +58,13 @@
   offsetof(ngx_http_slice_loc_conf_t, size),
   NULL },

+{ ngx_string("slice_always"),
+  NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
+  ngx_conf_set_flag_slot,
+  NGX_HTTP_LOC_CONF_OFFSET,
+  offsetof(ngx_http_slice_loc_conf_t, always),
+  NULL },
+
   ngx_null_command
 };

@@ -389,6 +397,7 @@
 ngx_http_variable_value_t *v, uintptr_t data)
 {
 u_char *p;
+off_t  start;
 ngx_http_slice_ctx_t   *ctx;
 ngx_http_slice_loc_conf_t  *slcf;

@@ -407,6 +416,12 @@
 return NGX_OK;
 }

+start = ngx_http_slice_get_start(r);
+if (start == -1 && slcf->always == 0) {
+v->not_found = 1;
+return NGX_OK;
+}
+
 ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_slice_ctx_t));
 if (ctx == NULL) {
 return NGX_ERROR;
@@ -419,7 +434,7 @@
 return NGX_ERROR;
 }

-ctx->start = slcf->size * (ngx_http_slice_get_start(r) /
slcf->size);
+ctx->start = slcf->size * (start / slcf->size);

 ctx->range.data = p;
 ctx->range.len = ngx_sprintf(p, "bytes=%O-%O", ctx->start,
@@ -445,7 +460,7 @@
 ngx_table_elt_t  *h;

 if (r->headers_in.if_range) {
-return 0;
+return -1;
 }

 h = r->headers_in.range;
@@ -454,13 +469,13 @@
 || h->value.len < 7
 || ngx_strncasecmp(h->value.data, (u_char *) "bytes=", 6) != 0)
 {
-return 0;
+return -1;
 }

 p = h->value.data + 6;

 if (ngx_strchr(p, ',')) {
-return 0;
+return -1;
 }

 while (*p == ' ') { p++; }
@@ -476,7 +491,7 @@

 while (*p >= '0' && *p <= '9') {
 if (start >= cutoff && (start > cutoff || *p - '0' > cutlim)) {
-return 0;
+return -1;
 }

 start = start * 10 + *p++ - '0';
@@ -497,6 +512,7 @@
 }

 slcf->size = NGX_CONF_UNSET_SIZE;
+slcf->always = NGX_CONF_UNSET;

 return slcf;
 }
@@ -509,6 +525,7 @@
 ngx_http_slice_loc_conf_t *conf = child;

 ngx_conf_merge_size_value(conf->size, prev->size, 0);
+ngx_conf_merge_value(conf->always, prev->always, 1);

 return NGX_CONF_OK;
 }
___
nginx-devel mailing list
nginx-devel@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-devel

Re: [nginx] slice module issue

2017-06-20 Thread 洪志道
Well, it's a good idea, but it's not satisfied yet.

Now we assume users want to ignore the slice feature
when the multi-range request is coming.

How about let slice directive support if scope?

Such as the following.

map $http_range $need_slice {
 ...
}

map $slice_range $x_slice_range {
 ...
}

server {
   if ($need_slice) {
   slice 100;
   }

   proxy_set_header Range $x_slice_range;
}

--- a/src/http/modules/ngx_http_slice_filter_module.c Mon May 29 23:33:38
2017 +0300
+++ b/src/http/modules/ngx_http_slice_filter_module.c Tue Jun 20 12:37:34
2017 -0400
@@ -51,7 +51,8 @@
 static ngx_command_t  ngx_http_slice_filter_commands[] = {

 { ngx_string("slice"),
-
 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
+
 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF
+ NGX_CONF_TAKE1,
   ngx_conf_set_size_slot,
   NGX_HTTP_LOC_CONF_OFFSET,
   offsetof(ngx_http_slice_loc_conf_t, size),

On Wed, Jun 21, 2017 at 12:31 AM, Roman Arutyunyan <a...@nginx.com> wrote:

> You can pass a mapped variable to "proxy_set_header Range" which falls back
> to whatever you want for multi-range requests.
>
> On Tue, Jun 20, 2017 at 03:47:02PM +, 洪志道 wrote:
> > If we wan't to slice in the case of multi-page, how to achieve it?
> >
> > 洪志道 <hongzhi...@gmail.com>于2017年6月20日 周二23:21写道:
> >
> > > You said the module doesn't support multi-range, it means nothing to
> > > support slice feature through $slice_range.
> > > Anyway we can avoid it by access handle, but it's still unconvinient.
> > >
> > > Roman Arutyunyan <a...@nginx.com>于2017年6月20日 周二21:34写道:
> > >
> > >> That would disable slicing at all.
> > >>
> > >> On Tue, Jun 20, 2017 at 12:42:30PM +, 洪志道 wrote:
> > >> > Do you think it's better to set $slice_range not found as if
> multi-range
> > >> > request?
> > >> >
> > >> > Roman Arutyunyan <a...@nginx.com>于2017年6月20日 周二20:09写道:
> > >> >
> > >> > > Hi,
> > >> > >
> > >> > > On Tue, Jun 20, 2017 at 02:25:14AM +0800, 洪志道 wrote:
> > >> > > > Hi!
> > >> > > >
> > >> > > > Have a look at the following example first.
> > >> > > >
> > >> > > > server {
> > >> > > >   listen  80;
> > >> > > >
> > >> > > >   location / {
> > >> > > >   slice 10;
> > >> > > >   proxy_set_header  Range $slice_range;
> > >> > > >   proxy_pass http://127.0.0.1:81;
> > >> > > >   }
> > >> > > > }
> > >> > > >
> > >> > > >
> > >> > > > server {
> > >> > > >   listen  81;
> > >> > > >root  html;
> > >> > > > }
> > >> > > >
> > >> > > > Then we start a request with curl.
> > >> > > > > curl http://my.test.com/ -x 127.1:80 -H "range: bytes=1-50,
> 2-51"
> > >> > > >
> > >> > > > We get a response of the whole file that differs from
> expectation
> > >> (1-50,
> > >> > > > 2-51).
> > >> > > >
> > >> > > > It seems that slice module doesn't support multi-range
> (separated by
> > >> > > > commas),
> > >> > >
> > >> > > Yes, the slice module does not support multi-range.
> > >> > > The entire file is proxied and processed by the standard range
> module,
> > >> > > which has limited multi-range support too.  Particularly,
> multi-range
> > >> is
> > >> > > supported only when returning an entire file from disk.
> > >> > >
> > >> > > > but it's confused $slice_range variable is valid.
> > >> > > >
> > >> > > > Please confirm this question and the following patch, thanks!
> > >> > > >
> > >> > > >
> > >> > > > diff -r 5e05118678af src/http/modules/ngx_http_
> slice_filter_module.c
> > >> > > > --- a/src/http/modules/ngx_http_slice_filter_module.c Mon May
> 29
> > >> 23:33:38
> > >> > > > 2017 +0300
> > >> > > > +++ b/src/http/modules/ngx_http_slice_filte

Re: [nginx] slice module issue

2017-06-20 Thread Roman Arutyunyan
You can pass a mapped variable to "proxy_set_header Range" which falls back
to whatever you want for multi-range requests.

On Tue, Jun 20, 2017 at 03:47:02PM +, 洪志道 wrote:
> If we wan't to slice in the case of multi-page, how to achieve it?
> 
> 洪志道 <hongzhi...@gmail.com>于2017年6月20日 周二23:21写道:
> 
> > You said the module doesn't support multi-range, it means nothing to
> > support slice feature through $slice_range.
> > Anyway we can avoid it by access handle, but it's still unconvinient.
> >
> > Roman Arutyunyan <a...@nginx.com>于2017年6月20日 周二21:34写道:
> >
> >> That would disable slicing at all.
> >>
> >> On Tue, Jun 20, 2017 at 12:42:30PM +, 洪志道 wrote:
> >> > Do you think it's better to set $slice_range not found as if multi-range
> >> > request?
> >> >
> >> > Roman Arutyunyan <a...@nginx.com>于2017年6月20日 周二20:09写道:
> >> >
> >> > > Hi,
> >> > >
> >> > > On Tue, Jun 20, 2017 at 02:25:14AM +0800, 洪志道 wrote:
> >> > > > Hi!
> >> > > >
> >> > > > Have a look at the following example first.
> >> > > >
> >> > > > server {
> >> > > >   listen  80;
> >> > > >
> >> > > >   location / {
> >> > > >   slice 10;
> >> > > >   proxy_set_header  Range $slice_range;
> >> > > >   proxy_pass http://127.0.0.1:81;
> >> > > >   }
> >> > > > }
> >> > > >
> >> > > >
> >> > > > server {
> >> > > >   listen  81;
> >> > > >root  html;
> >> > > > }
> >> > > >
> >> > > > Then we start a request with curl.
> >> > > > > curl http://my.test.com/ -x 127.1:80 -H "range: bytes=1-50, 2-51"
> >> > > >
> >> > > > We get a response of the whole file that differs from expectation
> >> (1-50,
> >> > > > 2-51).
> >> > > >
> >> > > > It seems that slice module doesn't support multi-range (separated by
> >> > > > commas),
> >> > >
> >> > > Yes, the slice module does not support multi-range.
> >> > > The entire file is proxied and processed by the standard range module,
> >> > > which has limited multi-range support too.  Particularly, multi-range
> >> is
> >> > > supported only when returning an entire file from disk.
> >> > >
> >> > > > but it's confused $slice_range variable is valid.
> >> > > >
> >> > > > Please confirm this question and the following patch, thanks!
> >> > > >
> >> > > >
> >> > > > diff -r 5e05118678af src/http/modules/ngx_http_slice_filter_module.c
> >> > > > --- a/src/http/modules/ngx_http_slice_filter_module.c Mon May 29
> >> 23:33:38
> >> > > > 2017 +0300
> >> > > > +++ b/src/http/modules/ngx_http_slice_filter_module.c Mon Jun 19
> >> 09:35:24
> >> > > > 2017 -0400
> >> > > > @@ -389,6 +389,7 @@
> >> > > >  ngx_http_variable_value_t *v, uintptr_t data)
> >> > > >  {
> >> > > >  u_char *p;
> >> > > > +off_t  start;
> >> > > >  ngx_http_slice_ctx_t   *ctx;
> >> > > >  ngx_http_slice_loc_conf_t  *slcf;
> >> > > >
> >> > > > @@ -407,6 +408,13 @@
> >> > > >  return NGX_OK;
> >> > > >  }
> >> > > >
> >> > > > +start = ngx_http_slice_get_start(r);
> >> > > > +
> >> > > > +if (start == -1) {
> >> > > > +v->not_found = 1;
> >> > > > +return NGX_OK;
> >> > > > +}
> >> > > > +
> >> > > >  ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_slice_ctx_t));
> >> > > >  if (ctx == NULL) {
> >> > > >  return NGX_ERROR;
> >> > > > @@ -419,7 +427,7 @@
> >> > > >  return NGX_ERROR;
> >> > > >  }
> >> &g

Re: [nginx] slice module issue

2017-06-20 Thread 洪志道
If we wan't to slice in the case of multi-page, how to achieve it?

洪志道 <hongzhi...@gmail.com>于2017年6月20日 周二23:21写道:

> You said the module doesn't support multi-range, it means nothing to
> support slice feature through $slice_range.
> Anyway we can avoid it by access handle, but it's still unconvinient.
>
> Roman Arutyunyan <a...@nginx.com>于2017年6月20日 周二21:34写道:
>
>> That would disable slicing at all.
>>
>> On Tue, Jun 20, 2017 at 12:42:30PM +, 洪志道 wrote:
>> > Do you think it's better to set $slice_range not found as if multi-range
>> > request?
>> >
>> > Roman Arutyunyan <a...@nginx.com>于2017年6月20日 周二20:09写道:
>> >
>> > > Hi,
>> > >
>> > > On Tue, Jun 20, 2017 at 02:25:14AM +0800, 洪志道 wrote:
>> > > > Hi!
>> > > >
>> > > > Have a look at the following example first.
>> > > >
>> > > > server {
>> > > >   listen  80;
>> > > >
>> > > >   location / {
>> > > >   slice 10;
>> > > >   proxy_set_header  Range $slice_range;
>> > > >   proxy_pass http://127.0.0.1:81;
>> > > >   }
>> > > > }
>> > > >
>> > > >
>> > > > server {
>> > > >   listen  81;
>> > > >    root  html;
>> > > > }
>> > > >
>> > > > Then we start a request with curl.
>> > > > > curl http://my.test.com/ -x 127.1:80 -H "range: bytes=1-50, 2-51"
>> > > >
>> > > > We get a response of the whole file that differs from expectation
>> (1-50,
>> > > > 2-51).
>> > > >
>> > > > It seems that slice module doesn't support multi-range (separated by
>> > > > commas),
>> > >
>> > > Yes, the slice module does not support multi-range.
>> > > The entire file is proxied and processed by the standard range module,
>> > > which has limited multi-range support too.  Particularly, multi-range
>> is
>> > > supported only when returning an entire file from disk.
>> > >
>> > > > but it's confused $slice_range variable is valid.
>> > > >
>> > > > Please confirm this question and the following patch, thanks!
>> > > >
>> > > >
>> > > > diff -r 5e05118678af src/http/modules/ngx_http_slice_filter_module.c
>> > > > --- a/src/http/modules/ngx_http_slice_filter_module.c Mon May 29
>> 23:33:38
>> > > > 2017 +0300
>> > > > +++ b/src/http/modules/ngx_http_slice_filter_module.c Mon Jun 19
>> 09:35:24
>> > > > 2017 -0400
>> > > > @@ -389,6 +389,7 @@
>> > > >  ngx_http_variable_value_t *v, uintptr_t data)
>> > > >  {
>> > > >  u_char *p;
>> > > > +off_t  start;
>> > > >  ngx_http_slice_ctx_t   *ctx;
>> > > >  ngx_http_slice_loc_conf_t  *slcf;
>> > > >
>> > > > @@ -407,6 +408,13 @@
>> > > >  return NGX_OK;
>> > > >  }
>> > > >
>> > > > +start = ngx_http_slice_get_start(r);
>> > > > +
>> > > > +if (start == -1) {
>> > > > +v->not_found = 1;
>> > > > +return NGX_OK;
>> > > > +}
>> > > > +
>> > > >  ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_slice_ctx_t));
>> > > >  if (ctx == NULL) {
>> > > >  return NGX_ERROR;
>> > > > @@ -419,7 +427,7 @@
>> > > >  return NGX_ERROR;
>> > > >  }
>> > > >
>> > > > -ctx->start = slcf->size * (ngx_http_slice_get_start(r) /
>> > > > slcf->size);
>> > > > +ctx->start = slcf->size * (start / slcf->size);
>> > > >
>> > > >  ctx->range.data = p;
>> > > >  ctx->range.len = ngx_sprintf(p, "bytes=%O-%O", ctx->start,
>> > > > @@ -460,7 +468,7 @@
>> > > >  p = h->value.data + 6;
>> > > >
>> > > >  if (ngx_strchr(p, ',')) {
>> > > > -return 0;
>> > > > +return -1;
>> > > >

Re: [nginx] slice module issue

2017-06-20 Thread 洪志道
You said the module doesn't support multi-range, it means nothing to
support slice feature through $slice_range.
Anyway we can avoid it by access handle, but it's still unconvinient.

Roman Arutyunyan <a...@nginx.com>于2017年6月20日 周二21:34写道:

> That would disable slicing at all.
>
> On Tue, Jun 20, 2017 at 12:42:30PM +, 洪志道 wrote:
> > Do you think it's better to set $slice_range not found as if multi-range
> > request?
> >
> > Roman Arutyunyan <a...@nginx.com>于2017年6月20日 周二20:09写道:
> >
> > > Hi,
> > >
> > > On Tue, Jun 20, 2017 at 02:25:14AM +0800, 洪志道 wrote:
> > > > Hi!
> > > >
> > > > Have a look at the following example first.
> > > >
> > > > server {
> > > >   listen  80;
> > > >
> > > >   location / {
> > > >   slice 10;
> > > >   proxy_set_header  Range $slice_range;
> > > >   proxy_pass http://127.0.0.1:81;
> > > >   }
> > > > }
> > > >
> > > >
> > > > server {
> > > >   listen  81;
> > > >    root  html;
> > > > }
> > > >
> > > > Then we start a request with curl.
> > > > > curl http://my.test.com/ -x 127.1:80 -H "range: bytes=1-50, 2-51"
> > > >
> > > > We get a response of the whole file that differs from expectation
> (1-50,
> > > > 2-51).
> > > >
> > > > It seems that slice module doesn't support multi-range (separated by
> > > > commas),
> > >
> > > Yes, the slice module does not support multi-range.
> > > The entire file is proxied and processed by the standard range module,
> > > which has limited multi-range support too.  Particularly, multi-range
> is
> > > supported only when returning an entire file from disk.
> > >
> > > > but it's confused $slice_range variable is valid.
> > > >
> > > > Please confirm this question and the following patch, thanks!
> > > >
> > > >
> > > > diff -r 5e05118678af src/http/modules/ngx_http_slice_filter_module.c
> > > > --- a/src/http/modules/ngx_http_slice_filter_module.c Mon May 29
> 23:33:38
> > > > 2017 +0300
> > > > +++ b/src/http/modules/ngx_http_slice_filter_module.c Mon Jun 19
> 09:35:24
> > > > 2017 -0400
> > > > @@ -389,6 +389,7 @@
> > > >  ngx_http_variable_value_t *v, uintptr_t data)
> > > >  {
> > > >  u_char *p;
> > > > +off_t  start;
> > > >  ngx_http_slice_ctx_t   *ctx;
> > > >  ngx_http_slice_loc_conf_t  *slcf;
> > > >
> > > > @@ -407,6 +408,13 @@
> > > >  return NGX_OK;
> > > >  }
> > > >
> > > > +start = ngx_http_slice_get_start(r);
> > > > +
> > > > +if (start == -1) {
> > > > +v->not_found = 1;
> > > > +return NGX_OK;
> > > > +}
> > > > +
> > > >  ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_slice_ctx_t));
> > > >  if (ctx == NULL) {
> > > >  return NGX_ERROR;
> > > > @@ -419,7 +427,7 @@
> > > >  return NGX_ERROR;
> > > >  }
> > > >
> > > > -ctx->start = slcf->size * (ngx_http_slice_get_start(r) /
> > > > slcf->size);
> > > > +ctx->start = slcf->size * (start / slcf->size);
> > > >
> > > >  ctx->range.data = p;
> > > >  ctx->range.len = ngx_sprintf(p, "bytes=%O-%O", ctx->start,
> > > > @@ -460,7 +468,7 @@
> > > >  p = h->value.data + 6;
> > > >
> > > >  if (ngx_strchr(p, ',')) {
> > > > -return 0;
> > > > +return -1;
> > > >  }
> > > >
> > > >  while (*p == ' ') { p++; }
> > > >
> > > >
> > > > And this is a better conf.
> > > >
> > > > map $slice_range  $x_slice_range {
> > > > default  $http_range;
> > > > ~   $slice_range;
> > > > }
> > > >
> > > > server {
> > > >   listen  80;
> > > >
> > > >   location / {
> > > >   slice 10;
> > > >   proxy_set_header  Range $x_slice_range;
> > > >   proxy_pass http://127.0.0.1:81;
> > > >   }
> > > > }
> > >
> > > > ___
> > > > nginx-devel mailing list
> > > > nginx-devel@nginx.org
> > > > http://mailman.nginx.org/mailman/listinfo/nginx-devel
> > >
> > >
> > > --
> > > Roman Arutyunyan
> > > ___
> > > nginx-devel mailing list
> > > nginx-devel@nginx.org
> > > http://mailman.nginx.org/mailman/listinfo/nginx-devel
>
> > ___
> > nginx-devel mailing list
> > nginx-devel@nginx.org
> > http://mailman.nginx.org/mailman/listinfo/nginx-devel
>
>
> --
> Roman Arutyunyan
> ___
> nginx-devel mailing list
> nginx-devel@nginx.org
> http://mailman.nginx.org/mailman/listinfo/nginx-devel
___
nginx-devel mailing list
nginx-devel@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-devel

Re: [nginx] slice module issue

2017-06-20 Thread Roman Arutyunyan
That would disable slicing at all.

On Tue, Jun 20, 2017 at 12:42:30PM +, 洪志道 wrote:
> Do you think it's better to set $slice_range not found as if multi-range
> request?
> 
> Roman Arutyunyan <a...@nginx.com>于2017年6月20日 周二20:09写道:
> 
> > Hi,
> >
> > On Tue, Jun 20, 2017 at 02:25:14AM +0800, 洪志道 wrote:
> > > Hi!
> > >
> > > Have a look at the following example first.
> > >
> > > server {
> > >   listen  80;
> > >
> > >   location / {
> > >   slice 10;
> > >   proxy_set_header  Range $slice_range;
> > >   proxy_pass http://127.0.0.1:81;
> > >   }
> > > }
> > >
> > >
> > > server {
> > >   listen  81;
> > >root  html;
> > > }
> > >
> > > Then we start a request with curl.
> > > > curl http://my.test.com/ -x 127.1:80 -H "range: bytes=1-50, 2-51"
> > >
> > > We get a response of the whole file that differs from expectation (1-50,
> > > 2-51).
> > >
> > > It seems that slice module doesn't support multi-range (separated by
> > > commas),
> >
> > Yes, the slice module does not support multi-range.
> > The entire file is proxied and processed by the standard range module,
> > which has limited multi-range support too.  Particularly, multi-range is
> > supported only when returning an entire file from disk.
> >
> > > but it's confused $slice_range variable is valid.
> > >
> > > Please confirm this question and the following patch, thanks!
> > >
> > >
> > > diff -r 5e05118678af src/http/modules/ngx_http_slice_filter_module.c
> > > --- a/src/http/modules/ngx_http_slice_filter_module.c Mon May 29 23:33:38
> > > 2017 +0300
> > > +++ b/src/http/modules/ngx_http_slice_filter_module.c Mon Jun 19 09:35:24
> > > 2017 -0400
> > > @@ -389,6 +389,7 @@
> > >  ngx_http_variable_value_t *v, uintptr_t data)
> > >  {
> > >  u_char *p;
> > > +off_t  start;
> > >  ngx_http_slice_ctx_t   *ctx;
> > >  ngx_http_slice_loc_conf_t  *slcf;
> > >
> > > @@ -407,6 +408,13 @@
> > >  return NGX_OK;
> > >  }
> > >
> > > +start = ngx_http_slice_get_start(r);
> > > +
> > > +if (start == -1) {
> > > +v->not_found = 1;
> > > +return NGX_OK;
> > > +}
> > > +
> > >  ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_slice_ctx_t));
> > >  if (ctx == NULL) {
> > >  return NGX_ERROR;
> > > @@ -419,7 +427,7 @@
> > >  return NGX_ERROR;
> > >  }
> > >
> > > -ctx->start = slcf->size * (ngx_http_slice_get_start(r) /
> > > slcf->size);
> > > +ctx->start = slcf->size * (start / slcf->size);
> > >
> > >  ctx->range.data = p;
> > >  ctx->range.len = ngx_sprintf(p, "bytes=%O-%O", ctx->start,
> > > @@ -460,7 +468,7 @@
> > >  p = h->value.data + 6;
> > >
> > >  if (ngx_strchr(p, ',')) {
> > > -return 0;
> > > +return -1;
> > >  }
> > >
> > >  while (*p == ' ') { p++; }
> > >
> > >
> > > And this is a better conf.
> > >
> > > map $slice_range  $x_slice_range {
> > > default  $http_range;
> > > ~   $slice_range;
> > > }
> > >
> > > server {
> > >   listen  80;
> > >
> > >   location / {
> > >   slice 10;
> > >   proxy_set_header  Range $x_slice_range;
> > >   proxy_pass http://127.0.0.1:81;
> > >   }
> > > }
> >
> > > ___
> > > nginx-devel mailing list
> > > nginx-devel@nginx.org
> > > http://mailman.nginx.org/mailman/listinfo/nginx-devel
> >
> >
> > --
> > Roman Arutyunyan
> > ___
> > nginx-devel mailing list
> > nginx-devel@nginx.org
> > http://mailman.nginx.org/mailman/listinfo/nginx-devel

> ___
> nginx-devel mailing list
> nginx-devel@nginx.org
> http://mailman.nginx.org/mailman/listinfo/nginx-devel


-- 
Roman Arutyunyan
___
nginx-devel mailing list
nginx-devel@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-devel

Re: [nginx] slice module issue

2017-06-20 Thread 洪志道
Do you think it's better to set $slice_range not found as if multi-range
request?

Roman Arutyunyan <a...@nginx.com>于2017年6月20日 周二20:09写道:

> Hi,
>
> On Tue, Jun 20, 2017 at 02:25:14AM +0800, 洪志道 wrote:
> > Hi!
> >
> > Have a look at the following example first.
> >
> > server {
> >   listen  80;
> >
> >   location / {
> >   slice 10;
> >   proxy_set_header  Range $slice_range;
> >   proxy_pass http://127.0.0.1:81;
> >   }
> > }
> >
> >
> > server {
> >   listen  81;
> >root  html;
> > }
> >
> > Then we start a request with curl.
> > > curl http://my.test.com/ -x 127.1:80 -H "range: bytes=1-50, 2-51"
> >
> > We get a response of the whole file that differs from expectation (1-50,
> > 2-51).
> >
> > It seems that slice module doesn't support multi-range (separated by
> > commas),
>
> Yes, the slice module does not support multi-range.
> The entire file is proxied and processed by the standard range module,
> which has limited multi-range support too.  Particularly, multi-range is
> supported only when returning an entire file from disk.
>
> > but it's confused $slice_range variable is valid.
> >
> > Please confirm this question and the following patch, thanks!
> >
> >
> > diff -r 5e05118678af src/http/modules/ngx_http_slice_filter_module.c
> > --- a/src/http/modules/ngx_http_slice_filter_module.c Mon May 29 23:33:38
> > 2017 +0300
> > +++ b/src/http/modules/ngx_http_slice_filter_module.c Mon Jun 19 09:35:24
> > 2017 -0400
> > @@ -389,6 +389,7 @@
> >  ngx_http_variable_value_t *v, uintptr_t data)
> >  {
> >  u_char *p;
> > +off_t  start;
> >  ngx_http_slice_ctx_t   *ctx;
> >  ngx_http_slice_loc_conf_t  *slcf;
> >
> > @@ -407,6 +408,13 @@
> >  return NGX_OK;
> >  }
> >
> > +start = ngx_http_slice_get_start(r);
> > +
> > +if (start == -1) {
> > +v->not_found = 1;
> > +return NGX_OK;
> > +}
> > +
> >  ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_slice_ctx_t));
> >  if (ctx == NULL) {
> >  return NGX_ERROR;
> > @@ -419,7 +427,7 @@
> >  return NGX_ERROR;
> >  }
> >
> > -ctx->start = slcf->size * (ngx_http_slice_get_start(r) /
> > slcf->size);
> > +ctx->start = slcf->size * (start / slcf->size);
> >
> >  ctx->range.data = p;
> >  ctx->range.len = ngx_sprintf(p, "bytes=%O-%O", ctx->start,
> > @@ -460,7 +468,7 @@
> >  p = h->value.data + 6;
> >
> >  if (ngx_strchr(p, ',')) {
> > -return 0;
> > +return -1;
> >  }
> >
> >  while (*p == ' ') { p++; }
> >
> >
> > And this is a better conf.
> >
> > map $slice_range  $x_slice_range {
> > default  $http_range;
> > ~   $slice_range;
> > }
> >
> > server {
> >   listen  80;
> >
> >   location / {
> >   slice 10;
> >   proxy_set_header  Range $x_slice_range;
> >   proxy_pass http://127.0.0.1:81;
> >   }
> > }
>
> > ___
> > nginx-devel mailing list
> > nginx-devel@nginx.org
> > http://mailman.nginx.org/mailman/listinfo/nginx-devel
>
>
> --
> Roman Arutyunyan
> ___
> nginx-devel mailing list
> nginx-devel@nginx.org
> http://mailman.nginx.org/mailman/listinfo/nginx-devel
___
nginx-devel mailing list
nginx-devel@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-devel

Re: [nginx] slice module issue

2017-06-20 Thread Roman Arutyunyan
Hi,

On Tue, Jun 20, 2017 at 02:25:14AM +0800, 洪志道 wrote:
> Hi!
> 
> Have a look at the following example first.
> 
> server {
>   listen  80;
> 
>   location / {
>   slice 10;
>   proxy_set_header  Range $slice_range;
>   proxy_pass http://127.0.0.1:81;
>   }
> }
> 
> 
> server {
>   listen  81;
>root  html;
> }
> 
> Then we start a request with curl.
> > curl http://my.test.com/ -x 127.1:80 -H "range: bytes=1-50, 2-51"
> 
> We get a response of the whole file that differs from expectation (1-50,
> 2-51).
> 
> It seems that slice module doesn't support multi-range (separated by
> commas),

Yes, the slice module does not support multi-range.
The entire file is proxied and processed by the standard range module,
which has limited multi-range support too.  Particularly, multi-range is
supported only when returning an entire file from disk.

> but it's confused $slice_range variable is valid.
> 
> Please confirm this question and the following patch, thanks!
> 
> 
> diff -r 5e05118678af src/http/modules/ngx_http_slice_filter_module.c
> --- a/src/http/modules/ngx_http_slice_filter_module.c Mon May 29 23:33:38
> 2017 +0300
> +++ b/src/http/modules/ngx_http_slice_filter_module.c Mon Jun 19 09:35:24
> 2017 -0400
> @@ -389,6 +389,7 @@
>  ngx_http_variable_value_t *v, uintptr_t data)
>  {
>  u_char *p;
> +off_t  start;
>  ngx_http_slice_ctx_t   *ctx;
>  ngx_http_slice_loc_conf_t  *slcf;
> 
> @@ -407,6 +408,13 @@
>  return NGX_OK;
>  }
> 
> +start = ngx_http_slice_get_start(r);
> +
> +if (start == -1) {
> +v->not_found = 1;
> +return NGX_OK;
> +}
> +
>  ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_slice_ctx_t));
>  if (ctx == NULL) {
>  return NGX_ERROR;
> @@ -419,7 +427,7 @@
>  return NGX_ERROR;
>  }
> 
> -ctx->start = slcf->size * (ngx_http_slice_get_start(r) /
> slcf->size);
> +ctx->start = slcf->size * (start / slcf->size);
> 
>  ctx->range.data = p;
>  ctx->range.len = ngx_sprintf(p, "bytes=%O-%O", ctx->start,
> @@ -460,7 +468,7 @@
>  p = h->value.data + 6;
> 
>  if (ngx_strchr(p, ',')) {
> -return 0;
> +return -1;
>  }
> 
>  while (*p == ' ') { p++; }
> 
> 
> And this is a better conf.
> 
> map $slice_range  $x_slice_range {
> default  $http_range;
> ~   $slice_range;
> }
> 
> server {
>   listen  80;
> 
>   location / {
>   slice 10;
>   proxy_set_header  Range $x_slice_range;
>   proxy_pass http://127.0.0.1:81;
>   }
> }

> ___
> nginx-devel mailing list
> nginx-devel@nginx.org
> http://mailman.nginx.org/mailman/listinfo/nginx-devel


-- 
Roman Arutyunyan
___
nginx-devel mailing list
nginx-devel@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-devel

[nginx] slice module issue

2017-06-19 Thread 洪志道
Hi!

Have a look at the following example first.

server {
  listen  80;

  location / {
  slice 10;
  proxy_set_header  Range $slice_range;
  proxy_pass http://127.0.0.1:81;
  }
}


server {
  listen  81;
   root  html;
}

Then we start a request with curl.
> curl http://my.test.com/ -x 127.1:80 -H "range: bytes=1-50, 2-51"

We get a response of the whole file that differs from expectation (1-50,
2-51).

It seems that slice module doesn't support multi-range (separated by
commas),
but it's confused $slice_range variable is valid.

Please confirm this question and the following patch, thanks!


diff -r 5e05118678af src/http/modules/ngx_http_slice_filter_module.c
--- a/src/http/modules/ngx_http_slice_filter_module.c Mon May 29 23:33:38
2017 +0300
+++ b/src/http/modules/ngx_http_slice_filter_module.c Mon Jun 19 09:35:24
2017 -0400
@@ -389,6 +389,7 @@
 ngx_http_variable_value_t *v, uintptr_t data)
 {
 u_char *p;
+off_t  start;
 ngx_http_slice_ctx_t   *ctx;
 ngx_http_slice_loc_conf_t  *slcf;

@@ -407,6 +408,13 @@
 return NGX_OK;
 }

+start = ngx_http_slice_get_start(r);
+
+if (start == -1) {
+v->not_found = 1;
+return NGX_OK;
+}
+
 ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_slice_ctx_t));
 if (ctx == NULL) {
 return NGX_ERROR;
@@ -419,7 +427,7 @@
 return NGX_ERROR;
 }

-ctx->start = slcf->size * (ngx_http_slice_get_start(r) /
slcf->size);
+ctx->start = slcf->size * (start / slcf->size);

 ctx->range.data = p;
 ctx->range.len = ngx_sprintf(p, "bytes=%O-%O", ctx->start,
@@ -460,7 +468,7 @@
 p = h->value.data + 6;

 if (ngx_strchr(p, ',')) {
-return 0;
+return -1;
 }

 while (*p == ' ') { p++; }


And this is a better conf.

map $slice_range  $x_slice_range {
default  $http_range;
~   $slice_range;
}

server {
  listen  80;

  location / {
  slice 10;
  proxy_set_header  Range $x_slice_range;
  proxy_pass http://127.0.0.1:81;
  }
}
___
nginx-devel mailing list
nginx-devel@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-devel

Re: slice module issue if redirected origin and have have fist slice

2017-06-13 Thread Roman Arutyunyan
Hi George,

On Tue, Jun 13, 2017 at 04:39:08PM +0300, George . wrote:
> Hi Roman,
> 
> Thank you a lot for detailed explanation.
> Initially I thought that NGX_HTTP_SUBREQUEST_CLONE option to
> ngx_http_subrequest (your latest fix in slice module - Slice filter: fetch
> slices in cloned subrequests) was intended to make full context in
> subrequest to be kept during redirects and because of minor bug it does not
> work in my case.
> 
> I'll need some solution for cases like this:
> 
> 1. Origin redirects us (assuming that it not under our administration and
> we can't do anything)

You can add an intermediate proxy between the sliced proxy and the origin.
At that proxy you have the proper Range header, so you are not limited with the
slice module limitations that I mentioned.  You can even reuse the same cache
if this proxy is in the same nginx instance.

> 2. Origin is missing a object and send us 404, so we have to fallback to
> other origin

You can use proxy_next_upstream to switch to the next origin in certain cases,
404 response code is one of them.

> If you have some suggestion how to workaround this tricky situation - I be
> very thankful.
> George
> 
> On Tue, Jun 13, 2017 at 2:44 PM, Roman Arutyunyan <a...@nginx.com> wrote:
> 
> > Hi George,
> >
> > On Mon, Jun 12, 2017 at 10:02:16AM +0300, George . wrote:
> > > ​​Hi,
> > > I've discovered following strange issue with http_slice_module
> > > If I have a named location for internal 302 redirect and caching one
> > slice
> > > makes further request for whole object to brake upstream redirected
> > request
> > > (missing Rage header, see frame 254 in the attached capture ​
> > >  slice_redirect_problem.pcapng
> > > <https://drive.google.com/a/ucdn.com/file/d/
> > 0ByZ2nt00gtJ2NmtqVUU3OVozNXM/view?usp=drive_web>
> > > ​ ).
> >
> > What happens is:
> >
> > - client requests 0-4m
> > - nginx creates the request for the 1st slice and proxies it to 8081
> > - after receiving 302, the request is redirected to
> >   @fetch_from_redirected_origin and the first slice is saved in the cache
> >
> > Note that in @fetch_from_redirected_origin there's a completely separate
> > slice context.  By this time nginx only knows what client sent.  Previous
> > slice context is completely lost as well as all other modules' contexts.
> > Coincidentally, it does what you expect because only the first slice was
> > requested.
> >
> > Then you request the entire file:
> >
> > - client request the entire file
> > - first slice is sent from the cache
> > - nginx creates a subrequest for the 2nd slice: 4m-8m and proxies it to
> > 8081
> > - after receiving 302, the subrequest is redirected to
> >   @fetch_from_redirected_origin
> >
> > After the redirect nginx does not have any idea that it should fetch the
> > second
> > slice.  Moreover, the $slice_range variable is not filled with actual
> > range when
> > first accessed in a subrequest (after error_page redirect it looks like the
> > first access), so it remains empty.  That's why the entire file is
> > requested.
> > But even if the variable was valid, that would still be bad since the slice
> > context is lost after error_page redirect.  You would get the whole file
> > here
> > instead of 4m-8m range.
> >
> > The takeaway is you should avoid using the slice module with redirects
> > (error_page, X-Accel-Redirect) for fetching slices.  Instead you should
> > proxy
> > directly to the origin server.
> >
> > >  If there is no cached slice everything is okey  (2nd capture​
> > >  slice_redirect_no_problem.pcapng
> > > <https://drive.google.com/a/ucdn.com/file/d/
> > 0ByZ2nt00gtJ2SUpnc2VVbzBKdWc/view?usp=drive_web>
> > > ​)
> >
> > No, it's not ok.  The first redirect to @fetch_from_redirected_origin leads
> > to caching all file slices instead of the first one.
> >
> > > Problem appears in main branch and also  nginx/1.12 ... and may be in all
> > > versions
> > >
> > > nginx version: nginx/1.13.2
> > > built by gcc 4.9.2 (Debian 4.9.2-10)
> > > configure arguments: --prefix=/home/george/run/nginx_hg
> > > --with-http_slice_module
> > >
> > >
> > >
> > >
> > > nginx.conf
> > > user cdnuser cdnuser;
> > > worker_processes  1;
> > >
> > > error_log  logs/error.log  debug;
> > >
> > > events {
> > > worker_connections  1024;
> > > }
> > >
&g

Re: slice module issue if redirected origin and have have fist slice

2017-06-13 Thread George .
Hi Roman,

Thank you a lot for detailed explanation.
Initially I thought that NGX_HTTP_SUBREQUEST_CLONE option to
ngx_http_subrequest (your latest fix in slice module - Slice filter: fetch
slices in cloned subrequests) was intended to make full context in
subrequest to be kept during redirects and because of minor bug it does not
work in my case.

I'll need some solution for cases like this:

1. Origin redirects us (assuming that it not under our administration and
we can't do anything)
2. Origin is missing a object and send us 404, so we have to fallback to
other origin

If you have some suggestion how to workaround this tricky situation - I be
very thankful.


George

On Tue, Jun 13, 2017 at 2:44 PM, Roman Arutyunyan <a...@nginx.com> wrote:

> Hi George,
>
> On Mon, Jun 12, 2017 at 10:02:16AM +0300, George . wrote:
> > ​​Hi,
> > I've discovered following strange issue with http_slice_module
> > If I have a named location for internal 302 redirect and caching one
> slice
> > makes further request for whole object to brake upstream redirected
> request
> > (missing Rage header, see frame 254 in the attached capture ​
> >  slice_redirect_problem.pcapng
> > <https://drive.google.com/a/ucdn.com/file/d/
> 0ByZ2nt00gtJ2NmtqVUU3OVozNXM/view?usp=drive_web>
> > ​ ).
>
> What happens is:
>
> - client requests 0-4m
> - nginx creates the request for the 1st slice and proxies it to 8081
> - after receiving 302, the request is redirected to
>   @fetch_from_redirected_origin and the first slice is saved in the cache
>
> Note that in @fetch_from_redirected_origin there's a completely separate
> slice context.  By this time nginx only knows what client sent.  Previous
> slice context is completely lost as well as all other modules' contexts.
> Coincidentally, it does what you expect because only the first slice was
> requested.
>
> Then you request the entire file:
>
> - client request the entire file
> - first slice is sent from the cache
> - nginx creates a subrequest for the 2nd slice: 4m-8m and proxies it to
> 8081
> - after receiving 302, the subrequest is redirected to
>   @fetch_from_redirected_origin
>
> After the redirect nginx does not have any idea that it should fetch the
> second
> slice.  Moreover, the $slice_range variable is not filled with actual
> range when
> first accessed in a subrequest (after error_page redirect it looks like the
> first access), so it remains empty.  That's why the entire file is
> requested.
> But even if the variable was valid, that would still be bad since the slice
> context is lost after error_page redirect.  You would get the whole file
> here
> instead of 4m-8m range.
>
> The takeaway is you should avoid using the slice module with redirects
> (error_page, X-Accel-Redirect) for fetching slices.  Instead you should
> proxy
> directly to the origin server.
>
> >  If there is no cached slice everything is okey  (2nd capture​
> >  slice_redirect_no_problem.pcapng
> > <https://drive.google.com/a/ucdn.com/file/d/
> 0ByZ2nt00gtJ2SUpnc2VVbzBKdWc/view?usp=drive_web>
> > ​)
>
> No, it's not ok.  The first redirect to @fetch_from_redirected_origin leads
> to caching all file slices instead of the first one.
>
> > Problem appears in main branch and also  nginx/1.12 ... and may be in all
> > versions
> >
> > nginx version: nginx/1.13.2
> > built by gcc 4.9.2 (Debian 4.9.2-10)
> > configure arguments: --prefix=/home/george/run/nginx_hg
> > --with-http_slice_module
> >
> >
> >
> >
> > nginx.conf
> > user cdnuser cdnuser;
> > worker_processes  1;
> >
> > error_log  logs/error.log  debug;
> >
> > events {
> > worker_connections  1024;
> > }
> >
> >
> > http {
> > include   mime.types;
> > default_type  application/octet-stream;
> >
> >
> > sendfileon;
> > tcp_nopush  on;
> >
> > proxy_cache_path /home/george/run/nginx_hg/cache/
> > keys_zone=zone_uid_default:4m levels=2:1 inactive=360d max_size=18329m;
> >
> > # our redirecting origin
> > server {
> > listen   8081;
> >
> > return 302 $scheme://127.0.0.1:8082$request_uri;
> > }
> >
> > # our final origin
> > server {
> > listen   8082;
> > add_header Cache-Control "max-age=3600";
> > root /home/george/run/nginx_hg/root;
> > }
> >
> > server {
> > listen   8080;
> > server_name  localhost;
> >
> > recursive_error_pages on;
> 

Re: slice module issue if redirected origin and have have fist slice

2017-06-13 Thread Roman Arutyunyan
Hi George,

On Mon, Jun 12, 2017 at 10:02:16AM +0300, George . wrote:
> ​​Hi,
> I've discovered following strange issue with http_slice_module
> If I have a named location for internal 302 redirect and caching one slice
> makes further request for whole object to brake upstream redirected request
> (missing Rage header, see frame 254 in the attached capture ​
>  slice_redirect_problem.pcapng
> <https://drive.google.com/a/ucdn.com/file/d/0ByZ2nt00gtJ2NmtqVUU3OVozNXM/view?usp=drive_web>
> ​ ).

What happens is:

- client requests 0-4m
- nginx creates the request for the 1st slice and proxies it to 8081
- after receiving 302, the request is redirected to
  @fetch_from_redirected_origin and the first slice is saved in the cache

Note that in @fetch_from_redirected_origin there's a completely separate
slice context.  By this time nginx only knows what client sent.  Previous
slice context is completely lost as well as all other modules' contexts.
Coincidentally, it does what you expect because only the first slice was
requested.

Then you request the entire file:
  
- client request the entire file
- first slice is sent from the cache
- nginx creates a subrequest for the 2nd slice: 4m-8m and proxies it to 8081
- after receiving 302, the subrequest is redirected to
  @fetch_from_redirected_origin

After the redirect nginx does not have any idea that it should fetch the second
slice.  Moreover, the $slice_range variable is not filled with actual range when
first accessed in a subrequest (after error_page redirect it looks like the
first access), so it remains empty.  That's why the entire file is requested.
But even if the variable was valid, that would still be bad since the slice
context is lost after error_page redirect.  You would get the whole file here
instead of 4m-8m range.

The takeaway is you should avoid using the slice module with redirects
(error_page, X-Accel-Redirect) for fetching slices.  Instead you should proxy
directly to the origin server.

>  If there is no cached slice everything is okey  (2nd capture​
>  slice_redirect_no_problem.pcapng
> <https://drive.google.com/a/ucdn.com/file/d/0ByZ2nt00gtJ2SUpnc2VVbzBKdWc/view?usp=drive_web>
> ​)

No, it's not ok.  The first redirect to @fetch_from_redirected_origin leads
to caching all file slices instead of the first one.

> Problem appears in main branch and also  nginx/1.12 ... and may be in all
> versions
> 
> nginx version: nginx/1.13.2
> built by gcc 4.9.2 (Debian 4.9.2-10)
> configure arguments: --prefix=/home/george/run/nginx_hg
> --with-http_slice_module
> 
> 
> 
> 
> nginx.conf
> user cdnuser cdnuser;
> worker_processes  1;
> 
> error_log  logs/error.log  debug;
> 
> events {
> worker_connections  1024;
> }
> 
> 
> http {
> include   mime.types;
> default_type  application/octet-stream;
> 
> 
> sendfileon;
> tcp_nopush  on;
> 
> proxy_cache_path /home/george/run/nginx_hg/cache/
> keys_zone=zone_uid_default:4m levels=2:1 inactive=360d max_size=18329m;
> 
> # our redirecting origin
> server {
> listen   8081;
> 
> return 302 $scheme://127.0.0.1:8082$request_uri;
> }
> 
> # our final origin
> server {
> listen   8082;
> add_header Cache-Control "max-age=3600";
> root /home/george/run/nginx_hg/root;
> }
> 
> server {
> listen   8080;
> server_name  localhost;
> 
> recursive_error_pages on;
> proxy_intercept_errors on;
> 
> 
> location / {
> slice 4m;
> proxy_cache   zone_uid_default;
> proxy_cache_key   $uri$is_args$args$slice_range;
> proxy_set_header  Range $slice_range;
> 
> proxy_passhttp://localhost:8081;
> 
> error_page 301 302 307 = @fetch_from_redirected_origin;
> }
> 
> location @fetch_from_redirected_origin {
> slice   4m;
> 
> internal;
> 
> set $my_upstream_http_location $upstream_http_location;
> 
> proxy_cache   zone_uid_default;
> proxy_cache_key   $uri$is_args$args$slice_range;
> proxy_set_header  Range $slice_range;
> 
> proxy_pass$my_upstream_http_location;
> }
> }
>  }
> 
> 
> How to reproduce:
> 
> 1. Create some empty object in our emulated origin
> mkdir /home/george/run/nginx_hg/root
> dd if=/dev/zero of=/home/george/run/nginx_hg/root/some_object  bs=64M
> count=1
> 
> 2. Ask our caching proxy for one 4m slice, so it will be cached
> curl -v -r 0-4194303 "http://127.0.0.1:8080/some_object; --header "Host:

slice module issue if redirected origin and have have fist slice

2017-06-12 Thread George .
​​Hi,
I've discovered following strange issue with http_slice_module
If I have a named location for internal 302 redirect and caching one slice
makes further request for whole object to brake upstream redirected request
(missing Rage header, see frame 254 in the attached capture ​
 slice_redirect_problem.pcapng

​ ).

 If there is no cached slice everything is okey  (2nd capture​
 slice_redirect_no_problem.pcapng

​)

Problem appears in main branch and also  nginx/1.12 ... and may be in all
versions

nginx version: nginx/1.13.2
built by gcc 4.9.2 (Debian 4.9.2-10)
configure arguments: --prefix=/home/george/run/nginx_hg
--with-http_slice_module




nginx.conf
user cdnuser cdnuser;
worker_processes  1;

error_log  logs/error.log  debug;

events {
worker_connections  1024;
}


http {
include   mime.types;
default_type  application/octet-stream;


sendfileon;
tcp_nopush  on;

proxy_cache_path /home/george/run/nginx_hg/cache/
keys_zone=zone_uid_default:4m levels=2:1 inactive=360d max_size=18329m;

# our redirecting origin
server {
listen   8081;

return 302 $scheme://127.0.0.1:8082$request_uri;
}

# our final origin
server {
listen   8082;
add_header Cache-Control "max-age=3600";
root /home/george/run/nginx_hg/root;
}

server {
listen   8080;
server_name  localhost;

recursive_error_pages on;
proxy_intercept_errors on;


location / {
slice 4m;
proxy_cache   zone_uid_default;
proxy_cache_key   $uri$is_args$args$slice_range;
proxy_set_header  Range $slice_range;

proxy_passhttp://localhost:8081;

error_page 301 302 307 = @fetch_from_redirected_origin;
}

location @fetch_from_redirected_origin {
slice   4m;

internal;

set $my_upstream_http_location $upstream_http_location;

proxy_cache   zone_uid_default;
proxy_cache_key   $uri$is_args$args$slice_range;
proxy_set_header  Range $slice_range;

proxy_pass$my_upstream_http_location;
}
}
 }


How to reproduce:

1. Create some empty object in our emulated origin
mkdir /home/george/run/nginx_hg/root
dd if=/dev/zero of=/home/george/run/nginx_hg/root/some_object  bs=64M
count=1

2. Ask our caching proxy for one 4m slice, so it will be cached
curl -v -r 0-4194303 "http://127.0.0.1:8080/some_object; --header "Host:
localhost" -o /dev/null

3. See it really there
george@george ~/run/nginx_hg $ head
/home/george/run/nginx_hg/cache/81/c/00214df7041ea53dd335ed5b055bfc81
Ļ:Y˩:Y��:YVʜ�r � "593aa9cb-400"
KEY: /some_objectbytes=0-4194303
HTTP/1.1 206 Partial Content
Server: nginx/1.13.2
Date: Fri, 09 Jun 2017 14:16:20 GMT
Content-Type: application/octet-stream
Content-Length: 4194304
Last-Modified: Fri, 09 Jun 2017 13:59:39 GMT
Connection: close
ETag: "593aa9cb-400"

4. This time request the whole object
curl -v  "http://127.0.0.1:8080/some_object; --header "Host: localhost" -o
/dev/null


​​
___
nginx-devel mailing list
nginx-devel@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-devel

Re: slice module and upstream sent more data than specified in "Content-Length"

2016-10-12 Thread Bjørnar Ness
2016-10-12 14:09 GMT+02:00 Roman Arutyunyan <a...@nginx.com>:
> Do you have this issue without slice?

No, if I send a the same request that slice module would send to
upstream through nginx
without slice activated, I do not see the same errors

> Anyway, it would be nice to see debug log

Working on it..

-- 
Bj(/)rnar

___
nginx-devel mailing list
nginx-devel@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-devel


Re: slice module and upstream sent more data than specified in "Content-Length"

2016-10-12 Thread Roman Arutyunyan
Hi,

On Tue, Oct 11, 2016 at 08:26:29PM +0200, Bjørnar Ness wrote:
> Hello nginx-devel
> 
> I am seeing lots of 'upstream sent more data than specified in
> "Content-Length"' errors
> when using nginx with proxy_cache and slice module. The relevant
> nginx.conf settings are:
> 
> 
> > slice 1m;
> > proxy_cache_lock on;
> > proxy_cache_key $uri$is_args$args$slice_range;
> > proxy_set_header Range $slice_range;
> > proxy_set_header Connection "";
> 
> I have tried debugging this with tcpdump and curl, and I dont see that
> upstream (also nginx) is
> not true to content-length header.
> 
> I have also tried playing aroung with buffering, but no success. Has
> anyone else experienced
> similar issues?

Do you have this issue without slice?

Anyway, it would be nice to see debug log

http://nginx.org/en/docs/debugging_log.html

-- 
Roman Arutyunyan

___
nginx-devel mailing list
nginx-devel@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-devel


RE: slice module and upstream sent more data than specified in "Content-Length"

2016-10-12 Thread MAGNIEN, Thierry
Hi,

Is your origin server something like Apache + mod_fastcgi + mod_deflate ?

I did not see this specifically with Nginx but you may hit the same issue 
described here: https://ma.ttias.be/apaches-mod_fastcgi-mod_deflate-troubles/

Best regards,
Thierry

-Message d'origine-
De : nginx-devel [mailto:nginx-devel-boun...@nginx.org] De la part de Bjørnar 
Ness
Envoyé : mardi 11 octobre 2016 20:26
À : nginx-devel@nginx.org
Objet : slice module and upstream sent more data than specified in 
"Content-Length"

Hello nginx-devel

I am seeing lots of 'upstream sent more data than specified in
"Content-Length"' errors
when using nginx with proxy_cache and slice module. The relevant
nginx.conf settings are:


> slice 1m;
> proxy_cache_lock on;
> proxy_cache_key $uri$is_args$args$slice_range;
> proxy_set_header Range $slice_range;
> proxy_set_header Connection "";

I have tried debugging this with tcpdump and curl, and I dont see that
upstream (also nginx) is
not true to content-length header.

I have also tried playing aroung with buffering, but no success. Has
anyone else experienced
similar issues?

-- 
Bj(/)rnar

___
nginx-devel mailing list
nginx-devel@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-devel

___
nginx-devel mailing list
nginx-devel@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-devel


Re: Slice module

2016-02-23 Thread Martijn Berkvens
Hi Roman,

> On 18 Feb 2016, at 18:14, Roman Arutyunyan <a...@nginx.com> wrote:
> 
> Hi Martijn,
> 
> On Wed, Feb 17, 2016 at 09:20:37AM +, Martijn Berkvens wrote:
>> Hi,
>> 
>> First off, thank you for the work on the slice module. We’re currently using 
>> a lua implementation to achieve something similar but this has its 
>> shortcomings and we would prefer to use this module. 
>> 
>> We’ve been testing this module and when using range requests it works as 
>> expected, but when doing normal requests (without a request range) the 
>> module still slices the content when the configured slice size is met 
>> resulting in corrupt data as it will only serve out the configured slice 
>> size and not the entire requested file.
> 
> Module slices all requests, whether they have Range header or not.
> This lets nginx reuse already cached slices.

This explains the behaviour I’m seeing then and there actually is no issue, it 
was my miss interpretation of how to implement it. I was doing something like 
this:

set $cachekey "$scheme$http_host$uri$is_args$args”;

if ($http_range)
{
set $cachekey “$cachekey $slice_range”;
}

slice 1m;
proxy_cache_key $cachekey;

After removing the unneeded if clause and just adding $slice_range to the 
cachekey for all requests everything worked as expected. Great to see that 
nginx reuses all slices to assemble a full file if requested.  

Thanks again for your work and apologies for the confusion. 

Martijn


> 
> Please describe in detail what exactly is corrupted and show your
> configuration.  Nothing should be corrupted when using the slice module, the
> entire file should be assembled of slices and sent to client once you
> configured nginx correctly.
> 
>> We run into these issues because a server or location configuration within 
>> nginx would service both normal requests as range requests and we have files 
>> exceeding the slice size in both cases. 
>> 
>> Ideally the slice module would only do its magic when a request contains 
>> $http_range. We’ve tried creating a map which would set the slice size to 0 
>> (to disable slicing) when no $http_range is present, but unfortunately the 
>> slice directive currently does not support variables. 
>> 
>> For our use case it would most likely be sufficient to add variable support 
>> to the slice directive. It is understood and acceptable that we would have 
>> duplicate cached content in cases where we have both the sliced versions of 
>> the file as the entire file. 
> 
> You can have that by adding another location for files cached as a whole
> and rewriting your request to that location when $http_range is empty.
> 
> -- 
> Roman Arutyunyan
> 
> ___
> nginx-devel mailing list
> nginx-devel@nginx.org
> http://mailman.nginx.org/mailman/listinfo/nginx-devel

___
nginx-devel mailing list
nginx-devel@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-devel

Re: Slice module

2016-02-18 Thread Roman Arutyunyan
Hi Martijn,

On Wed, Feb 17, 2016 at 09:20:37AM +, Martijn Berkvens wrote:
> Hi,
> 
> First off, thank you for the work on the slice module. We’re currently using 
> a lua implementation to achieve something similar but this has its 
> shortcomings and we would prefer to use this module. 
> 
> We’ve been testing this module and when using range requests it works as 
> expected, but when doing normal requests (without a request range) the module 
> still slices the content when the configured slice size is met resulting in 
> corrupt data as it will only serve out the configured slice size and not the 
> entire requested file.

Module slices all requests, whether they have Range header or not.
This lets nginx reuse already cached slices.

Please describe in detail what exactly is corrupted and show your
configuration.  Nothing should be corrupted when using the slice module, the
entire file should be assembled of slices and sent to client once you
configured nginx correctly.

> We run into these issues because a server or location configuration within 
> nginx would service both normal requests as range requests and we have files 
> exceeding the slice size in both cases. 
> 
> Ideally the slice module would only do its magic when a request contains 
> $http_range. We’ve tried creating a map which would set the slice size to 0 
> (to disable slicing) when no $http_range is present, but unfortunately the 
> slice directive currently does not support variables. 
> 
> For our use case it would most likely be sufficient to add variable support 
> to the slice directive. It is understood and acceptable that we would have 
> duplicate cached content in cases where we have both the sliced versions of 
> the file as the entire file. 

You can have that by adding another location for files cached as a whole
and rewriting your request to that location when $http_range is empty.

-- 
Roman Arutyunyan

___
nginx-devel mailing list
nginx-devel@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-devel

Re: Slice module

2016-02-17 Thread Martijn Berkvens
Hi,

First off, thank you for the work on the slice module. We’re currently using a 
lua implementation to achieve something similar but this has its shortcomings 
and we would prefer to use this module. 

We’ve been testing this module and when using range requests it works as 
expected, but when doing normal requests (without a request range) the module 
still slices the content when the configured slice size is met resulting in 
corrupt data as it will only serve out the configured slice size and not the 
entire requested file.
We run into these issues because a server or location configuration within 
nginx would service both normal requests as range requests and we have files 
exceeding the slice size in both cases. 

Ideally the slice module would only do its magic when a request contains 
$http_range. We’ve tried creating a map which would set the slice size to 0 (to 
disable slicing) when no $http_range is present, but unfortunately the slice 
directive currently does not support variables. 

For our use case it would most likely be sufficient to add variable support to 
the slice directive. It is understood and acceptable that we would have 
duplicate cached content in cases where we have both the sliced versions of the 
file as the entire file. 


Thanks again!

Regards,
Martijn



___
nginx-devel mailing list
nginx-devel@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-devel

[nginx] Added slice module to win32 builds.

2015-12-07 Thread Maxim Dounin
details:   http://hg.nginx.org/nginx/rev/3250a5783787
branches:  
changeset: 6318:3250a5783787
user:  Maxim Dounin <mdou...@mdounin.ru>
date:  Mon Dec 07 20:08:13 2015 +0300
description:
Added slice module to win32 builds.

diffstat:

 misc/GNUmakefile |  1 +
 1 files changed, 1 insertions(+), 0 deletions(-)

diffs (11 lines):

diff --git a/misc/GNUmakefile b/misc/GNUmakefile
--- a/misc/GNUmakefile
+++ b/misc/GNUmakefile
@@ -79,6 +79,7 @@ win32:
--with-http_auth_request_module \
--with-http_random_index_module \
--with-http_secure_link_module  \
+   --with-http_slice_module\
--with-mail \
--with-stream   \
--with-openssl=$(OBJS)/lib/$(OPENSSL)   \

___
nginx-devel mailing list
nginx-devel@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-devel


Re: Slice module

2015-10-05 Thread Woon Wai Keen

On 30/9/2015 12:00 AM, Roman Arutyunyan wrote:

Known issues


The module can lead to excessive memory and file handle usage.
Hi Roman, thanks for sharing. Under what circumstances will there be 
excessive memory and file handle usage?


___
nginx-devel mailing list
nginx-devel@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-devel


Re: Slice module

2015-10-05 Thread Roman Arutyunyan
Hello,

> On 05 Oct 2015, at 22:22, Woon Wai Keen  wrote:
> 
> On 30/9/2015 12:00 AM, Roman Arutyunyan wrote:
>> Known issues
>> 
>> 
>> The module can lead to excessive memory and file handle usage.
> Hi Roman, thanks for sharing. Under what circumstances will there be 
> excessive memory and file handle usage?

Memory and file descriptors allocated by each subrequest are mostly
freed only when the user request ends.  If you have small slice size,
that will lead to many subrequests each allocating some resources.

--
Roman Arutyunyan



___
nginx-devel mailing list
nginx-devel@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-devel


Re: Slice module

2015-10-02 Thread Anatoli Marinov
Thanks Roman! I tested it briefly and it looks good. Next days I think to
test it in limited production environment with high traffic load (~10Gb).

On Tue, Sep 29, 2015 at 7:00 PM, Roman Arutyunyan <a...@nginx.com> wrote:

> Hello,
>
> I'm happy to publish the experimental Slice module.  The module makes it
> possible to split a big upstream response into smaller parts and cache them
> independently.
>
> The module supports range requests.  When a part of a file is requested,
> only the required slice upstream requests are made.  If caching is enabled,
> future requests will only go to upstream for missing slices.
>
> The module adds
>
> - "slice" directive setting the slice size.
>
> - "$slice_range" variable, which must be added to the cache key
>   expression and passed to upstream as the Range header value.
>   The variable holds current slice range in the HTTP Range field format.
>
>
> Build
> -
>
> Use the --with-http_slice_module configure script option.
>
>
> Example
> ---
>
> location / {
> slice 1m;
>
> proxy_cache cache;
> proxy_cache_key $uri$is_args$args$slice_range;
> proxy_set_header Range $slice_range;
> proxy_cache_valid 200 206 1h;
> proxy_pass http://127.0.0.1:9000;
> }
>
>
> Known issues
> 
>
> The module can lead to excessive memory and file handle usage.
>
>
> Thanks for testing.
>
> --
> Best wishes,
> Roman Arutyunyan
>
> ___
> nginx-devel mailing list
> nginx-devel@nginx.org
> http://mailman.nginx.org/mailman/listinfo/nginx-devel
>
___
nginx-devel mailing list
nginx-devel@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-devel