Ubuntu14.04でOSRMサーバーをセットアップする方法

提供:Dev Guides
移動先:案内検索

序章

OpenStreetMap プロジェクトは、何千人ものユーザーによって収集および集約された生の地図データで構成されています。 しかし、そのオープンアクセスポリシーは、商用マッピングサービスによって通常提供される機能の多くをまとめてカバーする多くの担保プロジェクトを引き起こしました。

OpenStreetMapは無料(ビールとスピーチの両方)のソフトウェアで提供されるため、商用ソリューションよりもOpenStreetMapベースのソフトウェアを使用することの最も明らかな利点は経済的な利便性です。 欠点は、機能するWebサービスをセットアップするために少し構成が必要なことです。

このチュートリアルでは、次のような質問に答えることができるWebサービスの構成と保守について説明します。

  • 与えられた座標のペアに最も近い通りは何ですか?
  • ポイントAからポイントBに移動するための最良の方法は何ですか?
  • A地点からB地点まで車で、または徒歩で行くのにどれくらい時間がかかりますか?

これを可能にするソフトウェアは、OpenStreetMapデータに基づく Open Source Routing Machine(OSRM)と呼ばれるオープンソースプロジェクトです。 OpenStreetMapsをWebページに埋め込む機能は、OpenLayersなどのAPIによってすぐに利用できるようになっています。

前提条件

このチュートリアルに従うには、次のものが必要です。

  • Ubuntu14.04ドロップレット。
  • このチュートリアルに従って作成できるsudo非rootユーザー。 このチュートリアルでは、sudoの非rootユーザー名がosrmであることを前提としています。
  • Ubuntu 14.04 でスワップを追加する方法で説明されているように、推奨される4ギガバイトのスワップ。

ソースからのOSRMの構築や前処理フェーズなど、このチュートリアルの一部の操作は、メモリを大量に消費します。 メモリの少ないドロップレットでは、これらの操作が失敗する可能性があるため、スワップファイルを割り当てる必要があります。

Webサービスは通常、実行中に追加のスワップを必要としないため、セットアップの完了後にこのスワップファイルを削除できます。 ただし、大きなマップを提供する場合、特にメモリの少ないドロップレットでは、実際には小さなスワップファイルが必要になる場合があります。 その場合は、上記のチュートリアルの手順に従って、スワップファイルを永続的にしてください。

ステップ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

私たちのWebサービスは、OpenStreetMapからの地図のエクスポートに基づいています。 マップのエクスポートを取得するには、いくつかの方法があります。

最初のオプションは、ブラウザでOpenStreetMapのエクスポートページをポイントし、関心のある領域を拡大して、エクスポートをクリックすることです。 (ネイティブエクスポートが機能しない場合は、他のソースの1つを使用する必要がある場合があります。OverpassAPIが適切な選択です。)これにより、マップに含める領域を細かく選択し、一般に削減することができます。前処理時間。

ただし、OSRM Webサイトから取得できるエクスポートのサイズには制限があるため、既製のエクスポートをダウンロードすることをお勧めします。 GeofabrikMapzenなどの多くのサービスは、ほとんどのユースケースに適した国や選択された大都市圏の更新された既製の地図のエクスポートを提供します。

どちらの方法を使用する場合でも、エクスポートのURLをコピーして、ドロップレットにダウンロードします。

wget -O map.osm url_of_the_export

これで、作業ディレクトリにmap.osmという名前のファイルが作成されます。

ステップ3—依存関係をインストールする

このステップでは、OSRMの依存関係をインストールします。

OSRMはソースからコンパイルする必要があるため、最初に必要なビルド機構をインストールする必要があります。 幸い、Ubuntuにはbuild-essentialと呼ばれる便利なメタパッケージが付属しており、必要なコンパイラツールチェーンが含まれています。 さらに、OSRMソースコードを取得するにはgitが必要であり、ビルドシステムを生成するには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は、カスタム速度プロファイルスクリプトを定義するために使用されます。 二次道路では、制限がない場合、車は平均時速80 kmで走行し、砂利道では平均速度は時速50kmであると定義されています。 STXXLは、大きなファイルを操作するために使用されるメモリとしてディスク領域を使用するC++の標準ライブラリのバージョンです。 LibXMLおよびProtocolバッファーは、OSMファイルのロード、書き込み、および操作に使用され、BoostおよびTBBは、並列化およびデータ構造の表現に使用されます。

ステップ4—OSRMをコンパイルします

このステップでは、OSRMのソースコードを取得してコンパイルします。

選択したOSRMのビルドシステムがCMakeであるという事実のおかげで、依存関係がインストールされると、ビルドファイルの生成とOSRMのコンパイルがかなり簡単になります。

まず、プロジェクトのページからソースコードのクローンを作成します。 プロジェクトはいくつかのリポジトリで構成され、さまざまな機能を処理します。 バックエンド(サーバー側の部分)に関心があります。

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

次に、コードディレクトリに移動します。

cd osrm-backend

次のステップは、CMakeを使用してビルドファイルを生成することです。 ソースディレクトリが一時的なビルドファイルで汚染されないように、ソースコードルートの専用のbuildディレクトリにOSRMをビルドすることをお勧めします。

ビルドディレクトリを作成します。

mkdir build

ビルドディレクトリに移動します。

cd build

最後に、cmakeを使用してビルドファイルを生成します。 このコマンドは、buildディレクトリツリーにいくつかのディレクトリとMakefileを生成します。

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データ構造専用のスペースを決定します。 ドロップレットの容量と処理するマップのサイズに応じて、適切な.stxxl構成ファイルを作成し、操作に十分なメモリを割り当てる必要があります。

.stxxlを作成して開き、編集します。

nano .stxxl

ファイルには、disk=path,capacity,access形式の1行が含まれている必要があります。ここで、pathは割り当てファイルが配置されるパス、capacityはファイルの容量、[X172X ]はファイルアクセスの実装です。

.stxxlファイルの例を次に示します。 これを.stxxlに貼り付けることができますが、使用しているマップとドロップレットのサイズに基づいてファイルのサイズを変更したい場合があります。 詳細オプションについては、ドキュメントを参照してください。

disk=/tmp/stxxl,10G,syscall

.stxxlを保存して閉じます。

ステップ6—マップを抽出する

このステップでは、マップを抽出します。

前処理の最初のステップは、マップの抽出です。 osrm-extractコマンドは、マップエクスポートのパスを引数として想定し、作業ディレクトリにprofile.luaという名前の適切な速度プロファイルスクリプトが存在することを前提としています。 速度プロファイルは、使用可能なルートのどれを使用できるかを判断するために使用されます(たとえば、トラックの速度プロファイルは一部の道路を禁止している場合があります)。

OSRMバックエンドディストリビューションには、リポジトリのprofilesディレクトリの下にいくつかのデフォルトの速度プロファイルスクリプトが含まれています。 このチュートリアルでは、car.luaプロファイルを使用します。これはほとんどのユースケースに適しています

速度プロファイルスクリプトは、プロファイルライブラリで定義されている一部のLua関数に依存する可能性があるため、次の2つのコマンドを実行して、同じディレクトリにそのスクリプトへのシンボリックリンクも作成します。

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を確認してください。

CTRL+Cを使用してosrm-routedを停止できるようになりました。

ステップ9—Nginxを設定する

このステップでは、osrm-routedで動作するようにNginxを設定します。

これでWebサービスが機能するようになりましたが、ポートを指定してクエリを実行するのは面倒です。 さらに、さまざまなマップまたはさまざまな速度プロファイルで処理されたマップを提供することにした場合、ポートのコレクションを覚えておく必要はありません。

Nginxは、プロキシとしても機能し、Webサービスのゲートウェイとしても機能する高性能Webサーバーです。 osrm-routedで動作するように設定するのはかなり簡単です。

まず、Nginxをインストールします。

sudo apt-get install nginx

次に、Webサービスの構成ファイルを追加します。 Nginxは、サイト固有の構成ファイルに/etc/nginx/sites-available(提供可能なすべてのサイト)と/etc/nginx/sites-enabled(提供されるすべてのサイト)の2つのディレクトリを使用します。 サイトを追加する標準的な方法は、その構成ファイルをsites-availableに追加し、それをsites-enabledでシンボリックにリンクすることです。

したがって、最初に、OSRMの構成フレームをsites-availableに追加します。

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

構成ファイルは、Webサービスを指すupstreamと、ポート80でリッスンし、クエリのサブセットをアップストリームにリダイレクトするサーバーを定義します。

以下の設定ファイルをosrm.confに貼り付けます。 以下で強調表示されている2つの変数を指定する必要があります。サーバーのIPとパス(http://your_server_ip/example_pathのようにWebサービスへのアクセスに使用されます)。

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

ブラウザでhttp://your_server_ip/example_pathを指定すると、Webサービスにアクセスできるはずです。 ポートを指定する必要がなくなったことに注意してください。 CTRL+Cを使用してosrm-routedを停止できるようになりました。

アップストリームと場所を追加し、osrm-routedを実行して-pまたは--portでポートを指定することにより、Webサービスのインスタンスをさらに実行し、それらを異なるパスにバインドできます。 。 このチュートリアルではこれについて詳しくは説明しませんが、詳細についてはOSRMバックエンドのドキュメントを確認してください。

ステップ10—スーパーバイザーのインストールと構成

このステップでは、Nginxを実行し続けるようにSupervisorをインストールして構成し、再起動してもWebサービスを利用できるようにします。

Nginxは、Webサービスのゲートウェイとして機能するようになりました。 ただし、手動で開始したため、システムからログアウトすると実行が停止します。 再起動後もWebサービスを存続させ、一般に、起こりうる障害からWebサービスを回復させるために、スーパーバイザーと呼ばれるツールを使用できます。

スーパーバイザーは、サービスを適切に実行し続けることを主に処理するプロセス制御システムです。 設定はとても簡単です。 まず、Supervisor自体をインストールします。

sudo apt-get install supervisor

次に、新しい構成ファイルを追加することにより、Supervisorによって制御されるサービスのプールにWebサービスを追加します。

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を指定できます)。 この例では、-pを使用してosrm-routedのポートを指定し、ポートを増やすことで複数のプログラムを追加できるようにしました。

ファイルを保存して閉じたら、Supervisorを再起動します。

sudo service supervisor restart

次に、以下を実行してWebサービスのステータスを確認できます。

sudo supervisorctl status

すべてがうまくいけば、これに似たものが表示されるはずです

osrm          RUNNING    pid 12698, uptime 0:00:40

これは、Webサービスが実行されていることを意味します。 アップストリームはポート5000を指しているため、Nginxは指定されたパスでポート5000を提供できます。

結論

このチュートリアルでは、OSRMバックエンドのインストールについて説明しますが、このページで詳細なドキュメントを入手できます。

執筆時点では、OSRMバックエンドはまだベータ版であり、単一のクエリに含めることができる場所の数にハードコードされた制限があります(現在は100、タイムマトリックスAPIに影響します)。 このような制限は無効にすることができますが、そのためにはosrm-routedのソースコードを変更する必要があります。

マップのサイズとドロップレットの容量によっては、Webサービスが正しく動作するために、より大きなスワップファイルを割り当てるか、.stxxl構成ファイルの容量を増やす必要がある場合があります。 セットアップに最適な構成を確認するために、いくつかの構成をテストする必要がある場合があります。