Docker部署Nominatim遇“Illegal query string”及函数创建失败求助
解决Docker部署Nominatim时的函数与查询日志错误
问题场景
使用指定Docker镜像部署Nominatim后,发起查询请求时返回Bad Request,提示“Illegal query string (not an UTF-8 string)”,同时控制台输出多条数据库错误:
ERROR: relation "query_log" does not exist at character 13 STATEMENT: insert into query_log values ('2018-05-23 15:25:03.9961','paderborn','172.18.0.1') ERROR: relation "new_query_log" does not exist at character 13 STATEMENT: insert into new_query_log (type,starttime,query,ipaddress,useragent,language,format) values ('search','2018-05-23 15:25:03.9961','q=paderborn&polygon=1&viewbox=','172.18.0.1','Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.0','short_name:de,short_name:en-US,short_name:en,name:de,name:en-US,name:en,place_name:de,place_name:en-US,place_name:en,official_name:de,official_name:en-US,official_name:en,short_name,name,place_name,official_name,ref,type','') ERROR: function make_standard_name(unknown) does not exist at character 8 HINT: No function matches the given name and argument types. You might need to add explicit type casts. STATEMENT: select make_standard_name('paderborn') as string
尝试运行初始化命令修复时,又报错无法访问nominatim.so文件(但该文件实际存在):
./utils/setup.php --create-functions --enable-diff-updates
Functions CREATE FUNCTION ERROR: could not access file "/app/module/nominatim.so": No such file or directory
分步解决方案
1. 进入容器内部执行操作
先进入运行中的Nominatim容器,所有后续操作都在容器内完成:
docker exec -it <你的容器名称或ID> bash
2. 修复PostgreSQL扩展加载问题
PostgreSQL无法找到nominatim.so通常是权限或扩展配置问题,先进入PostgreSQL命令行手动加载扩展:
psql -d nominatim -U nominatim
在psql交互界面中执行:
CREATE EXTENSION IF NOT EXISTS nominatim;
如果没有报错,说明扩展加载成功,输入\q退出psql。
3. 完整初始化函数与表
之前的初始化命令缺少创建表的参数,切换到Nominatim工作目录,以postgres用户完整执行初始化:
cd /app su postgres -c "./utils/setup.php --create-functions --create-tables --enable-diff-updates"
这条命令会同时创建缺失的查询日志表和所需的数据库函数,解决之前的表不存在和函数找不到的问题。
4. 确保nominatim.so权限正确
即便文件存在,PostgreSQL进程可能没有读取权限,执行以下命令调整权限:
chmod 644 /app/module/nominatim.so chown postgres:postgres /app/module/nominatim.so
5. 重启容器生效
完成所有操作后,重启容器确保配置和初始化生效:
docker restart <你的容器名称或ID>
6. 验证修复效果
重启后再次发起查询请求,检查是否返回正常结果,同时查看控制台日志确认没有新的数据库错误。
内容的提问来源于stack exchange,提问作者Markus Benter
相关产品推荐
相关产品推荐

