Создаём и оптимизируем свой 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 минут.