ngx_http_geo_module range overlaps

2014-01-04 Пенетрантность Ксения Юрьевна Блащук
Добрый день.
Возник вопрос по модулю ngx_http_geo_module. Почему-то нельзя внести
пересекающиеся диапазоны адресов. В документации:

A value of the most specific match is used. For example, for the 127.0.0.1
address the value RU will be chosen, not US.

Example with ranges:

geo $country {
ranges;
default   ZZ;
127.0.0.0-127.0.0.0   US;
127.0.0.1-127.0.0.1   RU;
127.0.0.1-127.0.0.255 US;
10.1.0.0-10.1.255.255 RU;
192.168.1.0-192.168.1.255 UK;
}

Пытаюсь воспроизвести этот пример:

/etc/init.d/nginx reload
 * Checking nginx' configuration ...
nginx: [emerg] range 127.0.0.1-127.0.0.255 overlaps 127.0.0.1-127.0.0.1
in /etc/nginx/sites/test-geo.conf:6
nginx: configuration file /etc/nginx/nginx.conf test failed
nginx: [emerg] range 127.0.0.1-127.0.0.255 overlaps 127.0.0.1-127.0.0.1
in /etc/nginx/sites/test-geo.conf:6
nginx: configuration file /etc/nginx/nginx.conf test failed

/etc/nginx/sites/test-geo.conf:
geo $country {
ranges;
default   ZZ;
127.0.0.0-127.0.0.0   US;
127.0.0.1-127.0.0.1   RU;
127.0.0.1-127.0.0.255 US;
10.1.0.0-10.1.255.255 RU;
192.168.1.0-192.168.1.255 UK;
}

 nginx -V
nginx version: nginx/1.4.4
configure arguments: --prefix=/usr --conf-path=/etc/nginx/nginx.conf
--error-log-path=/var/log/nginx/error_log --pid-path=/run/nginx.pid
--lock-path=/run/lock/nginx.lock --with-cc-opt=-I/usr/include
--with-ld-opt=-L/usr/lib --http-log-path=/var/log/nginx/access_log
--http-client-body-temp-path=//var/lib/nginx/tmp/client
--http-proxy-temp-path=//var/lib/nginx/tmp/proxy
--http-fastcgi-temp-path=//var/lib/nginx/tmp/fastcgi
--http-scgi-temp-path=//var/lib/nginx/tmp/scgi
--http-uwsgi-temp-path=//var/lib/nginx/tmp/uwsgi --with-file-aio
--with-aio_module --with-pcre --with-pcre-jit
--without-http_empty_gif_module --without-http_fastcgi_module
--without-http_map_module --without-http_memcached_module
--without-http_scgi_module --without-http_split_clients_module
--without-http_uwsgi_module --with-http_addition_module
--with-http_image_filter_module --with-http_mp4_module
--with-http_realip_module --with-http_secure_link_module
--with-http_stub_status_module
--add-module=/var/tmp/portage/www-servers/nginx-1.4.4/work/headers-more-nginx-module-0.22
--add-module=/var/tmp/portage/www-servers/nginx-1.4.4/work/ngx-fancyindex-0.3.2
--without-mail_imap_module --without-mail_pop3_module
--without-mail_smtp_module --user=nginx --group=nginx

Gentoo Base System release 2.2
 uname -a
Linux 3.0.78 #1 SMP Mon May 20 15:17:58 FET 2013 x86_64 Intel(R) Xeon(R)
CPU E5310 @ 1.60GHz GenuineIntel GNU/Linux


В чем может быть дело?
Спасибо.
___
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru

Re: ngx_http_geo_module range overlaps

2014-01-04 Пенетрантность Ксения Юрьевна Блащук
Да, спасибо, все так, но очень смутил пример в документации по модулю.
Hello!

On Sat, Jan 04, 2014 at 06:12:25PM +0400, Валентин Бартенев wrote:

 On Saturday 04 January 2014 15:01:16 Ксения Юрьевна Блащук wrote:
  Добрый день.
  Возник вопрос по модулю ngx_http_geo_module. Почему-то нельзя внести
  пересекающиеся диапазоны адресов. В документации:
 
  A value of the most specific match is used. For example, for the
127.0.0.1
  address the value RU will be chosen, not US.
 
  Example with ranges:
 
  geo $country {
  ranges;
  default   ZZ;
  127.0.0.0-127.0.0.0   US;
  127.0.0.1-127.0.0.1   RU;
  127.0.0.1-127.0.0.255 US;
  10.1.0.0-10.1.255.255 RU;
  192.168.1.0-192.168.1.255 UK;
  }
 
  Пытаюсь воспроизвести этот пример:
 
  /etc/init.d/nginx reload
   * Checking nginx' configuration ...
  nginx: [emerg] range 127.0.0.1-127.0.0.255 overlaps
127.0.0.1-127.0.0.1
  in /etc/nginx/sites/test-geo.conf:6
  nginx: configuration file /etc/nginx/nginx.conf test failed
  nginx: [emerg] range 127.0.0.1-127.0.0.255 overlaps
127.0.0.1-127.0.0.1
  in /etc/nginx/sites/test-geo.conf:6
  nginx: configuration file /etc/nginx/nginx.conf test failed
 
 [..]
 
  В чем может быть дело?
  Спасибо.

 Это баг в проверке конфигурации.

 Чтобы его обойти можете поменять местами так чтобы вначале шел больший
 диапазон:

 127.0.0.1-127.0.0.255 US;
 127.0.0.1-127.0.0.1   RU;

Это не баг, это фича.  Код не умеет обрабатывать добавления
диапазонов, перекрывающих уже существующие диапазоны, и честно об
этом сообщает.

При использовании range'ей последующими строками можно
переопределить часть ранее заданного диапазона адресов.  Задать
диапазон, который бы включал в себя ранее заданные диапазоны -
нельзя.

--
Maxim Dounin
http://nginx.org/

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

Re: ngx_http_geo_module range overlaps

2014-01-04 Пенетрантность Maxim Dounin
Hello!

On Sat, Jan 04, 2014 at 09:17:00PM +0300, Ксения Юрьевна Блащук wrote:

 Да, спасибо, все так, но очень смутил пример в документации по модулю.

Ну он неправильный, так иногда бывает. :)
Правильный, кстати, есть тут:

http://nginx.org/ru/docs/http/ngx_http_geo_module.html#geo

-- 
Maxim Dounin
http://nginx.org/

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

Re: ngx_http_geo_module range overlaps

2014-01-04 Пенетрантность Валентин Бартенев
On Saturday 04 January 2014 22:09:29 Maxim Dounin wrote:
 Hello!
 
 On Sat, Jan 04, 2014 at 06:12:25PM +0400, Валентин Бартенев wrote:
  On Saturday 04 January 2014 15:01:16 Ксения Юрьевна Блащук wrote:
   Добрый день.
   Возник вопрос по модулю ngx_http_geo_module. Почему-то нельзя внести
   пересекающиеся диапазоны адресов. В документации:
   
   A value of the most specific match is used. For example, for the
   127.0.0.1
   address the value RU will be chosen, not US.
   
   Example with ranges:
   
   geo $country {
   
   ranges;
   default   ZZ;
   127.0.0.0-127.0.0.0   US;
   127.0.0.1-127.0.0.1   RU;
   127.0.0.1-127.0.0.255 US;
   10.1.0.0-10.1.255.255 RU;
   192.168.1.0-192.168.1.255 UK;
   
   }
   
   Пытаюсь воспроизвести этот пример:
   
   /etc/init.d/nginx reload
   
* Checking nginx' configuration ...
   
   nginx: [emerg] range 127.0.0.1-127.0.0.255 overlaps
   127.0.0.1-127.0.0.1
   in /etc/nginx/sites/test-geo.conf:6
   nginx: configuration file /etc/nginx/nginx.conf test failed
   nginx: [emerg] range 127.0.0.1-127.0.0.255 overlaps
   127.0.0.1-127.0.0.1
   in /etc/nginx/sites/test-geo.conf:6
   nginx: configuration file /etc/nginx/nginx.conf test failed
  
  [..]
  
   В чем может быть дело?
   Спасибо.
  
  Это баг в проверке конфигурации.
  
  Чтобы его обойти можете поменять местами так чтобы вначале шел больший
  
  диапазон:
  127.0.0.1-127.0.0.255 US;
  127.0.0.1-127.0.0.1   RU;
 
 Это не баг, это фича.  Код не умеет обрабатывать добавления
 диапазонов, перекрывающих уже существующие диапазоны, и честно об
 этом сообщает.
 
 При использовании range'ей последующими строками можно
 переопределить часть ранее заданного диапазона адресов.  Задать
 диапазон, который бы включал в себя ранее заданные диапазоны -
 нельзя.

Фича, как известно, это задокументированная бага, а в данном же случае
было не так. =)

Можно и научить:

diff -r b1db6dda3f83 src/http/modules/ngx_http_geo_module.c
--- a/src/http/modules/ngx_http_geo_module.cSat Jan 04 18:48:25 2014 +0400
+++ b/src/http/modules/ngx_http_geo_module.cSat Jan 04 22:48:11 2014 +0400
@@ -798,10 +798,22 @@ ngx_http_geo_add_range(ngx_conf_t *cf, n
 
 i--;
 
+if (s  (ngx_uint_t) range[i].start
+ e == (ngx_uint_t) range[i].end)
+{
+e = range[i].start - 1;
+}
+
 if (e  (ngx_uint_t) range[i].start) {
 continue;
 }
 
+if (s == (ngx_uint_t) range[i].start
+ e  (ngx_uint_t) range[i].end)
+{
+s = range[i].end + 1;
+}
+
 if (s  (ngx_uint_t) range[i].end) {
 
 /* add after the range */
@@ -835,6 +847,30 @@ ngx_http_geo_add_range(ngx_conf_t *cf, n
 goto next;
 }
 
+if (s  (ngx_uint_t) range[i].start
+ e  (ngx_uint_t) range[i].end)
+{
+/* split the new range and insert a fragment after */
+
+range = ngx_array_push(a);
+if (range == NULL) {
+return NGX_CONF_ERROR;
+}
+
+range = a-elts;
+
+ngx_memmove(range[i + 2], range[i + 1],
+   (a-nelts - 2 - i) * sizeof(ngx_http_geo_range_t));
+
+range[i + 1].start = range[i].end + 1;
+range[i + 1].end = (u_short) e;
+range[i + 1].value = ctx-value;
+
+e = range[i].start - 1;
+
+continue;
+}
+
 if (s  (ngx_uint_t) range[i].start
  e  (ngx_uint_t) range[i].end)
 {


Хотя проще видимо задокументировать.

--
Валентин Бартенев
___
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru

Re: ngx_http_geo_module range overlaps

2014-01-04 Пенетрантность Igor Sysoev
04.01.2014, в 23:03, Валентин Бартенев vb...@nginx.com написал(а):

 On Saturday 04 January 2014 22:09:29 Maxim Dounin wrote:
 Hello!
 
 On Sat, Jan 04, 2014 at 06:12:25PM +0400, Валентин Бартенев wrote:
 On Saturday 04 January 2014 15:01:16 Ксения Юрьевна Блащук wrote:
 Добрый день.
 Возник вопрос по модулю ngx_http_geo_module. Почему-то нельзя внести
 пересекающиеся диапазоны адресов. В документации:
 
 A value of the most specific match is used. For example, for the
 127.0.0.1
 address the value RU will be chosen, not US.
 
 Example with ranges:
 
 geo $country {
 
ranges;
default   ZZ;
127.0.0.0-127.0.0.0   US;
127.0.0.1-127.0.0.1   RU;
127.0.0.1-127.0.0.255 US;
10.1.0.0-10.1.255.255 RU;
192.168.1.0-192.168.1.255 UK;
 
 }
 
 Пытаюсь воспроизвести этот пример:
 
 /etc/init.d/nginx reload
 
 * Checking nginx' configuration ...
 
 nginx: [emerg] range 127.0.0.1-127.0.0.255 overlaps
 127.0.0.1-127.0.0.1
 in /etc/nginx/sites/test-geo.conf:6
 nginx: configuration file /etc/nginx/nginx.conf test failed
 nginx: [emerg] range 127.0.0.1-127.0.0.255 overlaps
 127.0.0.1-127.0.0.1
 in /etc/nginx/sites/test-geo.conf:6
 nginx: configuration file /etc/nginx/nginx.conf test failed
 
 [..]
 
 В чем может быть дело?
 Спасибо.
 
 Это баг в проверке конфигурации.
 
 Чтобы его обойти можете поменять местами так чтобы вначале шел больший
 
 диапазон:
127.0.0.1-127.0.0.255 US;
127.0.0.1-127.0.0.1   RU;
 
 Это не баг, это фича.  Код не умеет обрабатывать добавления
 диапазонов, перекрывающих уже существующие диапазоны, и честно об
 этом сообщает.
 
 При использовании range'ей последующими строками можно
 переопределить часть ранее заданного диапазона адресов.  Задать
 диапазон, который бы включал в себя ранее заданные диапазоны -
 нельзя.
 
 Фича, как известно, это задокументированная бага, а в данном же случае
 было не так. =)
 
 Можно и научить:

Нет, учить не надо. Изначально предполагался контроль данных с возможностью 
последующего оверрайда некоторых диапазонов.


-- 
Igor Sysoev
___
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru

Re: ngx_http_geo_module range overlaps

2014-01-04 Пенетрантность Maxim Dounin
Hello!

On Sat, Jan 04, 2014 at 11:03:04PM +0400, Валентин Бартенев wrote:

 On Saturday 04 January 2014 22:09:29 Maxim Dounin wrote:
  Hello!
  
  On Sat, Jan 04, 2014 at 06:12:25PM +0400, Валентин Бартенев wrote:
   On Saturday 04 January 2014 15:01:16 Ксения Юрьевна Блащук wrote:
Добрый день.
Возник вопрос по модулю ngx_http_geo_module. Почему-то нельзя внести
пересекающиеся диапазоны адресов. В документации:

A value of the most specific match is used. For example, for the
127.0.0.1
address the value RU will be chosen, not US.

Example with ranges:

geo $country {

ranges;
default   ZZ;
127.0.0.0-127.0.0.0   US;
127.0.0.1-127.0.0.1   RU;
127.0.0.1-127.0.0.255 US;
10.1.0.0-10.1.255.255 RU;
192.168.1.0-192.168.1.255 UK;

}

Пытаюсь воспроизвести этот пример:

/etc/init.d/nginx reload

 * Checking nginx' configuration ...

nginx: [emerg] range 127.0.0.1-127.0.0.255 overlaps
127.0.0.1-127.0.0.1
in /etc/nginx/sites/test-geo.conf:6
nginx: configuration file /etc/nginx/nginx.conf test failed
nginx: [emerg] range 127.0.0.1-127.0.0.255 overlaps
127.0.0.1-127.0.0.1
in /etc/nginx/sites/test-geo.conf:6
nginx: configuration file /etc/nginx/nginx.conf test failed
   
   [..]
   
В чем может быть дело?
Спасибо.
   
   Это баг в проверке конфигурации.
   
   Чтобы его обойти можете поменять местами так чтобы вначале шел больший
   
   диапазон:
   127.0.0.1-127.0.0.255 US;
   127.0.0.1-127.0.0.1   RU;
  
  Это не баг, это фича.  Код не умеет обрабатывать добавления
  диапазонов, перекрывающих уже существующие диапазоны, и честно об
  этом сообщает.
  
  При использовании range'ей последующими строками можно
  переопределить часть ранее заданного диапазона адресов.  Задать
  диапазон, который бы включал в себя ранее заданные диапазоны -
  нельзя.
 
 Фича, как известно, это задокументированная бага, а в данном же случае
 было не так. =)

В данном случае это не бага, да.  :)

 Можно и научить:

[...]

Так - будет неправильно, т.к. в результате ты не знаешь, какой 
диапазон более специфичен.  Пример:

   127.0.0.1-127.0.0.2  US;
   127.0.0.1-127.0.0.3  RU;
   127.0.0.3-127.0.0.4  UA;

Для 127.0.0.3 должен быть результат UA (т.к. диапазон 
127.0.0.3-127.0.0.4 наиболее специфичен), с твоим же патчем 
получается RU.

Ну и в целом по вопросу Игорь уже высказался.

-- 
Maxim Dounin
http://nginx.org/

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