如何建立一个OSRM服务器在Ubuntu 14.04

介绍

OpenStreetMap的项目包括原始地图数据,收集和成千上万的用户聚集的。 然而,其开放获取政策引发了一些抵押项目,其共同涵盖商业地图服务通常提供的许多功能。

在商业解决方案上使用基于OpenStreetMap的软件最明显的优势是经济的方便,因为OpenStreetMap是免费的(无论是啤酒还是语音)软件。 缺点是,它需要一些小的配置,以便设置一个工作的Web服务。

本教程涵盖Web服务的配置和维护,可回答以下问题:

  • 给定坐标对的最近的街道是什么?
  • 从A点到B点的最好方法是什么?
  • 从汽车或步行到A点到B点需要多长时间?

使这成为可能的软件被称为开源项目开源路由机(OSRM) ,这是基于OpenStreetMap的数据。 功能嵌入在网页中开放街道地图已经提供出的现成的API所等的OpenLayers

先决条件

要遵循本教程,您需要:

  • 一个Ubuntu 14.04 Droplet。
  • sudo的一个非root用户,您可以通过以下命令来创建这个教程 本教程假定你的sudo非root用户名是osrm
  • 推荐4 GB的交换空间,作为覆盖如何在Ubuntu 14.04添加交换

本教程中的一些操作(例如,从源代码构建OSRM和预处理阶段)是内存密集型。 在低内存Droplets上,这些操作可能会失败,这就是为什么必须分配一个交换文件。

Web服务运行时通常不需要额外的交换,因此可以在安装完成后删除此交换文件。 然而,当提供大地图时,一个小的交换文件可能实际上是必要的,特别是在低内存的Droplets。 如果是这样,请按照上述教程中的说明使交换文件持久化。

第1步 - 更新和安全

在此步骤中,我们将为服务器配置更新。

保持我们的服务器始终保持最新和安全是很重要的。 因此,我们首先通过运行以下命令升级系统中的所有软件包。

sudo apt-get update
sudo apt-get upgrade

然后,我们打开Ubuntu的无人值守安全升级。 为此,我们首先需要安装必要的软件包。

sudo apt-get install unattended-upgrades

接下来,编辑文件打开自动升级/etc/apt/apt.conf.d/10periodic 我们需要使用sudo ,因为这是一个系统级的配置文件。

sudo nano /etc/apt/apt.conf.d/10periodic

在文件末尾添加以下行,然后保存并关闭它。

APT::Periodic::Unattended-Upgrade "1";

第2步 - 下载地图导出

在这一步中,我们将选择并下载地图导出。

为了保持一切整洁和干净,最好创建一个专门的目录来构建代码,处理地图等。

mkdir osrm

移动到新目录。

cd osrm

我们的网络服务将基于从OpenStreetMap导出的地图。 有几种可能的方法来获取地图导出。

第一个选项是指将浏览器OpenStreetMap的出口页面 ,缩放的感兴趣区域,然后单击导出 (如果本机导出不起作用,您可能需要使用其他来源; Overpass API是一个不错的选择。)这将允许您精确选择要包含在地图中的哪些区域,一般来说,减少预处理时间。

但是,您可以从OSRM网站获得导出的大小有限制,因此您可能想要下载现成的导出。 提供多种服务,如GeofabrikMapzen提供更新,国家和选定的大都会地区的现成的地图出口,这是适合大多数用例。

无论使用哪种方法,复制导出的URL并将其下载到您的Droplet。

wget -O map.osm url_of_the_export

你现在应该有一个文件中命名map.osm在工作目录。

第3步 - 安装依赖关系

在这一步中,我们将安装OSRM的依赖项。

OSRM必须从源代码编译,所以我们首先需要安装必要的构建机器。 幸运的是,Ubuntu自带的称为方便元包build-essential ,其中包含所需的编译器工具链。 此外,我们需要git抢OSRM的源代码,并CMake生成构建系统。 以下命令将安装所有这3个。

sudo apt-get install build-essential git cmake

OSRM是一个相当复杂的软件,也依赖于一些库。 我们可以使用以下命令安装所需的依赖关系。

sudo apt-get install libboost-all-dev libtbb-dev liblua5.2-dev libluabind-dev libstxxl-dev libxml2 libxml2-dev libosmpbf-dev libbz2-dev libprotobuf-dev

这些依赖关系用于各种事情。 Lua用于定义自定义速度曲线脚本,例如在辅助道路上定义,在没有限制的情况下,汽车平均以80km / h行驶,并且在砾石路上平均速度为50km / h。 STXXL是C ++的标准库的一个版本,它使用磁盘空间作为内存,用于处理大型文件。 LibXML和协议缓冲区用于加载,写入和操作OSM文件,Boost和TBB用于并行化并表示数据结构。

第4步 - 编译OSRM

在这一步中,我们将获得OSRM的源代码并进行编译。

由于OSRM的构建系统的选择是CMake的事实,一旦安装了依赖项,生成构建文件和编译OSRM是相当容易的。

首先,我们克隆从项目的源代码 该项目由几个存储库组成,处理不同的功能。 我们对后端(服务器端部分)感兴趣。

git clone https://github.com/Project-OSRM/osrm-backend.git

接下来,移动到代码目录。

cd osrm-backend

下一步是使用CMake生成构建文件。 建议在专用建立OSRM build在源代码的根目录,以避免与临时构建文件污染源目录。

创建一个构建目录。

mkdir build

移动到构建目录。

cd build

最后,我们将生成具有生成文件cmake 这个命令会产生一批在目录下的Makefile文件的build目录树。

cmake ..

如果您在此处收到错误,请确保您已通过先决条件中的说明启用了交换。

接下来,编译并安装OSRM。

sudo make install

注意 :这可能需要5到10分钟。

与建筑sudo是必要的,因为在这里安装目标将在系统的二进制文件路径复制一些可执行文件,包括一些我们需要。 即:

  • osrm-extract可打开地图文件和运行在数据的第一预处理步骤。
  • osrm-prepare其处理的输出osrm-extract根据给定的Lua速度曲线边缘和计算的行进时间的所有地图。
  • osrm-routed实际的Web服务守护进程,这使我们能够查询距离和位置。

第5步 - 配置STXXL

在此步骤中,我们将为STXXL创建一个配置文件。

在运行Web服务之前,我们需要预处理我们的地图导出。 因为我们已经在系统路径中安装了所需的二进制文件,我们可以从任何地方做到这一点。 对于本教程的目的,我们会在根目录中的预处理osrm我们已经创建的目录。

首先,移动到osrm目录。

cd ~/osrm

地图预处理是相当内存密集型。 出于这个原因,OSRM使用称为库STXXL到其内部操作的硬盘上进行映射。 STXXL依赖于所谓的配置文件.stxxl ,它生活在同一个目录下,你正在运行的软件,以确定多少空间是专门为STXXL数据结构。 根据我们的Droplet的能力,并在我们希望处理地图的大小,我们需要写一个合适的.stxxl配置文件中,为操作分配足够的内存。

创建并打开.stxxl进行编辑。

nano .stxxl

该文件必须包含格式的单个线disk= path , capacity , access ,其中path是哪里的分配文件将被放置在路径, capacity是该文件的容量,并且access是一个文件访问的实现。

这里是一个的例子.stxxl文件。 您可以粘贴到.stxxl ,但可能要更改基于您正在使用的地图和你的Droplet的大小上的文件的大小。 请参阅文档的高级选项。

disk=/tmp/stxxl,10G,syscall

保存并关闭.stxxl

第6步 - 提取地图

在这一步中,我们将提取地图。

预处理的第一步是提取地图。 osrm-extract命令需要一个地图出口作为参数的路径,名义假定一个合适的速度曲线脚本存在profile.lua在工作目录。 速度曲线用于确定哪些可用的路线可以使用(例如,卡车的速度曲线可能禁止某些街道)。

该OSRM后端分布包括许多的下默认速度配置文件脚本profiles存储库的目录。 在本教程中,我们将使用car.lua配置文件,这是很好的大多数用例

因为速度配置文件脚本可能依赖于在配置文件库中定义的一些Lua函数,我们还通过运行以下两个命令在同一目录中创建一个指向它的符号链接。

ln -s osrm-backend/profiles/car.lua profile.lua
ln -s osrm-backend/profiles/lib

我们的地图的出口被称为map.osm ,所以接下来,运行:

osrm-extract map.osm

此步骤产生一堆在预处理目录中的文件,其中包括的map.osrm ,这是输入至下一步骤。

第7步 - 计算旅行时间

在此步骤中,我们将计算地图的行程时间。

的步骤是由进行osrm-prepare命令,该命令再次使用该速度分布脚本来计算行程时间的地图图形的各边缘。 为此,请运行以下命令。

osrm-prepare map.osrm

此步骤还会生成Web服务所需的一些其他文件,我们将在下一节中设置此文件。

第8步 - 运行并测试Web服务

在这一步中,我们将运行OSRM并通过浏览器测试它的工作原理。

该OSRM后端配备了最后的命令, osrm-routed ,可以读出处理地图和允许通过Web服务API查询它。 为了测试它,运行:

osrm-routed map.osrm

现在,通过在浏览器指向http:// your_server_ip :5000 ,你现在应该能够看到操作的Web服务。 它会显示类似的错误信息{"status_message":"Query string malformed close to position 0","status":400} ,因为你没有使用正确的查询格式。

作为测试,选择一组纬度和你的地图范围内经度坐标,然后转到下面的URL,替换latitudelongitude与您选择的坐标。

http://your_server_ip:5000/nearest?loc=latitude,longitude

您应该看到类似于以下的JSON输出:

{
    "name": "street_name",
    "mapped_coordinate": [
        latitude,
        longitude
    ],
    "status":0
}

如果您收到错误消息而不是此消息,则可能选择了地图边界外的一组坐标,否则查询语法可能会出错。 欲了解更多可用查询,检查了服务器API

现在,您可以停止osrm-routed使用CTRL+C

第9步 - 设置Nginx

在这一步中,将设置的Nginx一起工作osrm-routed

我们现在有一个工作的Web服务,但通过指定端口查询它是尴尬的。 此外,如果我们决定服务不同的地图或使用不同速度配置文件处理的地图,我们希望避免记住一组端口。

Nginx是一个高性能的Web服务器,它也可以作为一个代理,并作为我们的Web服务的网关。 设置它一起工作osrm-routed是相当容易的。

首先,我们安装Nginx。

sudo apt-get install nginx

接下来,我们为Web服务添加一个配置文件。 Nginx的用于其站点特定的配置文件两个目录: /etc/nginx/sites-available (可以提供所有的网站),并/etc/nginx/sites-enabled正在服务的所有网站)。 添加一个网站的标准方法是它的配置文件添加到sites-available ,然后象征性地链接它sites-enabled

因此,首先,我们将增加一个配置为FIME到OSRM sites-available

sudo nano /etc/nginx/sites-available/osrm.conf

我们的配置文件将定义一个upstream一个指向我们的Web服务和侦听端口80和重定向查询我们的上游的一个子集的服务器。

后续的配置文件成糊状osrm.conf 您将需要指定两个变量,强调如下:你的服务器IP和路径(这将被用来访问Web服务,如http:// your_server_ip / example_path )。

upstream osrm {
    server 0.0.0.0:5000;
}

server {
    listen 80;
    server_name your_server_ip;

    location /example_path {
        proxy_pass http://osrm/;
        proxy_set_header Host $http_host;
    }
}

一旦你已经保存的文件,移动到sites-enabled目录。

cd /etc/nginx/sites-enabled

然后,我们可以链接osrm.conf文件。

sudo ln -s /etc/nginx/sites-available/osrm.conf

接下来,重新加载配置。

sudo service nginx reload

最后,重启Nginx。

sudo service nginx restart

现在重新运行osrm-routed

osrm-routed ~/osrm/map.osrm

您应该能够通过我们的浏览器指向访问Web服务http:// your_server_ip / example_path 注意,您不再需要指定端口。 现在,您可以停止osrm-routed使用CTRL+C

通过增加更多的上行信和位置,并通过运行osrm-routed通过指定端口-p--port我们可以运行Web服务的多个实例,并将其绑定到不同的路径。 本教程将不会进入这个细节,但你可以检查出OSRM后端文档获取更多信息。

第10步 - 安装和配置Supervisor

在这一步中,我们将安装和配置Supervisor以保持Nginx运行,允许我们的Web服务通过重新启动可用。

Nginx现在充当我们的Web服务的网关。 但是,我们手动启动它,所以如果我们从系统注销,它将停止运行。 为了使我们的网络服务通过生存重新启动,并在一般情况下,使他们免受可能的故障中恢复,我们可以使用一个名为工具监事

主管是一个过程控制系统,主要负责保持服务正常运行。 设置它很容易。 首先,我们安装Supervisor本身。

sudo apt-get install supervisor

然后,我们通过添加一个新的配置文件将我们的Web服务添加到由Supervisor控制的服务池。

sudo nano /etc/supervisor/conf.d/osrm.conf

配置文件必须包含对于我们希望监控的每个Web服务的此表单的定义,并且对于每个Web服务,程序名称必须不同。

下面的配置粘贴到osrm.conf文件,然后保存并关闭它。

[program:osrm]
directory=/home/osrm/osrm
command=/usr/local/bin/osrm-routed -p 5000 map.osrm
user=osrm

这是什么配置说的是,我们希望用户osrm保留命令/usr/local/bin/osrm-routed -p 5000 map.osrm运行,而且它必须从指定的目录中运行, /home/osrm/osrm (这是我们如何可以指定map.osrm作为命令的相对路径)。 在这个例子中,我们指定的端口osrm-routed使用-p使得多个程序可以通过增加端口加入。

保存并关闭文件后,重新启动Supervisor。

sudo service supervisor restart

然后,我们可以通过运行以下操作来检查Web服务的状态:

sudo supervisorctl status

如果一切都很好,我们应该看到类似的东西

osrm          RUNNING    pid 12698, uptime 0:00:40

这意味着我们的Web服务正在运行。 因为上游指向端口5000,Nginx将能够在指定的路径上服务它。

结论

本教程convers的OSRM后端的安装,但进一步的文档,请访问这个页面

在撰写本文时,OSRM后端仍处于测试阶段,并且对单个查询中可以包含的位置数(目前为100,影响时间矩阵API)有一些硬编码限制。 这种限制可以被禁止,但有必要修改的源代码osrm-routed ,以便做到这一点。

根据地图的大小和你的Droplet的容量,则可能需要分配一个更大的交换文件或增加容量.stxxl配置文件,以使Web服务正常运行。 您可能需要测试一些配置,以查看哪些最适合您的设置。

赞(52) 打赏
未经允许不得转载:优客志 » 系统运维
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏