Как настроить сервер OSRM в Ubuntu 14.04

Вступление

Проект http: //www.openstreetmap.org%5D [OpenStreetMap] состоит из необработанных картографических данных, которые собирают и объединяют тысячи пользователей. Однако его политика открытого доступа вызвала ряд сопутствующих проектов, которые в совокупности охватывают многие функции, обычно предлагаемые коммерческими картографическими услугами.

Наиболее очевидным преимуществом использования программного обеспечения на основе OpenStreetMap по сравнению с коммерческим решением является экономичное удобство, поскольку OpenStreetMap поставляется как бесплатное (как в пиве, так и в речи) программное обеспечение. Недостатком является то, что для настройки работающего веб-сервиса требуется небольшая настройка.

Это руководство охватывает настройку и обслуживание веб-службы, которая может ответить на такие вопросы, как:

  • Какая улица ближе всего к данной паре координат?

  • Как лучше всего добраться из пункта А в пункт Б?

  • Сколько времени нужно, чтобы добраться из пункта А в пункт Б на машине или пешком?

Программное обеспечение, которое делает это возможным, представляет собой проект с открытым исходным кодом под названием http://project-osrm.org [Open Source Routing Machine (OSRM)], который основан на данных OpenStreetMap. Функциональные возможности для встраивания OpenStreetMaps в веб-страницы уже предоставлены такими API, как http://openlayers.org [OpenLayers].

Предпосылки

Чтобы следовать этому уроку, вам понадобится:

Некоторые операции в этом руководстве, такие как сборка OSRM из исходного кода и этапы предварительной обработки, требуют большого объема памяти. На дроплетах с малым объемом памяти эти операции могут завершаться неудачей, поэтому необходимо выделить файл подкачки.

Веб-служба обычно не требует дополнительного подкачки во время работы, поэтому этот файл подкачки может быть удален после завершения установки. Однако при обслуживании больших карт может понадобиться небольшой файл подкачки, особенно в каплях с малым объемом памяти. Если это так, следуйте инструкциям в приведенном выше руководстве, чтобы сделать файл подкачки постоянным.

Шаг 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. Есть несколько возможных способов получить экспорт карт.

Первый вариант - указать браузеру страницу export на OpenStreetMap, увеличить интересующую область и нажать * Export *. (Вам может понадобиться использовать один из других источников, если собственный экспорт не работает; Overpass API - хороший выбор.) Это позволит вам точно выбрать, какие области включить в вашу карту, и, в общем, сократить время предварительной обработки.

Однако существуют ограничения на размер экспорта, который вы можете получить с веб-сайта OSRM, поэтому вы можете загрузить готовый экспорт. Ряд сервисов, таких как http://download.geofabrik.de [Geofabrik] и Mapzen, предлагают обновленные и готовые карты экспорта стран и отдельных городских районов, которые хороши для большинства случаев использования.

Какой бы метод вы ни использовали, скопируйте URL-адрес экспорта и загрузите его на свой дроплет.

wget -O map.osm

Теперь у вас должен быть файл с именем + 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 используется для определения пользовательских сценариев профиля скорости, например, определяя, что на второстепенной дороге, в отсутствие ограничений, автомобиль движется со средней скоростью 80 км / ч, а на гравийной дороге средняя скорость составляет 50 км / ч. STXXL - это версия стандартной библиотеки C ++, которая использует дисковое пространство в качестве памяти, используемой для манипулирования большими файлами. Буферы LibXML и Protocol используются для загрузки, записи и манипулирования файлами OSM, а Boost и TBB используются для распараллеливания и представления структур данных.

Шаг 4 - Компиляция OSRM

На этом этапе мы получим исходный код OSRM и скомпилируем его.

Благодаря тому, что в качестве системы сборки OSRM выбрана CMake, после установки зависимостей довольно легко генерировать файлы сборки и компилировать OSRM.

Сначала мы клонируем исходный код с https://github.com/Project-OSRM/osrm-backend[page проекта. Проект состоит из нескольких хранилищ, работающих с различными функциями. Нас интересует серверная часть (серверная часть).

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 + фактический демон веб-службы, который позволяет нам запрашивать расстояния и местоположения.

Шаг 5 - Настройте STXXL

На этом этапе мы создадим файл конфигурации для STXXL.

Перед запуском веб-сервиса нам нужно предварительно обработать экспорт нашей карты. Поскольку мы установили необходимые двоичные файлы в системный путь, мы можем сделать это из любого места. Для целей данного руководства мы запустим предварительную обработку в корне созданного нами каталога + osrm +.

Сначала перейдите в каталог + osrm +.

cd ~/osrm

Предварительная обработка карты требует много памяти. По этой причине OSRM использует библиотеку под названием STXXL для сопоставления своих внутренних операций на жестком диске. STXXL использует конфигурационный файл с именем + .stxxl +, который находится в том же каталоге, где вы запускаете программное обеспечение, чтобы определить, сколько места выделено для структур данных STXXL. В зависимости от емкости нашего Droplet и размера карты, которую мы хотим обработать, нам нужно написать подходящий файл конфигурации + .stxxl +, выделяя достаточно памяти для операций.

Создайте и откройте + .stxxl + для редактирования.

nano .stxxl

Файл должен содержать одну строку в формате + disk = ,, +, где + path + - это путь к файлу размещения, +acity + - емкость файла, а + access + реализация доступа к файлам

Вот пример файла + .stxxl +. Вы можете вставить это в + .stxxl +, но, возможно, захотите изменить размер файла в зависимости от используемой карты и размера вашей капли. См. Http://stxxl.sourceforge.net/tags/master/install_config.html[documentation] для дополнительных параметров.

disk=/tmp/stxxl,10G,syscall

Сохраните и закройте + .stxxl +.

Шаг 6 - Извлечь карту

На этом этапе мы будем извлекать карту.

Первым этапом предварительной обработки является извлечение карты. Команда + osrm-extract + ожидает путь экспорта карты в качестве аргумента и предполагает наличие подходящего скрипта профиля скорости с именем + profile.lua + в рабочем каталоге. Профиль скорости используется для определения того, какой из доступных маршрутов можно использовать (например, профиль скорости для грузовика может запрещать некоторые улицы).

Бэкэнд-дистрибутив OSRM включает в себя ряд скриптов профилей скорости по умолчанию в каталоге + examples + репозитория. В этом уроке мы будем использовать профиль + 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

На этом этапе также создаются некоторые дополнительные файлы, необходимые для веб-службы, которые мы настроим в следующем разделе.

Шаг 8 - Запустите и протестируйте веб-сервис

На этом шаге мы запустим OSRM и проверим его работу через браузер.

Бэкэнд OSRM поставляется с последней командой + osrm-routed +, которая может читать обработанную карту и позволяет запрашивать ее через API веб-службы. Чтобы проверить это, запустите:

osrm-routed map.osrm

Теперь, указав в браузере + http: //: 5000 +, вы сможете увидеть веб-сервис в действии. Появится сообщение об ошибке, подобное + {" status_message ":" Строка запроса повреждена близко к позиции 0 "," status ": 400} +, поскольку вы не используете правильный формат запроса.

В качестве теста выберите набор координат широты и долготы в границах карты и перейдите по следующему URL-адресу, заменив ` и ` на выбранные вами координаты.

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

Вы должны увидеть вывод JSON, похожий на этот:

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

   ],
   "status":0
}

Если вместо этого вы получите сообщение об ошибке, возможно, вы выбрали набор координат вне границ карты, иначе синтаксис вашего запроса может быть неправильным. Чтобы узнать больше о доступных запросах, ознакомьтесь с server API.

Теперь вы можете остановить + osrm-routed +, используя + CTRL + C +.

Шаг 9 - Настройте Nginx

На этом шаге мы настроим Nginx для работы с + osrm-routed +.

Теперь у нас есть работающий веб-сервис, но запрашивать его, указав порт, неудобно. Более того, если мы решаем обслуживать разные карты или карты, обработанные с разными скоростными профилями, мы хотим избежать запоминания набора портов.

Nginx - это высокопроизводительный веб-сервер, который также может работать в качестве прокси-сервера и служить шлюзом для наших веб-сервисов. Настроить его для работы с + osrm-routed + довольно просто.

Сначала мы устанавливаем Nginx.

sudo apt-get install nginx

Далее мы добавляем файл конфигурации для наших веб-сервисов. Nginx использует два каталога для своих файлов конфигурации, специфичных для сайта: + / etc / nginx / sites-available + (все сайты, которые можно обслуживать) и + / etc / nginx / sites-enabled + (все обслуживаемые сайты) ). Стандартный способ добавления сайта состоит в том, чтобы добавить его файл конфигурации в + sites-available +, а затем символически связать его с + sites-enabled +.

Итак, сначала мы добавим файл конфигурации для OSM в + sites-available.

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

Наш конфигурационный файл будет определять + upstream +, который указывает на наш веб-сервис и сервер, который прослушивает порт 80 и перенаправляет подмножество запросов в наш апстрим.

Вставьте следующий файл конфигурации в + osrm.conf +. Вам нужно будет указать две переменные, которые выделены ниже: IP-адрес вашего сервера и путь (который будет использоваться для доступа к веб-службе, как в + 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;
   }
}

После сохранения файла перейдите в каталог + 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: /// +. Обратите внимание, что вам больше не нужно указывать порт. Теперь вы можете остановить + osrm-routed +, используя + CTRL + C +.

Добавляя больше восходящих потоков и расположений и выполняя + osrm-routed +, указывая порт с помощью + -p + или + - port +, мы можем запускать больше экземпляров веб-службы и связывать их с разными путями. Этот учебник не будет вдаваться в подробности об этом, но вы можете проверить OSRM документацию бэкэнда для получения дополнительной информации.

Шаг 10 - Установите и настройте Supervisor

На этом этапе мы установим и настроим Supervisor для поддержания работы Nginx, что позволит нашему веб-сервису быть доступным через перезагрузки.

Nginx теперь выступает в качестве шлюза для нашего веб-сервиса. Однако мы запустили его вручную, поэтому, если мы выйдем из системы, он перестанет работать. Для того, чтобы наши веб-службы выживали после перезагрузок и, в общем, чтобы они восстанавливались после возможных сбоев, мы можем использовать инструмент под названием http://supervisord.org [Supervisor].

Supervisor - это система управления процессами, которая в основном заботится о том, чтобы службы работали должным образом. Настроить это довольно легко. Сначала мы устанавливаем сам Supervisor.

sudo apt-get install supervisor

Затем мы добавляем наш веб-сервис в пул сервисов, контролируемых Supervisor, добавляя новый файл конфигурации.

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

Файл конфигурации должен содержать определение этой формы для каждого веб-сервиса, который мы хотим контролировать, а имя программы должно отличаться для каждого веб-сервиса.

Вставьте приведенную ниже конфигурацию в файл + 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

Затем мы можем проверить состояние веб-службы, запустив:

sudo supervisorctl status

Если все хорошо, мы должны увидеть что-то похожее на это

osrm          RUNNING    pid 12698, uptime 0:00:40

Это означает, что наш веб-сервис работает. Поскольку восходящий поток указывает на порт 5000, Nginx сможет обслуживать его по указанному пути.

Заключение

В этом руководстве рассказывается об установке серверной части OSRM, но дополнительная документация доступна по адресу this page.

На момент написания статьи серверная часть OSRM все еще находилась в стадии бета-тестирования и имеет некоторые жестко ограниченные ограничения на количество местоположений, которые могут быть включены в один запрос (в настоящее время 100, что влияет на API матрицы времени). Такие ограничения могут быть отключены, но для этого необходимо изменить исходный код + osrm-routed +.

В зависимости от размера вашей карты и емкости вашей капли вам может потребоваться выделить больший файл подкачки или увеличить емкость в конфигурационном файле «+ .stxxl +», чтобы веб-служба работала правильно. Возможно, вам придется протестировать несколько настроек, чтобы увидеть, что лучше всего подходит для вашей настройки.