在 Ubuntu 20.04 上设置 OSM Nominatim Geocoding Server

在之前的教程中,我解释了在 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

请注意,您应该打开 fsyncfull_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