Создаём и оптимизируем свой tile-сервер для OpenStreetMap на основе Ubuntu 14.04

Создаём и оптимизируем свой tile-сервер для OpenStreetMap на основе Ubuntu 14.04

Сегодня я расскажу как довольно просто поднять и настроить свой собственный сервер карт (тайловый сервер) на основе Ubuntu Server 14.04 LTS и OpenStreetMap.

OpenStreetMap (дословно «открытая карта улиц»), сокращённо OSM — некоммерческий веб-картографический проект по созданию силами сообщества участников-пользователей Интернета подробной свободной и бесплатной географической карты мира.

Есть довольно подробная официальная статья об установке и настройке tile-сервера, но есть ещё более простой и быстрый способ.

Установка OpenStreetMap

Ставим единственный пакет, что потянет за собой всё необходимое для работы полноценного сервера карт.

По ходу инсталляции (openstreetmap-postgis-db-setup) вам будет задано несколько вопросов:

This will enable the apache config for mod_tile WARNING: This will disable the currently active default site config Do you want to enable mod_tile in the apache config? Отвечаем Yes

This script downloads the necessary coastline and boundary data. WARNING: The data is about 400 — 500Mb in size. Do you want to download coastlines? Отвечаем Yes

Do you want these scripts to create and setup a new postgis database ready to be used with e.g. Osm2pgsql. WARNING: This will delete an existing db. Do you want to create a postgis db? Отвечаем Yes

If you don’t use the default name, you might need to adapt programs and scripts to use the new name. Name of the database to create: Указываем gis

Please specify which users should have access to the newly created db. You will want the user www-data for rendering and your own user name to import data into the db. The list of users is blank separated: E.g. «www-data peter». Other users that should have access to the db: Указываем www-data

Настройка PostgreSQL и Mapnik

Вначале о самой Mapnik:

Mapnik — это программа, которую мы используем для отрисовки основного Slippy Map слоя для OSM, вместе с другими слоями вроде «cycle map» и «noname». Также, это имя, данное основному слою, что вводит некоторых в заблуждение.

Mapnik — свободный инструментарий отрисовки карты. Он написан на C++ и Python. Использует библиотеку AGG и дает возможность сглаживать объекты на карте с большой точностью. Может читать данные в формате компании ESRI, PostGIS, точечные рисунки TIFF, файлы .osm, а также поддерживает любые GDAL или OGR форматы. Пакеты доступны для большинства выпусков Linux, двоичные файлы доступны для Mac OS X и Windows.

Довольно странный нюанс в том, что нам не предложили задать пароль для доступа пользователя gis (создаётся автоматически) к одноимённой БД.

Устанавливаем пароль для пользователя gis

Теперь необходимо указать пользователя и пароль в файле конфига mapnik . Сделаем это простым способом — заменой с помощью утилиты rpl :

Где «1234567890» — это пароль, что мы указали для пользователя gis

Даём возможность подключаться с локального сервера, используя конфиг /etc/postgresql/9.3/main/pg_hba.conf Добавляем в него строчку

Настраиваем PostgreSQL (относительно характеристик сервера: 16 ядер, 16GB RAM, БД на HDD).

Показываю только то, что менял:

И перезапускаем Постгрес для применения всех настроек

Потюним немного конфиг демона renderd рендерера тайлов (Mapnik rendering daemon) и увеличим количество потоков renderd до количества ядер (в моём случаи — 16)

Теперь необходимо перезапустить демон renderd рендерер тайлов (Mapnik rendering daemon)

Настройка Apache

Сервер карт будет работать на связке Apache + PostgreSQL. Я не в восторге от данной связки. После основных действий мы ещё доставим nginx для более быстрой работы в связке nginx + Apache + PostgreSQL.

Настраиваем Apache. Названия сервера для примера будет osm.net. Обратите внимание что порт я указал 8080 .

Правим порт в /etc/apache2/ports.conf на 8080

Дописываем в /etc/apache2/apache2.conf название нашего сервера, т.к. Апач без этого работать не может.

Импорт карты

Скачиваем с проекта Geofabrik, для примера, карту Украины в формате .pbf и вливаем его в нашу БД.

На виртуальной машине с 16 ядрами, 16GB ОЗУ и HDD RAID-10 массивом это занимает около 30 минут. На скорость импорта довольно сильно влияет диск. На SSD вливается заметно быстрее.

Обратите внимание на параметр -c ( --create ) при импорте через osm2pgsql . С этим параметром удалится вся существующая информация с таблиц. Если вам необходимо сделать импорт ещё нескольких стран, то вместо -c указывайте параметр -a ( --append ).

После того как сделаете импорт всех необходимых стран (или всего мира) не забудьте вернуть в default из конфига PostgreSQL /etc/postgresql/9.3/main/postgresql.conf параметры synchronous_commit , fsync и autovacuum .

Проверка работоспособности карты

Текущая комплектация поставляется примером /var/www/osm/slippymap.html Я предлагаю проверить на данном этапе правильность настройки PostgreSQL + Apache (mod_tile) + Mapnik, перед тем, как мы перейдём к настройке nginx.

Открываем в браузере https://osm.net:8080/osm/slippymap.html Должен отобразится простой интерфейс и карта. Важно чтобы был выбран пункт в интерфейсе «Local Tiles». Если позумить и поскроллить, то карта будет перерисовываться, постепенно подгружая разные тайлы. Вот например, адрес тайла центра города Киева будет выгдядеть так: https://osm.net:8080/osm/11/1197/690.png И если вы увидели картинку — значит всё сделали правильно.

Кэш отрендеренных тайлов будет складываться в папку /var/lib/mod_tile/default/ . И тут как-раз настало время отдавать этот кэш не через медленного монстра Apache, а через быстрый nginx.

Настройка nginx

Оптимизируем OpenStreetMap (PostGIS)

Сохраним эти запросы в файл /var/osm/osm.indexes.sql и выполним их

Разогрев кэша Mapnik

Для часто используемых тайлов есть смысл "разогреть" кэш Mapnik. Для этого есть очень простая команда:

Где -z 0 - начальный зум (от) -Z 10 - конечный зум (до) -n 16 - количество ядер

Всё тот же пример с картой Украины для 16 ядер и с зумом от 0 до 10 занимает около 20 минут.

📎📎📎📎📎📎📎📎📎📎