nginx 1.11.5 'duplicate' map_hash_bucket_size error when geoip_country block used?

Maxim Dounin mdounin at mdounin.ru
Mon Oct 24 12:20:34 UTC 2016


Hello!

On Sat, Oct 22, 2016 at 09:30:21AM -0700, lists at ssl-mail.com wrote:

> I have a working nginx/1.11.5 instance, with this in config
> 
> 		...
> 		http(
> 			...
> 	134		map_hash_bucket_size 4096;
> 
> 			...
> 		)
> 		...
> 
> when I add geoip blocking
> 
> 		...
> 		http (
> 	+		geoip_country /var/lib/GeoIP/GeoIP.dat;
> 	+		map $geoip_country_code $allowed_country {
> 	+			default yes;
> 	+			XX no; # some country
> 				...
> 	134			map_hash_bucket_size 4096;
> 
> 				...
> 		)
> 		...
> 
> config check now reports
> 
> 	nginx: [emerg] "map_hash_bucket_size" directive is duplicate in /etc/nginx/nginx.conf:134
> 
> simply commenting out
> 
> 	-	map_hash_bucket_size 4096;
> 	+	#map_hash_bucket_size 4096;
> 
> fixes the config error.
> 
> Why can't 'map_hash_bucket_size' be set in the presence of the geoip_country snippet?
> 
> Config error? Bug? other?

It's not relevant to geoip_country, but rather to the map{} block 
before the map_hash_bucket_size directive.  Something like

    map $uri $foo {}
    map_hash_bucket_size 4096;

is enough to trigger the error, as the map{} block requires some 
hash bucket size to be set.  And if it is not set when parsing a 
map{} block, it is automatically configures bucket size to a 
default value.  An attempt to redefine bucket size later will 
trigger the error, and this is what happens with the above 
configuration.

The message is a bit misleading in this particular situation 
as it is a generic one.  Though the fact that the configuration is 
rejected is correct: nginx can't use the value specified in the 
map_hash_bucket_size directive, and hence it is expected to reject 
the configuration.

An obvious solution would be to specify map_hash_bucket_size 
before the map{} block, i.e.:

    map_hash_bucket_size 4096;
    map $uri $foo {}

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



More information about the nginx mailing list