Ubuntu14.04でOSRMサーバーをセットアップする方法
序章
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サイトから取得できるエクスポートのサイズには制限があるため、既製のエクスポートをダウンロードすることをお勧めします。 GeofabrikやMapzenなどの多くのサービスは、ほとんどのユースケースに適した国や選択された大都市圏の更新された既製の地図のエクスポートを提供します。
どちらの方法を使用する場合でも、エクスポートの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に移動して、latitude
とlongitude
を選択した座標に置き換えます。
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
構成ファイルの容量を増やす必要がある場合があります。 セットアップに最適な構成を確認するために、いくつかの構成をテストする必要がある場合があります。