Установка OSRM сервера в Ubuntu 14.04

Проект OpenStreetMap содержит необработанные картографические данные, собранные и аггрегированные тысячами пользователей. Его политика открытого доступа породила ряд сопутствующих проектов. В совокупности они охватывают многие функции, которые обычно предлагаются коммерческими картографическими сервисами.

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

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

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

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

Требования

  • Сервер Ubuntu 14.04, настроенный по этому мануалу. Наш пользователь sudo называется osrm. Замените это имя именем своего пользователя.
  • Рекомендуется иметь 4 ГБ своп-пространства. Больше о настройке – в мануале Как добавить Swap на Ubuntu 14.04.

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

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

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, существуют ограничения, поэтому вы можете просто загрузить готовый экспорт с другого источника. Есть целый ряд сервисов типа Geofabrik и Mapzen, которые предлагают обновленные и готовые экспорты стран и отдельных городских районов, в большинстве случаев они подходят.

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

Теперь в рабочем каталоге у вас должен быть файл по имени map.osm.

3: Установка зависимостей

На этом этапе мы установим зависимости OSRM.

OSRM нужно скомпилировать из исходного кода, поэтому сначала нужно установить необходимое оборудование для сборки. Система Ubuntu поставляется с удобным метапакетом build-essential, который содержит необходимый набор инструментов для компиляции. Кроме того, нам понадобится git для загрузки исходного кода OSRM и CMake для создания системы сборки. Следующая команда установит все эти зависимости.

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 довольно легко.

Сначала мы клонируем исходный код со страницы проекта. Проект состоит из нескольких хранилищ с различными функциями. Нас интересует бэкенд (серверная часть).

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

Затем перейдите в каталог с кодом:

cd osrm-backend

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

Создайте каталог для сборки.

mkdir build

Перейдите в него.

cd build

Наконец, мы сгенерируем файлы сборки с помощью cmake. Эта команда создаст несколько каталогов и файлов Makefile в дереве каталогов build.

Если вы получили ошибку, убедитесь, что вы включили swap. Если это не так, добавьте swap-пространство.

Затем скомпилируйте и установите 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). В зависимости от объема сервера и размера карты, которую нужно обработать, вам необходимо написать подходящий файл конфигурации .stxxl и выделить достаточно памяти для операций.

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

nano .stxxl

Файл должен содержать одну строку в формате:

disk=path,capacity,access

где path – это путь к файлу размещения, capacity – емкость файла, а access — реализация доступа к файлу.

Вот пример файла .stxxl. Вы можете вставить эту строку в свой .stxxl, но, возможно, вам нужно будет изменить размер файла в зависимости от используемой карты и размера вашего сервиса. Читайте документацию, чтобы узнать больше.

disk=/tmp/stxxl,10G,syscall

Сохраните и закройте файл.

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

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

8: Запуск и тестирование веб-сервиса

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

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

osrm-routed map.osrm

Теперь откройте в браузере http://your_server_ip:5000, и вы сможете увидеть веб-сервис в действии. Появится сообщение об ошибке типа {«status_message»:»Query string malformed close to position 0″,»status»:400}, поскольку вы используете неправильный формат запроса.

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

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

{
"name": "street_name",
"mapped_coordinate": [
latitude,
longitude
],
"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.

Итак, во-первых, нужно добавить конфигурационный файл для OSRM в sites-available.

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

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

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

Вы должны иметь доступ к веб-сервису в браузере по адресу http://your_server_ip/example_path. Обратите внимание, вам больше не нужно указывать порт. Теперь вы можете остановить osrm-routed, используя комбинацию клавиш CTRL+C.

Добавляя больше блоков upstream и location, а также запуская osrm-routed с опциями -p или —port для указания порта, вы можете запускать больше экземпляров веб-сервисов и привязывать их к разным путям. В этом мануале мы не будем вдаваться в такие подробности. Если вам интересна эта тема, обратитесь к документации по OSRM.

10: Установка и настройка Supervisor

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

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

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

sudo apt-get install supervisor

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

sudo nano /etc/supervisor/conf.d/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

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

Заключение

В этом мануале вы научились устанавливать серверную часть OSRM. Больше информации об этом инструменте можно найти в документации.

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

Tags: , , , , ,