ngx_http_geo_module range overlaps
Добрый день. Возник вопрос по модулю 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
Да, спасибо, все так, но очень смутил пример в документации по модулю. 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
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
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
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
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