在之前的教程中,我解释了在 Ubuntu 20.04 上构建自己的 OSM tile 服务器的过程。 本教程将向您展示如何在 Ubuntu 20.04 上设置 Nominatim Geocoding 服务器。 Nominatim 为 OpenStreetMap 提供搜索功能,因此如果访问者在搜索框中输入地址,将返回该地址的纬度/经度位置。
笔记: 如果您要为整个星球设置 Nominatim,那么您应该为 Nominatim 启动另一台服务器,因为它还需要 64GB RAM 和 1TB SSD。
第 1 步:从源代码构建 Nominatim
安装依赖包来构建 Nominatim。
sudo apt update sudo apt install build-essential cmake g++ libboost-dev libboost-system-dev libboost-filesystem-dev libexpat1-dev zlib1g-dev libbz2-dev libpq-dev libproj-dev apache2 php php-pgsql libapache2-mod-php php-intl php-cgi phpunit php-codesniffer python3-setuptools python3-dev python3-pip python3-psycopg2 python3-tidylib python3-behave python-pytest pylint git clang-tidy postgresql-server-dev-12
创建 nominatim
用户。 (无需为此用户创建密码。)
sudo useradd -d /srv/nominatim -s /bin/bash -m nominatim
更改为 /srv/nominatim/
目录。
cd /srv/nominatim/
向您自己的用户帐户授予权限。
sudo apt install acl sudo setfacl -R -m u:username:rwx /srv/nominatim/
从官方网站下载 Nominatim。
wget https://nominatim.org/release/Nominatim-3.5.1.tar.bz2
提取压缩包。
tar xvf Nominatim-3.5.1.tar.bz2
创建 build
目录。
mkdir build
切换到此目录并配置构建环境。
cd build cmake /srv/nominatim/Nominatim-3.5.1
编译源代码。
make
第 2 步:配置 Nominatim
Nominatim 的默认配置文件是 /srv/nominatim/build/settings/settings.php
. 我们可以创建一个 local.php
文件并在那里添加我们的修改。
sudo nano /srv/nominatim/build/settings/local.php
在文件中添加以下几行。
<?php @define('CONST_Website_BaseURL', '/nominatim/'); @define('CONST_Default_Lat', 55.0); @define('CONST_Default_Lon', 1.0); @define('CONST_Default_Zoom', 6); @define('CONST_Map_Tile_URL', 'https://tile.linuxbabe.com/osm/{z}/{x}/{y}.png');
上面的配置定义了
- Nominatim 实例相对于您的切片服务器的路径。
- 默认纬度、经度和缩放级别。
- OSM 磁贴服务器的 URL。 默认情况下,Nominatim 使用公共
https://tile.openstreetmap.org
瓷砖服务器。 在这里我使用我自己的磁贴服务器。
你也可以看看 /srv/nominatim/build/settings/settings.php
文件并在需要时添加您自己的自定义。 例如,如果您要导入一个大型数据集(欧洲、北美、行星等),那么启用节点位置的平面节点存储是一个很好的做法,因此节点坐标将存储在一个简单的文件中,而不是数据库,节省您的导入时间和磁盘存储空间。
@define('CONST_Osm2pgsql_Flatnode_File', '/srv/nominatim/flatnode.file');
Save 和 close 文件。
第 3 步:安装和配置 PostgreSQL
笔记: 如果OSM tile server和Nominatim安装在同一台服务器上,那么你可以跳过这一步,因为你在设置OSM tile server的时候已经做过了。
我们将使用 PostgreSQL 来存储地图数据。 PostGIS 是 PostgreSQL 的地理空间扩展。 运行以下命令来安装它们。
sudo apt install postgresql postgresql-contrib postgis postgresql-12-postgis-3
然后我们需要调整 PostgreSQL 以获得最大性能。 编辑主配置文件。
sudo nano /etc/postgresql/12/main/postgresql.conf
在此文件中找到以下参数并使用以下值。
shared_buffers = 15GB work_mem = 1GB maintenance_work_mem = 10GB effective_cache_size = 24GB synchronous_commit = off max_wal_size = 1GB checkpoint_timeout = 10min checkpoint_completion_target = 0.9 fsync = off full_page_writes = off
Save 和 close 文件。 重新启动 PostgreSQL 以使更改生效。
sudo systemctl restart postgresql
请注意,您应该打开 fsync
和 full_page_write
导入 OSM 数据库后,否则您可能会损坏数据库。
默认情况下,PostgreSQL 会尝试在 RAM 中使用大页面。 但是,Linux 默认情况下不分配大页面。 检查 PostgreSQL 的进程 ID。
sudo head -1 /var/lib/postgresql/12/main/postmaster.pid
示例输出:
7031
然后检查这个进程ID的VmPeak值。
grep ^VmPeak /proc/7031/status
示例输出:
VmPeak: 16282784 kB
这是 PostgreSQL 将使用的峰值内存大小。 现在检查 Linux 中大页面的大小。
cat /proc/meminfo | grep -i huge
示例输出:
AnonHugePages: 0 kB ShmemHugePages: 0 kB HugePages_Total: 0 HugePages_Free: 0 HugePages_Rsvd: 0 HugePages_Surp: 0 Hugepagesize: 2048 kB Hugetlb: 0 kB
我们可以计算出我们需要多少大页面。 将 VmPeak 值除以大页面的大小:16282784 kB / 2048 kB = 7950。编辑 /etc/sysctl.conf
文件。
sudo nano /etc/sysctl.conf
添加以下行以分配 7950 个大页面。
vm.nr_hugepages = 7950
Save 和 close 文件。 然后应用更改。
sudo sysctl -p
如果你再次查看 meminfo,
cat /proc/meminfo | grep -i huge
我们可以看到有 7950 个大页面可用。
AnonHugePages: 0 kB ShmemHugePages: 0 kB HugePages_Total: 7950 HugePages_Free: 7950 HugePages_Rsvd: 0 HugePages_Surp: 0 Hugepagesize: 2048 kB
重启 PostgreSQL 以使用大页面。
sudo systemctl restart postgresql
步骤 4:导入 OSM 数据库
下载维基百科重要性转储文件,这将提高 Nomiatim 搜索结果的质量。
cd /srv/nominatim/Nominatim-3.5.1/data wget https://www.nominatim.org/data/wikimedia-importance.sql.gz
下载美国和英国的邮政编码数据。
wget https://www.nominatim.org/data/us_postcode_data.sql.gz wget https://www.nominatim.org/data/gb_postcode_data.sql.gz
下载国家代码数据文件。
wget -O country_osm_grid.sql.gz https://www.nominatim.org/data/country_grid.sql.gz
然后您需要下载一个 OSM 文件并将其导入 PostgreSQL。 你可以去 https://download.geofabrik.de 下载你需要的提取物。 您还可以在切片服务器设置过程中使用 PBF 文件。
创建 www-data
PostgreSQL 中的用户,因此 Web 服务器将具有对数据库的只读访问权限。
sudo -u postgres createuser www-data
授予权限 postgres
用户。
sudo setfacl -R -m u:postgres:rwx /srv/nominatim/
切换到 postgres
用户。
sudo -u postgres -i
并运行以下命令将 OSM 数据提取导入 PostgreSQL。
cd /srv/nominatim/build/ /srv/nominatim/build/utils/setup.php --osm-file /home/osm/great-britain-latest.osm.pbf --all 2>&1 | tee setup.log