Comment configurer un serveur OSRM sur Ubuntu 14.04

introduction

Le projet http: //www.openstreetmap.org%5D [OpenStreetMap] consiste en des données de carte brutes, collectées et agrégées par des milliers d’utilisateurs. Cependant, sa politique d’accès ouvert a engendré un certain nombre de projets collatéraux, qui couvrent collectivement un grand nombre des fonctionnalités généralement offertes par les services de cartographie commerciaux.

L’avantage le plus évident de l’utilisation d’un logiciel basé sur OpenStreetMap par rapport à une solution commerciale est la commodité économique, car OpenStreetMap est un logiciel gratuit (aussi bien dans la bière que dans la parole). L’inconvénient est qu’il faut un peu de configuration pour configurer un service Web opérationnel.

Ce tutoriel couvre la configuration et la maintenance d’un service Web pouvant répondre à des questions telles que:

  • Quelle est la rue la plus proche d’une paire de coordonnées donnée?

  • Quel est le meilleur moyen de se rendre du point A au point B?

  • Combien de temps faut-il pour aller du point A au point B en voiture ou à pied?

Le logiciel qui rend cela possible est un projet open-source appelé http://project-osrm.org [OSRM (Open Source Routing Machine)]], basé sur les données OpenStreetMap. Les fonctionnalités permettant d’incorporer OpenStreetMaps dans des pages Web sont déjà fournies directement par des API telles que http://openlayers.org [OpenLayers].

Conditions préalables

Pour suivre ce tutoriel, vous aurez besoin de:

  • Une goutte Ubuntu 14.04.

  • Un utilisateur sudo non root, que vous pouvez créer en suivant this tutorial. Ce tutoriel suppose que votre nom d’utilisateur sudo non-root est + osrm +.

  • Recommandé 4 gigaoctets de swap, tel que couvert dans Comment ajouter un swap sur Ubuntu 14.04.

Certaines des opérations de ce didacticiel, telles que la création de gestion des ressources en stockage à partir de la source et les phases de pré-traitement, utilisent beaucoup de mémoire. Sur les droplets à faible mémoire, ces opérations peuvent échouer, raison pour laquelle il est nécessaire d’allouer un fichier d’échange.

En règle générale, le service Web ne nécessite pas d’échange supplémentaire lors de l’exécution. Ce fichier d’échange peut donc être supprimé une fois la configuration terminée. Toutefois, lors de la préparation de cartes volumineuses, un petit fichier d’échange peut s’avérer nécessaire, en particulier pour les droplets à faible mémoire. Si tel est le cas, suivez les instructions du didacticiel ci-dessus pour rendre le fichier d’échange persistant.

Étape 1 - Mises à jour et sécurité

Dans cette étape, nous allons configurer les mises à jour pour le serveur.

Il est important de garder notre serveur à jour et en sécurité dans le temps. Par conséquent, nous mettons d’abord à niveau tous les packages du système en exécutant les commandes suivantes.

sudo apt-get update
sudo apt-get upgrade

Ensuite, nous activons les mises à niveau de sécurité sans surveillance d’Ubuntu. Pour ce faire, nous devons d’abord installer les packages nécessaires.

sudo apt-get install unattended-upgrades

Activez ensuite les mises à niveau automatiques en modifiant le fichier + / etc / apt / apt.conf.d / 10periodic +. Nous devons utiliser + sudo + car il s’agit d’un fichier de configuration système.

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

Ajoutez la ligne suivante à la fin du fichier, puis enregistrez et fermez-le.

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

Étape 2 - Télécharger une exportation de carte

Dans cette étape, nous choisirons et téléchargerons une exportation de carte.

Pour que tout soit propre et net, il est judicieux de créer un répertoire dédié dans lequel construire le code, traiter la carte, etc.

mkdir osrm

Déplacez-vous dans le nouveau répertoire.

cd osrm

Notre service Web sera basé sur une exportation de carte d’OpenStreetMap. Il existe plusieurs façons d’obtenir une exportation de carte.

La première option consiste à diriger votre navigateur vers la page export de OpenStreetMap, à zoomer sur la zone concernée et à cliquer sur * Exporter *. (Vous devrez peut-être utiliser l’une des autres sources si l’exportation native ne fonctionne pas; passerelle API est un bon choix.) Cela vous permettra de choisir précisément les zones à inclure dans votre carte et, en général, de réduire les temps de pré-traitement.

Toutefois, la taille de l’exportation que vous pouvez obtenir sur le site Web de gestion des ressources en ligne est limitée, vous pouvez donc télécharger une exportation toute faite. Un certain nombre de services, tels que http://download.geofabrik.de [Geofabrik] et Mapzen offrent des exportations de cartes mises à jour et toutes faites, de pays et de régions métropolitaines sélectionnées, qui sont bons pour la plupart des cas d’utilisation.

Quelle que soit la méthode utilisée, copiez l’URL de l’exportation et téléchargez-la sur votre Droplet.

wget -O map.osm

Vous devriez maintenant avoir un fichier nommé + map.osm + dans votre répertoire de travail.

Étape 3 - Installez les dépendances

Dans cette étape, nous allons installer les dépendances d’OSRM.

OSRM doit être compilé à partir de la source, nous devons donc d’abord installer les machines de construction nécessaires. Heureusement, Ubuntu est livré avec un méta-paquet pratique appelé + build-essential + qui contient la chaîne d’outils du compilateur nécessaire. De plus, nous aurons besoin de + git + pour récupérer le code source OSRM et + CMake + pour générer le système de construction. La commande suivante installera ces 3 éléments.

sudo apt-get install build-essential git cmake

OSRM est un logiciel assez complexe qui s’appuie également sur un certain nombre de bibliothèques. Nous pouvons installer les dépendances requises avec la commande suivante.

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

Ces dépendances sont utilisées pour différentes choses. Lua est utilisé pour définir des scripts de profil de vitesse personnalisés, par exemple. définissant que sur une route secondaire, en l’absence de limite, une voiture roule en moyenne à 80 km / h et que, sur une route de gravier, la vitesse moyenne est de 50 km / h. STXXL est une version de la bibliothèque standard de C ++ qui utilise l’espace disque comme mémoire, utilisée pour manipuler des fichiers volumineux. Les tampons LibXML et Protocole sont utilisés pour charger, écrire et manipuler des fichiers OSM, tandis que Boost et TBB sont utilisés pour la parallélisation et pour représenter des structures de données.

Étape 4 - Compiler OSRM

Dans cette étape, nous allons obtenir le code source d’OSRM et le compiler.

CMake étant le système de construction choisi par OSRM, une fois les dépendances installées, il est assez facile de générer des fichiers de construction et de compiler OSRM.

Tout d’abord, nous clonons le code source à partir de la page du projet. Le projet est composé de plusieurs référentiels, gérant différentes fonctionnalités. Nous nous intéressons au back-end (la partie serveur).

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

Ensuite, déplacez-vous dans le répertoire de code.

cd osrm-backend

L’étape suivante consiste à utiliser CMake pour générer les fichiers de construction. Il est recommandé de créer OSRM dans un répertoire + build + dédié à la racine du code source, afin d’éviter de polluer les répertoires source avec des fichiers de construction temporaires.

Créez un répertoire de construction.

mkdir build

Déplacez-vous dans le répertoire de construction.

cd build

Enfin, nous allons générer les fichiers de construction avec + cmake +. Cette commande va générer un certain nombre de répertoires et de Makefiles dans l’arborescence + build +.

cmake ..

Si vous obtenez une erreur ici, assurez-vous que vous avez activé le swap via les instructions des conditions préalables.

Ensuite, compilez et installez OSRM.

sudo make install
  • Note *: Cela peut prendre 5 à 10 minutes.

Construire avec + sudo + est nécessaire ici car la cible d’installation copiera certains exécutables dans le chemin binaire du système, y compris ceux dont nous aurons besoin. À savoir:

  • + osrm-extract + qui ouvre le fichier map et exécute une première étape de pré-traitement sur les données.

  • + osrm-prepare + qui traite la sortie de + osrm-extract + et calcule les temps de parcours de tous les bords de la carte en fonction d’un profil de vitesse Lua donné.

  • + osrm-routed + le démon de service Web actuel, ce qui nous permet d’interroger des distances et des emplacements.

Étape 5 - Configurer STXXL

Dans cette étape, nous allons créer un fichier de configuration pour STXXL.

Avant d’exécuter le service Web, nous devons pré-traiter notre exportation de carte. Comme nous avons installé les fichiers binaires nécessaires dans le chemin système, nous pouvons le faire depuis n’importe où. Pour les besoins de ce tutoriel, nous allons exécuter le pré-traitement à la racine du répertoire + osrm + que nous avons créé.

Tout d’abord, allez dans le répertoire + osrm +.

cd ~/osrm

Le pré-traitement de la carte nécessite beaucoup de mémoire. Pour cette raison, OSRM utilise une bibliothèque appelée STXXL pour mapper ses opérations internes sur le disque dur. STXXL s’appuie sur un fichier de configuration appelé + .stxxl +, qui réside dans le même répertoire que celui où vous exécutez votre logiciel, pour déterminer la quantité d’espace dédiée aux structures de données STXXL. En fonction de la capacité de notre Droplet et de la taille de la carte que nous souhaitons traiter, nous devons écrire un fichier de configuration + .stxxl + approprié, en allouant suffisamment de mémoire pour les opérations.

Créez et ouvrez + .stxxl + pour le modifier.

nano .stxxl

Le fichier doit contenir une seule ligne au format + disque = ,, +, où + chemin + est le chemin où le fichier d’allocation sera placé, + capacité + est la capacité du fichier et + accès + est une implémentation d’accès à un fichier.

Voici un exemple de fichier + .stxxl +. Vous pouvez coller ceci dans + .stxxl +, mais vous voudrez peut-être modifier la taille du fichier en fonction de la carte que vous utilisez et de la taille de votre droplet. Voir la documentation pour les options avancées.

disk=/tmp/stxxl,10G,syscall

Enregistrez et fermez + .stxxl +.

Étape 6 - Extraire la carte

Dans cette étape, nous allons extraire la carte.

La première étape du pré-traitement est l’extraction de la carte. La commande + osrm-extract + attend le chemin d’une exportation de carte en tant qu’argument et suppose la présence d’un script de profil de vitesse approprié sous le nom + profile.lua + dans le répertoire de travail. Le profil de vitesse est utilisé pour déterminer laquelle des routes disponibles peut être utilisée (par exemple, un profil de vitesse pour un camion peut interdire certaines rues).

La distribution dorsale OSRM inclut un certain nombre de scripts de profil de vitesse par défaut dans le répertoire + profiles + du référentiel. Dans ce tutoriel, nous allons utiliser le profil + car.lua +, ce qui convient à la plupart des cas d’utilisation.

Comme le script de profil de vitesse peut dépendre de certaines fonctions Lua définies dans la bibliothèque de profils, nous créons également un lien symbolique vers celle-ci dans le même répertoire en exécutant les deux commandes suivantes.

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

Notre exportation de carte s’appelle + map.osm +, alors, exécutez:

osrm-extract map.osm

Cette étape génère un groupe de fichiers dans le répertoire de pré-traitement, y compris + map.osrm +, qui constitue l’entrée de l’étape suivante.

Étape 7 - Calculer les temps de trajet

Dans cette étape, nous allons calculer les temps de trajet pour la carte.

L’étape est effectuée par la commande + osrm-prepare +, qui utilise à nouveau le script de profil de vitesse pour calculer les temps de trajet de chaque bord du graphique. Pour ce faire, exécutez la commande suivante.

osrm-prepare map.osrm

Cette étape produit également des fichiers supplémentaires nécessaires au service Web, que nous allons configurer dans la section suivante.

Étape 8 - Exécuter et tester le service Web

Dans cette étape, nous allons exécuter OSRM et tester son fonctionnement via un navigateur.

Le backend OSRM est livré avec une commande finale, + osrm-routed +, capable de lire la carte traitée et de l’interroger via une API de service Web. Pour le tester, lancez:

osrm-routed map.osrm

Maintenant, en pointant votre navigateur sur + http: //: 5000 +, vous devriez maintenant pouvoir voir le service Web en action. Un message d’erreur du type «+ {" message_état "": "Chaîne de requête mal formée proche de la position 0", "statut": 400} + `apparaît car vous n’utilisez pas le format de requête correct.

En guise de test, choisissez un ensemble de coordonnées de latitude et de longitude dans les limites de votre carte, puis accédez à l’URL suivante, en remplaçant «» et «» par les coordonnées que vous avez choisies.

http://:5000/nearest?loc=,

Vous devriez voir une sortie JSON semblable à ceci:

{
   "name": "",
   "mapped_coordinate": [
       ,

   ],
   "status":0
}

Si vous obtenez un message d’erreur au lieu de cela, vous avez peut-être choisi un ensemble de coordonnées en dehors des limites de la carte ou la syntaxe de votre requête est peut-être incorrecte. Pour plus de requêtes disponibles, consultez l’API server.

Vous pouvez maintenant arrêter + osrm-routed + en utilisant + CTRL + C +.

Étape 9 - Configurer Nginx

Dans cette étape, nous allons configurer Nginx pour qu’il fonctionne avec + osrm-routed +.

Nous avons maintenant un service Web opérationnel, mais l’interroger en spécifiant le port est compliqué. De plus, si nous décidons de servir différentes cartes ou des cartes traitées avec des profils de vitesse différents, nous voulons éviter de devoir mémoriser une collection de ports.

Nginx est un serveur Web hautes performances pouvant également servir de proxy et de passerelle pour nos services Web. Le mettre en place pour fonctionner avec + osrm-routed + est assez facile.

Premièrement, nous installons Nginx.

sudo apt-get install nginx

Ensuite, nous ajoutons un fichier de configuration pour nos services Web. Nginx utilise deux répertoires pour ses fichiers de configuration spécifiques aux sites: + / etc / nginx / sites-available + (tous les sites pouvant être desservis) et + / etc / nginx / sites-enabled + (tous les sites desservis ). La méthode standard pour ajouter un site consiste à ajouter son fichier de configuration à + ​​sites-available +, puis à le lier de façon symbolique dans + sites-enabled +.

Nous allons donc commencer par ajouter un fichier de configuration pour OSRM à + ​​sites-available.

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

Notre fichier de configuration définira un + amont + qui pointe sur notre service Web et un serveur qui écoute sur le port 80 et redirige un sous-ensemble des requêtes vers notre amont.

Collez le fichier de configuration suivant dans + osrm.conf +. Vous devrez spécifier deux variables, qui sont mises en évidence ci-dessous: l’adresse IP de votre serveur et un chemin d’accès (qui sera utilisé pour accéder au service Web, comme dans + http: /// +).

upstream osrm {
   server 0.0.0.0:5000;
}

server {
   listen 80;
   server_name ;

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

Une fois que vous avez enregistré le fichier, accédez au répertoire + sites-enabled.

cd /etc/nginx/sites-enabled

Ensuite, nous pouvons relier le fichier + osrm.conf +.

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

Ensuite, rechargez la configuration.

sudo service nginx reload

Enfin, redémarrez Nginx.

sudo service nginx restart

Maintenant, relancez + osrm-routed +.

osrm-routed ~/osrm/map.osrm

Vous devriez pouvoir accéder au service Web en pointant notre navigateur sur + http: /// +. Notez qu’il n’est plus nécessaire de spécifier le port. Vous pouvez maintenant arrêter + osrm-routed + en utilisant + CTRL + C +.

En ajoutant plus d’upstream et d’emplacement, et en exécutant + osrm-routed + en spécifiant le port avec + -p + ou + - port +, nous pouvons exécuter davantage d’instances du service Web et les lier à des chemins différents. Ce didacticiel n’entre pas dans les détails à ce sujet, mais vous pouvez consulter la documentation OSRM pour plus d’informations.

Étape 10 - Installer et configurer Supervisor

Au cours de cette étape, nous installerons et configurerons Supervisor pour que Nginx continue à fonctionner, ce qui permettra à notre service Web d’être disponible lors des redémarrages.

Nginx sert maintenant de passerelle pour notre service Web. Cependant, nous l’avons démarré manuellement. Par conséquent, si nous nous déconnectons du système, il cessera de fonctionner. Afin de faire en sorte que nos services Web survivent lors des redémarrages et, en général, de les récupérer d’éventuels échecs, nous pouvons utiliser un outil appelé http://supervisord.org [Superviseur].

Supervisor est un système de contrôle de processus qui veille principalement au bon fonctionnement des services. L’installation est assez facile. Premièrement, nous installons Supervisor lui-même.

sudo apt-get install supervisor

Ensuite, nous ajoutons notre service Web au groupe de services contrôlés par Supervisor en ajoutant un nouveau fichier de configuration.

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

Le fichier de configuration doit contenir une définition de ce formulaire pour chaque service Web que nous souhaitons superviser, et le nom du programme doit être différent pour chaque service Web.

Collez la configuration ci-dessous dans le fichier + osrm.conf +, puis enregistrez-le et fermez-le.

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

Ce que dit cette configuration, c’est que nous voulons que l’utilisateur + osrm + laisse la commande + / usr / local / bin / osrm-routed -p 5000 map.osrm + en cours d’exécution et qu’il soit exécuté à partir du répertoire spécifié. + / home / osrm / osrm + (c’est comment nous pouvons spécifier + map.osrm + comme chemin relatif dans la commande). Dans cet exemple, nous avons spécifié le port pour + osrm-routed + en utilisant + -p + afin que plusieurs programmes puissent être ajoutés en augmentant le port.

Une fois que vous avez enregistré et fermé le fichier, redémarrez Supervisor.

sudo service supervisor restart

Nous pouvons ensuite vérifier l’état du service Web en exécutant:

sudo supervisorctl status

Si tout va bien, nous devrions voir quelque chose de similaire à ceci

osrm          RUNNING    pid 12698, uptime 0:00:40

Cela signifie que notre service Web est en cours d’exécution. Étant donné que l’amont pointe vers le port 5000, Nginx pourra le servir sur le chemin spécifié.

Conclusion

Ce tutoriel explique l’installation du backend OSRM, mais une documentation supplémentaire est disponible à l’adresse cette page.

Au moment de la rédaction, le back-end OSRM était encore en version bêta et comportait des limitations codées en dur sur le nombre d’emplacements pouvant être inclus dans une requête unique (actuellement 100, affectant l’API de matrice de temps). De telles limitations peuvent être désactivées, mais il est nécessaire de modifier le code source de + osrm-routed + pour le faire.

Selon la taille de votre carte et la capacité de votre Droplet, vous devrez peut-être allouer un fichier d’échange plus volumineux ou augmenter la capacité du fichier de configuration + .stxxl + afin que le service Web fonctionne correctement. Vous devrez peut-être tester quelques configurations pour voir ce qui fonctionne le mieux pour votre configuration.