Установка и настройка OSM Сервера

Установка и настройка сервера открытых карт (OSM TILE SERVER)

Эта инструкция описывает как установить сервер открытых карт на ваш домашний или рабочий сервер. Также, как разделить его на веб-сервер и базу данных. Автор инструкции предполагает, что у вас установлена 64 битная Ubuntu 18.04. Эта инструкция была написана и протестирована на UBUNTU 18.04

Описание основных компонентов для работы OSM TILE SERVER

OSM TILE SERVER представляет из себя работу 5 основных компонентов:
— Mod Tile — это модуль Apache, который проверяет наличие тайла и его актуальность. Если тайл устарел, то модуль запрашивает его обновление
— renderd — утилита, обеспечивающая формирование приоритетной очереди различных типов запросов для управления и сглаживания нагрузки от запросов на рендеринг
— osm2gpsql — специальный инструмент, необходимый для корректной загрузки данных  (карты в формате osm, map, pbf и т.д) в базу данных PostgreSql
— mapnik — библиотека, которая собственно и генерирует (рендерит) тайлы, согласно очереди предоставленной ей Renderd.
— postgresql/postgis — непосредственно сама база данных. PostGis — инструмент сделанный специально для корректного хранения и работы карт.

Конфигурация серверов

Здесь указаны минимальные необходимые требования системы для корректной работы сервера.

  1. Операционная система: Ubuntu 18.04
  2. Оперативная память: 8 gb
  3. Процессор: intel/amd, 2 ghz, 4 ядра
  4. Жесткий диск/SSD: 250 gb

Установка и настройка сервера базы данных (PostgreSQL)

Обновляем систему:

sudo apt-get update
sudo apt-get upgrade

Устанавливаем PostgreSQL и необходимые компоненты:

sudo apt-get install postgresql postgresql-contrib postgis postgresql-10-postgis-2.4 postgresql-10-postgis-scripts

Создание и настройка пользователя и базы данных:

sudo -u postgres -i
createuser tileserver //создаем пользователя tileserver
createdb -E UTF8 -O tileserver gis //создаем базу банных с администратором tileserver
psql //подключаемся к postgresq
\password postgres //задаем пароль для пользователя postgres: qwe-123
\password tileserver //задаем пароль для пользователя tileserver: qwe-123

Настраиваем и выдаем все необходимые привилегии новому пользователю tileserver

\c gis //Подключаемся к базе данных
CREATE EXTENSION postgis; //команда выдаст: “CREATE EXTENSION”
ALTER TABLE geometry_columns OWNER TO tileserver; //команда выдаст: “ALTER TABLE”
ALTER TABLE spatial_ref_sys OWNER TO tileserver; //команда выдаст: “ALTER TABLE”
\q //Выходим из psql
exit

Настройка удаленного доступа к базе.

Для удаленного доступа к PostgreSQL необходимо отредактировать pg_nba.conf
На момент написания инструкции актуальная версия postgresql — 10

sudo nano /etc/postgresql/10/main/pg_hba.conf

И добавить команду ниже этих строк:

host                 all         all         <your IP set>/<your netmask>      md5

Команда:

host all all 0.0.0.0/0 md5

После необходимо отредактировать файл конфигурации postgresql.conf

sudo nano /etc/postgresql/10/main/postgresql.conf

Найдите строчку #listen_addresses=”localhost” и приведите ее к следующему виду:

listen_addresses= '*'

После перезагружаем наш сервере postgresql

sudo /etc/init.d/postgresql restart

Для проверки работоспособности созданной базы можно ввести команду:

psql –h localhost –U tileserver –d gis //вывод: table gis, OWNER: Tileserver

Установка и настройка веб-сервера (OSM TILE SERVER)

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

Обновляем систему:

sudo apt-get update
sudo apt-get upgrade

Устанавливаем необходимые инструменты.

sudo apt install libboost-all-dev git-core tar unzip wget bzip2 build-essential autoconf libtool libxml2-dev libgeos-dev libgeos++-dev libpq-dev libbz2-dev libproj-dev munin-node munin libprotobuf-c0-dev protobuf-c-compiler libfreetype6-dev libtiff5-dev libicu-dev libgdal-dev libcairo-dev libcairomm-1.0-dev apache2 apache2-dev libagg-dev liblua5.2-dev ttf-unifont lua5.1 liblua5.1-dev libgeotiff-epsg curl

Устанавливаем PostgreSQL

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

sudo apt-get install postgresql postgresql-contrib postgis postgresql-10-postgis-2.4 postgresql-10-postgis-scripts

Создание и переключение пользователя сервера

Для корректной работы нам необходимо создать дополнительного пользователя, который будет хранить все данные и от него будут запускаться сервисы, в том числе и веб-сервер Apache

sudo adduser tileserver //добавляем пользователя tileserver, если он еще не существует
sudo passwd tileserver //введите пароль qwe-123
sudo userMod -aG sudo tileserver //даем пользователю tileserver права sudo, чтобы он мог загружать и устанавливать модули и компоненты.

Далее все действия мы производим от пользователя “tileserver”

su tileserver //добавляем пользователя tileserver, если он еще не существует
cd ~ //Переходим в домашнюю категорию

Устанавливаем NodeJS и NPM

curl -sL https://deb.nodesource.com/setup_10.x | sudo bash - //Добавляем официальный репозиторий nodejs
sudo apt-get install nodejs -y //Устаналиваем nodejs

Проверяем версии

nodejs -v //v10.22.0
npm -v //6.14.6

Если все корректно отобразилось можно продолжить.

Устанавливаем “carto”

carto — это специальный инструмент, который преобразует таблицу стилей project.mml в тот формат, который понимает mod-tile и renderd

sudo npm install -g carto //устанавливаем.
carto -v //проверяем версию. Если вышло что-то вроде “carto 1.1.0”, то всё отлично.

Устанавливаем osm2pgsql

mkdir ~/src //Создаем папку srcв корне нашего пользователя.
cd ~/src //Переходим в папку
git clone git://github.com/openstreetmap/osm2pgsql.git //клонируем репозиторий в папку
cd osm2pgsql //переходим в папку
//Альтернативная установка
sudo apt-get update -y
sudo apt-get install osm2pgsql

Для корректной работы osm2pgsql необходимо установить следующие модули:

sudo apt install make cmake g++ libboost-dev libboost-system-dev libboost-filesystem-dev libexpat1-dev zlib1g-dev libbz2-dev libpq-dev libgeos-dev libgeos++-dev libproj-dev lua5.2 liblua5.2-dev

Установка osm2pgsql:

mkdir build && cd build //Создаем папку и переходим туда
cmake .. //распаковываем
make  //Собираем
sudo make install //Устанавливаем

Устанавливаем mapnik

sudo apt-get install autoconf apache2-dev libtool libxml2-dev libbz2-dev libgeos-dev libgeos++-dev libproj-dev gdal-bin libmapnik-dev mapnik-utils python-mapnik

Проверяем работу mapnik:

python //выведет следующее: “>>>”
import mapnik //если вывело следующее: “>>>” то всё ок
quit() //выходим

Устанавливаем mod_tile и renderd

cd ~/src //создаем папку
git clone -b switch2osm git://github.com/SomeoneElseOSM/mod_tile.git //клонируем репозиторий
cd mod_tile //переходим
./autogen.sh //Должно вывести: "autoreconf: Leaving directory `.'"
./configure //Должно вывести: "config.status: executing libtool commands"
sudo make install //Должно вывести: "make[1]: Leaving directory '/home/tileserver/src/mod_tile'".
sudo make install-mod_tile //Должно вывести: "chmod 644 /usr/lib/apache2/modules/mod_tile.so"
sudo ldconfig 

Устанавливаем стили

Для корректного отображения карт мы будем использовать стили основанные на исходниках openstreetmap.
Эти стили были упрощены и улучшены для лучшего отображения улиц и дорог.  Они поддерживаются уже более пяти лет. В исходниках мы сможем увидеть оригинальные ссылки на главный сайт openstreetmap.org

cd ~/src //переходим в папку
git clone git://github.com/SomeoneElseOSM/SomeoneElse-style.git //клонируем репозиторий
git clone git://github.com/SomeoneElseOSM/openstreetmap-carto-AJT.git //клонируем репозиторий

Устанавливаем шрифты

sudo apt-get install fonts-noto-cjk fonts-noto-hinted fonts-noto-unhinted ttf-unifont

Загружаем наши данные

Для начала необходимо скачать нашу карту в формате pbf. Можно скачать город, республику, область, страну или даже материк. Скачать можно с разных источников. В основном это три портала: OverpassApi OpenStreetMap, Geofabrik. Мы будем использовать Geofabrik, так как этот портал может предоставить на скачивание отдельный город. Для примера скачаем Kaliningrad

mkdir ~/data
cd ~/data
wget https://download.geofabrik.de/russia/kaliningrad-latest.osm.pbf

Загрузим карту Калининграда на сервер PostgreSQL

osm2pgsql -d gis -U tileserver -W -H *здесь забиваем ip адрес сервера базы данных* --create --slim -C 2500 --number-processes 1 -S ~/src/openstreetmap-carto-AJT/openstreetmap-carto.style --multi-geometry --tag-transform-script ~/src/SomeoneElse-style/style.lua ~/data/Kaliningrad- latest.osm.pbf

Расшифровка команд:

 d gis — имя вашей базы данных.

create Загрузка карты в базу данных, при этом удалить другие карты.

slim Установка тонких таблиц (необходимо для корректной загрузки и хорошей производительности).

C 2500 Использовать 2.5 гигабайт оперативно памяти для загрузки (можете указать больше)

numberprocesses 1 Использовать только 1 ядро процессора для загрузки (можете указать больше)

S создать столбы базы данных в этом файле

multigeometry описывает как импортируются мультиполигоны

tagtransformscript вызвать lua скрипт для внесения изменений по мере загрузки.

U указываем пользователя база данных.

W этот флаг говорит о том, что нужно обязательно ввести пароль пользователя БД перед загрузкой пользователя

h адрес хоста базы данных postgresql.

После успешной загрузки в терминале вы должны получить вот это сообщение: «Osm2pgsql took 238s overall»

Если нам необходимо ДОБАВИТЬ (update) карту или местность.

Для корректной «дозагрузки местности» исходя из ответов разработчиков osm, лучше не до загружать, а объединить файлы и загружать на сервер один объедененный файл. Это было рекомендовано из-за того, что при добавлении отдельной местности могли произойти ошибки из-за дубликатов в базе данных, а так же из-за очень медленной скорости (скорость первичной загрузки — около 500 кб/с. Скорость «до загрузки» около 2 -кб/c)

sudo apt-get install osmium-tool //Устанавливаем инструмент для объединения
cd ~/data //Переходим в папку с картами
osmium merge *.pbf -o output.pbf //объединяем наши карты
osm2pgsql -d gis -U tileserver -W -H *наш БД сервер* --create --slim -C 4000 --number-processes 3 -S ~/src/openstreetmap-carto-AJT/openstreetmap-carto.style --multi-geometry --tag-transform-script ~/src/SomeoneElse-style/style.lua ~/data/output.pbf //Загружаем наши объединенные карты

Компилируем наши стили

Если ваш веб-сервер и сервер базы данных находятся на разных хостах, то перед тем, как скомпилировать стили, нам необходимо внести правки в файл “project.mml”

  1. Находим файл “project.mml” по адресу:  ~src/openstreet-carto-AJT и копируем на наш компьютер
  2. Открываем файл любым текстовым редактором или редактором кода
  3. Находим все строки содержащие слова  «type»: «postgis»,
    Пример:
    «Datasource»: {
    «type»: «postgis»,
            …other string,
    «dbname»: «gis»
    },
  4. И после «dbname»: «gis» добавляем строки со следующим содержанием.
    «name»: «tileserver»,
    «password»: «qwe-123»,
    «host»: «сюда вводим ip адрес нашего postgres сервера»
  5. После отправляем наш файл обратно на сервер и заменяем предыдущий

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

После проделанных манипуляций можно компилировать стили. Если сервер и база находятся на одном сервере, то просто компилируйте стили без изменения project.mml

cd ~/src/openstreetmap-carto-AJT
carto project.mml > mapnik.xml

Загрузка низкоуровневых данных, таких как границы государств, морей и океанов.

cd ~/src/openstreetmap-carto-AJT //Переходим в папку
sh -x get-shapefiles.sh //запускаем скрипт, который загружает shape файлы мира.

Конфигурируем renderd файл

sudo nano /usr/local/etc/renderd.conf

Находим секцию «renderd» строку  num_threads=4 и меняем  ее на: num_threads=*колво вашей оперативной памяти в гб.* Если у вас 8 гигабайт ОЗУ, то ставим 8.

Находим секцию “AJT” и в ней меняем следующую строку:
XML=/home/renderaccount/src/openstreetmap-carto-AJT/mapnik.xml
renderaccount меняем на имя своего пользователя. В данном случае tileserver.

Получиться должно вот так:
XML=/home/tileserver/src/openstreetmap-carto-AJT/mapnik.xml

Параметр URI должен быть следующего вида: uri: /osm/
osm —
это адрес при доступе к картам в браузере. http://localhost/osm/0/0/0.png

Настраиваем Apache

sudo mkdir /var/lib/mod_tile //создаем папку mod_tile. Куда сервер будет складывать наши тайлы.
sudo chown tileserver /var/lib/mod_tile //даём права пользователю tileserver на папку.
sudo mkdir /var/run/renderd //Создаем папку для renderd, чтобы мы могли рендерить карты
sudo chown tileserver /var/run/renderd //даём права пользователю tileserver на папку.

Изменяем файл mod_tile.conf

sudo nano /etc/apache2/conf-available/mod_tile.conf 

и добавляем туда следующую строку:

LoadModule tile_module /usr/lib/apache2/modules/mod_tile.so

Сохраняем и перезапускаем mod_tile.

sudo a2enconf mod_tile //получаем сообщение: "service apache2 reload"

Изменяем файл кофигурации apache

sudo nano /etc/apache2/sites-available/000-default.conf

Между строками «ServerAdmin» и «DocumentRoot» вставляем следующий текст:

       LoadTileConfigFile /usr/local/etc/renderd.conf
       ModTileRenderdSocketName /var/run/renderd/renderd.sock
       # Timeout before giving up for a tile to be rendered
       ModTileRequestTimeout 0
       # Timeout before giving up for a tile to be rendered that is otherwise missing
       ModTileMissingRequestTimeout 30

Так же строку  <VirtualHost *:80> необходимо изменить на <VirtualHost *:8081>
Здесь вы можете указать любой порт, но только, чтобы он не конфликтовал с другими!

Изменяем файл конфигурации apache2.

sudo nano /etc/apache2/ports.conf

И изменяем строчку Listen: 80 на Listen: 8081

Перезапускаем сервис apache2 два раза!

sudo service apache2 reload
sudo service apache2 reload

Для проверки работоспособности веб-сервера можете открыть страницу с адресом http://localhost в браузере. В ответ вам отобразиться стандартная страница apache2.

Запускаем renderd в реальном времени.

renderd -f -c /usr/local/etc/renderd.conf

Эта команда запустит рендеринг карты со всеми логами и загрузками шрифтов в реальном времени. Могут выходить некоторые «ворнинги» о том, что не найден шрифт. Об этом не стоит беспокоиться, потому что все необходимые шрифты мы установили ранее.  Если нет никаких критических ошибок, то можно открыть новый терминал и ввести следующий адрес: wget http://localhost/osm/0/0/0.png
По итогу у вас в терминале должна произойти загрузка «тайла» в формате .png.

Запускаем renderd в фоновом режиме.

Для начала необходимо изменить root пользователя на не root.

sudo nano ~/src/mod_tile/debian/renderd.init //редактируем файл

Поменяем пользователя “RUNASUSER” на нашего пользователя. К примеру, tileserver

После делаем следующие изменения:

sudo cp ~/src/mod_tile/debian/renderd.init /etc/init.d/renderd
sudo chmod u+x /etc/init.d/renderd
sudo cp ~/src/mod_tile/debian/renderd.service /lib/systemd/system/

После этого запускаем сервис

sudo /etc/init.d/renderd start

И включаем наш сервис

sudo systemctl enable renderd

Проверяем рендеринг наших тайлов в фоне

tail -f /var/log/syslog | grep " TILE " //вывод: « Sep 16 05:41:12 localhost renderd[82277]: DEBUG: START TILE ajt 7 80-87 24-31, new metatile»

Настройка nginx на веб-сервере.

Настройка редиректа на 8080 порт в nginx.

Сначала необходимо отредактировать файл /etc/nginx/sites-enabled/default и в блок server добавить следующее:

location ~* ^/osm/([0-9]+)/([0-9]+)/([0-9]+)\.png$ {
                proxy_pass      http://localhost:8081;
                access_log      off;
                autoindex       off;
                expires         1d;
                add_header      Cache-Control   'public';
        }

Перезапускаем nginx

sudo systemctl stop nginx
sudo systemctl start nginx

Для проверки работы нашего сервера можно посмотреть запускаемые тайлы в логах следующей командой:

tail -f /var/log/syslog | grep " TILE "

Готово. Теперь у нас есть рабочий сервер, который автоматически стартует при перезагрузке.

Print Friendly, PDF & Email