OpenStreetMap (OSM) представляет собой глобальную карту, доступную для редактирования любыми пользователями. Эту платформу можно рассматривать как альтернативу Google Maps, обладающую открытым исходным кодом и возможностью хостинга на собственных серверах. В данном руководстве вы ознакомитесь с процессом создания собственного сервера тайлов OpenStreetMap на Debian 12, что позволит вам обойтись без платных картографических сервисов.
Содержание статьи
- 1 Уникальные черты OpenStreetMap
- 2 Предварительные условия/Аппаратные требования
- 3 Обновление ПО
- 4 Установка сервера базы данных PostgreSQL и модуля PostGIS
- 5 Загрузите стиль карты и информацию о карте
- 6 Улучшение производительности сервера PostgreSQL
- 7 Применяйте Screen для работы на удалённых серверах
- 8 Загрузка данных карты в PostgreSQL
- 9 Инсталляция Renderd и модуля mod_tile
- 10 Создание стиля Mapnik
- 11 Выполните установку шрифтов
- 12 Выполните настройку renderd
- 13 Конфигурация Apache
- 14 Отображение вашей веб-карты с плитками
- 15 Предварительная визуализация плиток
- 16 Активировать HTTPS
- 17 Активируйте HTTP2
- 18 Ограничьте доступ к вашему тайловому серверу OSM, используя заголовок HTTP Referrer
- 19 Автоматическое обновление TLS сертификата
- 20 PostgreSQL база данных и веб-сервер находятся на отдельных хостах.
Уникальные черты OpenStreetMap
- Данные OpenStreetMap охватывают глобальную территорию, что упрощает оказание поддержки пользователям из разных стран.
- OpenStreetMap обновляется каждую минуту, и вы можете получать эти обновления в реальном времени.
- Данные OpenStreetMap доступны бесплатно и являются открытыми — нет необходимости в подписке или оплате за доступ к страницам.
- Данные OpenStreetMap обширны и подробно проработаны, включая множество сведений, которые имеют значение для местных жителей — тех, кто их собрал.
Предварительные условия/Аппаратные требования
Количество оперативной памяти и объём дискового пространства, требуемые для работы, зависят от карты страны, которую вы планируете использовать. Например,
- Для использования карты Великобритании необходимо минимум 12 ГБ оперативной памяти и 100 ГБ свободного места на диске.
- Для отображения карты всей Земли необходимо минимум 32 ГБ оперативной памяти и 1 ТБ SSD. Обычный жесткий диск не подходит для работы с картой всего мира.
Для ускорения загрузки карты в веб-браузере настоятельно рекомендуется предварительно отрендерить тайлы, что потребует больше дискового пространства. Чтобы узнать, сколько места нужно для предварительной отрисовки тайлов, проверьте соответствующую страницу. К примеру, если вы планируете предварительно отрендерить тайлы с уровнем масштабирования от 0 до 15 для карты Земли, вам потребуется дополнительно 460 ГБ дискового пространства.
Импорт крупных геоданных, например, глобальной карты, в базу данных PostgreSQL требует значительного времени. Рекомендуется увеличить объем оперативной памяти и, в частности, заменить стандартный жесткий диск на SSD, чтобы ускорить процесс импорта.
Если вы планируете установить карту мира, советую рассмотреть возможность приобретения большого VPS от Contabo, который обладает
- Десятиъядерный процессор
- 60 гигабайт оперативной памяти
- 1.6 ТБ SSD на базе Intel Optane
Стоимость составляет всего 26,99 € в месяц.
Обновление ПО
Регулярное обновление серверного ПО перед проведением любых значительных операций на сервере — это важная практика. Подключитесь к своему серверу через SSH и выполните следующую команду.
sudo apt update; sudo apt upgrade
При возникновении следующих ошибок,
perl: warning: Falling back to a fallback locale ("en_US. UTF-8"). perl: warning: Setting locale failed. perl: warning: Please check that your locale settings: LANGUAGE = (unset), LC_ALL = (unset), LC_MONETARY = "zh_CN. UTF-8", LC_ADDRESS = "zh_CN. UTF-8", LC_TELEPHONE = "zh_CN. UTF-8", LC_NAME = "zh_CN. UTF-8", LC_MEASUREMENT = "zh_CN. UTF-8", LC_IDENTIFICATION = "zh_CN. UTF-8", LC_NUMERIC = "zh_CN. UTF-8", LC_PAPER = "zh_CN. UTF-8", LANG = "en_US. UTF-8" are supported and installed on your system. perl: warning: Falling back to a fallback locale ("en_US. UTF-8").
Это указывает на то, что ваш локальный компьютер пытается передать переменную окружения локали на VPS с Debian, однако в данной системе локаль не настроена. Чтобы устранить эту проблему, внесите изменения в файл конфигурации SSH-демона.
sudo nano /etc/ssh/sshd_config
Прокрутите страницу до самого низа, и вы наткнётесь на строку, которая указывает демону SSH принимать переменные окружения от SSH-клиента.
AcceptEnv LANG LC_*
Поменяйте её на следующую, чтобы демон SSH не обрабатывал переменные окружения.
AcceptEnv no
Сохраните файл и закройте его. После этого перезапустите SSH-демон.
sudo systemctl restart ssh
Выйдите из системы и зайдите снова. Ошибка локали больше не появится.
Установка сервера базы данных PostgreSQL и модуля PostGIS
Для хранения данных карты мы выберем postgresql.Команда PostgreSQL постоянно работает над повышением производительности в каждой новой версии. Чтобы установить последнюю версию PostgreSQL, выполните следующие четыре команды.
echo "deb [signed-by=/etc/apt/keyrings/postgresql.asc] http://apt.postgresql.org/pub/repos/apt $(lsb_release - cs)-pgdg main" | sudo tee /etc/apt/sources. list. d/pgdg.list sudo mkdir - p /etc/apt/keyrings/ wget --quiet - O - https://www. postgresql.org/media/keys/ACCC4CF8.asc | sudo tee /etc/apt/keyrings/postgresql.asc sudo apt update sudo apt install - y postgresql postgresql-contrib postgresql-15 postgresql-client-15
Далее необходимо установить PostGIS, геопространственное расширение для PostgreSQL.
sudo apt install postgis postgresql-15-postgis-3
Сервер базы данных PostgreSQL запустится автоматически и начнет прослушивание на 127.0.0.1:5432. В процессе установки будет создан пользователь postgres в операционной системе. Этот пользователь является суперпользователем для postgresql.По умолчанию пароль для него не установлен, и нет необходимости его задавать, так как вы можете воспользоваться командой sudo для переключения на пользователя postgres и доступа к серверу PostgreSQL.
sudo - u postgres - i
Теперь у вас есть возможность создать пользователя базы данных PostgreSQL с именем osm.
createuser osm
Создайте базу данных под названием gis и установите владельцем базы данных пользователя osm. Пожалуйста, не изменяйте название базы данных, так как другие инструменты, такие как Renderd и Mapnik, ожидают наличия базы данных с именем gis.
createdb - E UTF8 - O osm gis
Затем необходимо установить расширения postgis и hstore в базу данных gis.
psql - c "CREATE EXTENSION postgis;" - d gis psql - c "CREATE EXTENSION hstore;" -d gis
Установите osm в качестве владельца таблицы.
psql - c "ALTER TABLE spatial_ref_sys OWNER TO osm;" -d gis
Выйдите из учетной записи пользователя postgres.
exit
Создайте пользователя с именем osm в вашей операционной системе, чтобы сервер тайлов мог функционировать под его учетной записью. Используйте следующую команду для создания системного пользователя без пароля.
sudo adduser --system --group --home /home/osm/ osm
Загрузите стиль карты и информацию о карте
Перейдите в основной каталог osm.
cd /home/osm/
Используйте следующую команду для назначения прав вашей учетной записи. Не забудьте заменить «username» на ваше фактическое имя пользователя.
sudo apt install acl sudo setfacl - R - m u:username:rwx /home/osm/
Используйте git, чтобы загрузить свежие стили карт CartoCSS в домашнюю папку пользователя osm.
sudo apt install git git clone https://github.com/gravitystorm/openstreetmap-carto. git
После этого выполните одну из следующих команд для загрузки карты в формате PBF (ProtoBufBinary).
Соединенное Королевство и Республика Ирландия (1.7G)
wget - c http://download.geofabrik. de/europe/britain-and-ireland-latest. osm. pbf
Европа (25.8 ГБ)
wget - c http://download.geofabrik. de/europe-latest.osm.pbf
Североамериканский континент (11.8G)
wget - c http://download.geofabrik. de/north-america-latest.osm.pbf
Южноамериканский континент (2.9G)
wget - c http://download.geofabrik. de/south-america-latest.osm.pbf
Центральноамериканский регион (570 МБ)
wget - c http://download.geofabrik. de/central-america-latest.osm.pbf
Азия (11,2 Гб)
wget - c http://download.geofabrik. de/asia-latest.osm.pbf
Африка (5.5G)
wget - c http://download.geofabrik. de/africa-latest.osm.pbf
Целая планета (66G). Обратите внимание: загрузку карты всей планеты следует производить только в том случае, если это действительно необходимо для отображения карты мира. В противном случае вы рискуете потратить время, ожидая, пока сервер тайлов обработает ненужную информацию.
wget - c http://planet. openstreetmap. org/pbf/planet-latest. osm. pbf
wget - c https://download.bbbike. org/osm/planet/planet-latest. osm. pbf
Если вам требуется карта определённой страны, штата, провинции или города, посетите сайт http://download.geofabrik.de. Кроме того, на BBBike. org доступны данные для свыше 200 городов и регионов по всему миру в различных форматах.
Улучшение производительности сервера PostgreSQL
Импорт данных может потребовать времени. Для того чтобы сделать этот процесс более быстрым, можно изменить некоторые настройки сервера PostgreSQL, что улучшит его производительность. Для этого откройте основной конфигурационный файл PostgreSQL и внесите необходимые изменения.
sudo nano /etc/postgresql/15/main/postgresql.conf
В первую очередь обновим значение shared_buffer. Значение по умолчанию составляет:
shared_buffers = 128MB
Это недостаточно. Обычно его следует установить на уровне 25% от общего объема оперативной памяти (не включая swap). К примеру, у моего VPS 60 ГБ ОЗУ, и я устанавливаю:
shared_buffers = 15GB
Определите следующий ряд.
#work_mem = 4MB #maintenance_work_mem = 64MB
Значение снова оказывается слишком низким. Я применяю такие параметры.
work_mem = 1GB maintenance_work_mem = 8GB
После этого обнаружьте следующую строку.
#effective_cache_size = 4GB
Если у вас достаточно оперативной памяти, как у меня, вы можете задать большее значение для параметра effective_cache_size, например, 20 ГБ.
effective_cache_size = 20GB
Сохраните файл и закройте его. Перезапустите PostgreSQL, чтобы изменения начали действовать.
sudo systemctl restart postgresql
По умолчанию PostgreSQL старается использовать большие страницы в оперативной памяти. Тем не менее, в Linux большие страницы не выделяются автоматически. Убедитесь, что вы проверили идентификатор процесса PostgreSQL.
sudo head -1 /var/lib/postgresql/15/main/postmaster.pid
7031
После этого проверьте значение VmPeak для данного идентификатора процесса.
grep ^VmPeak /proc/7031/status
VmPeak: 16282784 kB
Это предельный объем памяти, который будет задействован postgresql.Теперь необходимо проверить размер больших страниц в операционной системе Linux.
cat /proc/meminfo | grep - i huge
AnonHugePages: 0 kB ShmemHugePages: 0 kB HugePages_Total: 0 HugePages_Free: 0 HugePages_Rsvd: 0 HugePages_Surp: 0 Hugepagesize: 2048 kB Hugetlb: 0 kB
Можно определить количество больших страниц, необходимых для использования. Для этого разделите значение VmPeak на размер одной большой страницы: 16282784 кБ / 2048 кБ = 7950. Далее необходимо внести изменения в файлы sysctl для настройки параметров ядра Linux. Вместо изменения файла /etc/sysctl.conf мы создадим отдельный конфигурационный файл, чтобы ваши настройки не потерялись при обновлении программного обеспечения.
sudo touch /etc/sysctl. d/60-custom.conf
Далее выполните команду, чтобы зарезервировать 7950 больших страниц.
echo "vm. nr_hugepages = 7950" | sudo tee - a /etc/sysctl. d/60-custom.conf
Сохраните файл и закройте его. Внесите изменения.
sudo sysctl - p /etc/sysctl. d/60-custom.conf
Если вы вновь взглянете на meminfo,
cat /proc/meminfo | grep - i huge
Мы обнаружим, что в наличии имеется 7950 крупных страниц.
AnonHugePages: 0 kB ShmemHugePages: 0 kB HugePages_Total: 7950 HugePages_Free: 7950 HugePages_Rsvd: 0 HugePages_Surp: 0 Hugepagesize: 2048 kB Hugetlb: 16281600 kB
Перезапустите PostgreSQL для активации поддержки больших страниц.
sudo systemctl restart postgresql
Применяйте Screen для работы на удалённых серверах
Учитывая, что импорт может занять продолжительное время, и ваш компьютер может не иметь доступа к Интернету, рекомендуется воспользоваться утилитой screen для поддержания активной сессии. Установите screen на сервере Debian 12:
sudo apt install screen
После этого активируйте screen:
screen
При первом запуске вам будет представлен текст приветствия. Просто нажмите Enter, чтобы завершить это действие. После этого вы сможете выполнять команды в обычном режиме.
Загрузка данных карты в PostgreSQL
Для импорта данных карт необходимо установить osm2pgsql, который конвертирует информацию OpenStreetMap в базы данных PostgreSQL с поддержкой postGIS.
sudo apt install osm2pgsql
Выдайте права пользователю postgres.
sudo setfacl - R - m u:postgres:rwx /home/osm/
Перейдите на пользователя postgres.
sudo - u postgres - i
Выполните следующую команду для загрузки стиля карты и данных карты в базу данных gis, заменив great-britain-latest. osm. pbf на ваш собственный файл с картографическими данными.
osm2pgsql --slim - d gis --hstore --multi-geometry --number-processes 10--tag-обработчик-скрипт /home/osm/openstreetmap-carto/openstreetmap-carto. lua --стиль /home/osm/openstreetmap-carto/openstreetmap-carto. style - C32000 /home/osm/great-britain-latest.osm.pbf
- —slim : использовать режим slim вместо стандартного. Этот параметр нужен, если планируется обновление данных карты с помощью файлов изменений OSM (OSC) в дальнейшем.
- Выберите нужную базу данных.
- —hstore: добавлять теги в формате ключ/значение в отдельный столбец hstore в таблицах PostgreSQL без создания дополнительных столбцов.
- —multi-geometry : создание объектов с несколькими геометриями в таблицах PostgreSQL.
- Укажите путь к файлу стиля.
- —number-processes : число процессорных ядер на вашем сервере. У меня их 10.
- Флаг — C задает размер кэша в мегабайтах. Он должен составлять примерно 70% от объема свободной оперативной памяти на вашем устройстве. Увеличение размера кэша ускоряет процесс импорта данных. К примеру, на моем сервере доступно 60 ГБ оперативной памяти, поэтому я могу установить значение — C на 32000. Важно помнить, что PostgreSQL также требует часть памяти для параметра shared_buffers. Для расчета подходящего размера кэша используйте следующую формулу: (Общая ОЗУ — shared_buffers PostgreSQL) * 70%.
- В итоге необходимо указать расположение файла с данными карты.

При импорте полных данных карты мира рекомендуется использовать параметры —drop и —flat-nodes, чтобы ускорить процесс. Учтите, что параметр —flat-nodes не рекомендуется для небольших карт.
osm2pgsql --slim - d gis --удалить --плоские-узлы /домашний/осм/узлы.кэш --hstore --многогранная-геометрия --количество-процессов 10 --tag-обработчик-скрипт /home/osm/openstreetmap-carto/openstreetmap-carto. lua --стиль /home/osm/openstreetmap-carto/openstreetmap-carto. style - C32000 /home/osm/planet-latest.osm.pbf
Потребление оперативной памяти будет постепенно расти в ходе импорта. Теперь, скорее всего, вам не требуется выполнять другие действия на вашем сервере. Если вы используете Screen, просто нажмите Ctrl+A, отпустите клавиши и затем нажмите D, чтобы отсоединиться от текущей сессии Screen. Вы увидите сообщение, похожее на следующее.
[detached from 32113.pts-1.buster]
Это означает, что идентификатор последней сессии Screen — 32113. Вы можете завершить SSH-сессию и даже отключить компьютер. Не переживайте, процесс импорта OSM продолжает работать. Когда вам понадобится вернуться и узнать о ходе импорта, подключитесь к вашему серверу через SSH и выполните следующую команду для получения идентификатора последней сессии Screen.
screen - ls
Существует экран: 32113.pts-1.buster (19.05.2020 15:45:29) (Отсоединен) 1 сокет в /run/screen/S-linuxbabe.
После этого у вас будет возможность снова подключиться к предыдущей сессии Screen.
screen - r 32113
Вы сможете возобновить свою работу. После завершения импорта предоставьте все права на базу данных gis пользователю osm.
psql - c "GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO osm;" - d gis
Выйдите из учетной записи пользователя postgres.
exit
Примечание: Если процесс импорта osm2pgsql еще не завершен, пожалуйста, не переходите к шагу 6.
Инсталляция Renderd и модуля mod_tile
- renderd — это служебная программа, предназначенная для рендеринга тайлов OpenStreetMap на основе данных из базы данных PostgreSQL.
- mod_tile — это модуль для Apache, предназначенный для предоставления тайлов пользователям, таким как веб-браузеры.
Их можно установить из обычного программного репозитория Debian 12.
sudo apt install apache2 libapache2-mod-tile renderd
Конфигурационный файл для renderd будет размещен по пути /etc/apache2/conf-available/renderd.conf.Активируйте модуль тайлов.
sudo a2enmod tile
Затем настройте виртуальный хост для сервера тайлов.
sudo nano /etc/apache2/sites-available/tileserver_site.conf
Включите указанные строки в данный файл. Поменяйте tile. your-domain.com на ваше фактическое доменное имя. Не забудьте создать DNS A запись.
ServerName tile.your-domain.com Корень документа: /var/www/ Уровень логирования: информацияOptions Indexes FollowSymLinks MultiViews AllowOverride None Require all granted
ModTileTileDir /var/cache/renderd/tiles
LoadTileConfigFile /etc/renderd.conf
ModTileEnableStats On
ModTileBulkMode Off
ModTileRequestTimeout 3
ModTileMissingRequestTimeout 10
ModTileMaxLoadOld 2
ModTileMaxLoadMissing 5
ModTileRenderdSocketName /run/renderd/renderd. sock
ModTileCacheDurationMax 604800
ModTileCacheDurationDirty 900
ModTileCacheDurationMinimum 10800
ModTileCacheDurationMediumZoom 1386400
ModTileCacheDurationLowZoom 9518400
ModTileCacheLastModifiedFactor 0.20
ModTileEnableTileThrottling Off
ModTileEnableTileThrottlingXForward 0
ModTileThrottlingTiles 10000 1
ModTileThrottlingRenders 128 0.2
Сохраните изменения и закройте документ. Активируйте данный виртуальный хост.
sudo a2ensite tileserver_site.conf
Для того чтобы изменения начали действовать, перезапустите Apache.
sudo systemctl restart apache2
Демон рендеринга начнет свою работу автоматически, что можно будет наблюдать с помощью:
systemctl status renderd
Создание стиля Mapnik
Установите нужные библиотеки.
sudo apt install curl unzip gdal-bin mapnik-utils libmapnik-dev python3-pip nodejs npm
После этого установите пакет carto через npm.
sudo npm install - g carto
Установите библиотеки Python: yaml и psycopg2.
sudo apt install python3-pretty-yaml python3-yaml python3-psycopg2
Перейдите на пользователя postgres.
sudo - u postgres - i
Откройте раздел стилей carto.
cd /home/osm/openstreetmap-carto/
scripts/get-external-data. py

Если при выполнении указанной команды вы получили сообщение об ошибке, это указывает на проблему с DNS. Попробуйте подождать некоторое время и повторите запуск Python-скрипта.
Не удалось установить новое соединение: [Errno -3] Временная ошибка в разрешении имени
Теперь сгенерируйте XML-стили для Mapnik, воспользовавшись компилятором картографических стилей.
carto project. mml > style. xml
Назначьте пользователю osm полный доступ к базе данных gis.
psql - c "GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO osm;" - d gis
Выйдите из учетной записи пользователя postgres.
exit
Выполните установку шрифтов
Вам нужно установить пакет fonts-dejavu.
sudo apt install fonts-dejavu fonts-dejavu-web
Для отображения символов, отличных от латинских, установите указанные ниже пакеты.
sudo apt install fonts-noto-cjk fonts-noto-cjk-extra fonts-noto-hinted fonts-noto-unhinted fonts-unifont
Выполните настройку renderd
Измените файл настроек renderd.
sudo nano /etc/renderd.conf
В разделе [renderd] настройте количество потоков в зависимости от числа ядер процессора вашего сервера.
num_threads=10
Включите слой по умолчанию. Строки, которые начинаются с символа точки с запятой (;), представляют собой комментарии.
; ДОБАВЬТЕ ВАШИ СЛОИ: [default] URI=/osm/ XML=/home/osm/openstreetmap-carto/style. xml HOST=tile.your-domain.com

По умолчанию renderd поддерживает максимальный уровень масштабирования 18. Если вам требуется уровень масштабирования 19, внесите следующую строку в раздел [default].
MAXZOOM=19
Сохраните файл и закройте его. После этого создайте новую папку для службы renderd.
sudo mkdir /etc/systemd/system/renderd.service.d/
Сформируйте файл настроек в данном каталоге.
sudo nano /etc/systemd/system/renderd.service.d/custom.conf
Включите данные строки в данный файл.
[Service] User=osm
Сохраните файл и закройте его. Измените владельца для каталогов /run/renderd/ и /var/cache/renderd/tiles/.
sudo chown osm /run/renderd/ - R sudo chown osm /var/cache/renderd/tiles/ -R
После этого перезапустите сервис renderd.
sudo systemctl daemon-reload sudo systemctl restart renderd
Необходимо просмотреть журнал renderd.
sudo journalctl - eu renderd
После перезапуска убедитесь, что в журнале нет ошибок от renderd, иначе карта не загрузится.
Конфигурация Apache
Введите в адресную строку вашего браузера
tile. your-domain.com/osm/0/0/0.png
Теперь перед вами должен появиться тайл мировой карты. Поздравляем! Вы успешно настроили собственный сервер тайлов OSM.

Если у вас активирован брандмауэр UFW, убедитесь, что порты 80 и 443 открыты, выполнив следующую команду.
sudo ufw allow 80,443/tcp
Если при загрузке карты мира появляется ошибка 404 not found, подождите несколько минут и обновите страницу в браузере. Если проблема не исчезает, попробуйте перезапустить службу renderd с помощью команды (sudo systemctl restart renderd).
Отображение вашей веб-карты с плитками
Существует термин «слайппи карта», который используется в OpenStreetMap для обозначения плиточной веб-карты. Для работы с такими картами доступны две бесплатные и открытые JavaScript-библиотеки: OpenLayer и Leaflet. Основным преимуществом Leaflet является его простота в использовании, а также удобство отображения карты на мобильных устройствах.
Для отображения вашей карты слайппи с использованием OpenLayer, загрузите JavaScript и CSS с сайта openlayer. org и поместите их в каталог корневого веб-сервера.
cd /var/www/ sudo wget https://github.com/openlayers/openlayers/releases/download/v5.3.0/v5.3.0.zip sudo unzip v5.3.0.zip
Далее создайте файл под названием index. html.
sudo nano /var/www/index. html
Добавьте приведённый HTML-код в ваш файл. Измените текст, который выделен красным, а также настройте долготу, широту и уровень масштабирования в зависимости от ваших требований.
Сохраните файл и закройте его. Теперь вы можете открыть вашу слайппи-карту, введя поддомен в адресной строке браузера.
tile. your-domain.com
tile. your-domain.com/index. html
Для отображения вашей слайппи карты с использованием Leaflet, скачайте JavaScript и CSS с сайта leftletjs.com и поместите их в директорию веб-корня.
cd /var/www/html/ sudo wget http://cdn. leafletjs.com/leaflet/v1.9.4/leaflet.zip sudo unzip leaflet.zip
Далее создайте файл под названием index. html.
sudo nano /var/www/index.html
Добавьте приведённый HTML-код в ваш файл. Измените текст, который выделен красным, а также настройте долготу, широту и уровень масштабирования в зависимости от ваших требований.
Сохраните файл и закройте его. Теперь у вас есть возможность открыть вашу слайппи карту, введя IP-адрес сервера в адресной строке браузера.
tile. your-domain.com
tile. your-domain.com/index. html

Предварительная визуализация плиток
Создание тайлов в реальном времени может увеличить время загрузки карты в браузере. Чтобы предварительно создать тайлы вместо их динамической отрисовки, воспользуйтесь командой render_list. Укажите уровень масштабирования с помощью флагов — z и — Z, а количество потоков настройте в соответствии с числом ядер CPU на вашем сервере. Команда render_list генерирует список тайлов карты, отправляя запросы к демону отрисовки. Предварительно созданные тайлы будут сохраняться в каталоге /var/lib/mod_tile.
render_list - m default - a - z 0 - Z 19 --num-threads=10
Если вы обновите информацию о карте позже, вы сможете снова предварительно отрисовать все тайлы, воспользовавшись опцией —force.
render_list - m default - a - z 0 - Z 19 --num-threads=10 --force
Для того чтобы выполнять отрисовку тайлов карты в фоновом режиме, добавьте символ & в конец.
render_list - m default - a - z 0 - Z 19 --num-threads=10 &
Теперь вы можете закрыть окно терминала. Для проверки прогресса отрисовки откройте новую SSH-сессию и введите следующую команду.
sudo journalctl - eu renderd
Указанная команда отобразит последние логи сервиса renderd. Далее приведенные строки свидетельствуют о том, что мой сервер OSM в данный момент генерирует тайлы карты с уровнем масштабирования 12.
renderd[20838]: DEBUG: START TILE default 12 1008-1015 4056-4063, new metatile renderd[20838]: Rendering projected coordinates 12 1008 4056 -> -10175297.205328|-19724422.274944 -10097025.688364|-19646150.757980 to a 8 x 8 tile renderd[20838]: DEBUG: DONE TILE default 12 1008-1015 3984-3991 in 0.799 seconds renderd[20838]: DEBUG: Sending render cmd(3 default 12/1008/3984) with protocol version 2 to fd 18 renderd[20838]: DEBUG: Got incoming request with protocol version 2 renderd[20838]: DEBUG: Got command RenderBulk fd(18) xml(default), z(12), x(1008), y(4064), mime(image/png), options() renderd[20838]: DEBUG: START TILE default 12 1008-1015 4064-4071, new metatile renderd[20838]: Rendering projected coordinates 12 1008 4064 -> -10175297.205328|-19802693.791908 -10097025.688364|-19724422.274944 to a 8 x 8 tile
Активировать HTTPS
Для шифрования HTTP-трафика можно получить и установить бесплатный TLS сертификат от Let’s Encrypt. В первую очередь, нужно установить клиент Let’s Encrypt (certbot) на систему Debian 12.
sudo apt install certbot
Поскольку мы применяем веб-сервер Apache, необходимо установить соответствующий плагин для него.
sudo apt install python3-certbot-apache
После этого выполните следующую команду для получения и установки TLS сертификата.
sudo certbot --apache --agree-tos --redirect --hsts --staple-ocsp --must-staple --email -d tile.your-domain.com
После того как сертификат будет установлен, обновите страницу, и в адресной строке появится значок замка.

При появлении желтого треугольника в адресной строке Firefox это указывает на то, что URL-адреса тайлов по-прежнему используют протокол HTTP. Чтобы исправить это, вам необходимо отредактировать файл index. html и заменить все вхождения HTTP на HTTPS с помощью следующей команды.
sudo sed - i 's/http/https/g' /var/www/index. html
Активируйте HTTP2
Для дальнейшего повышения скорости загрузки карты рекомендуется активировать протокол HTTP2. Для этого сначала следует включить модуль HTTP2.
sudo a2enmod http2
После этого откройте файл виртуального хоста для SSL.
sudo nano /etc/apache2/sites-enabled/tileserver_site-le-ssl.conf
Вставьте следующую команду сразу после начального тега.
Protocols h2 http/1.1
Сохраните файл и закройте его. После этого перезапустите Apache, чтобы изменения начали действовать.
sudo systemctl restart apache2
Ограничьте доступ к вашему тайловому серверу OSM, используя заголовок HTTP Referrer
Любой желающий может воспользоваться OpenLayer или Leaflet для создания карты с возможностью скольжения, используя URL вашего сервера тайлов. Чтобы ограничить доступ к вашему серверу тайлов, необходимо внести изменения в конфигурацию виртуального хоста Apache.
sudo nano /etc/apache2/sites-enabled/tileserver_site-le-ssl.conf
Вставьте указанные строки в теги.
Установите переменную окружения в зависимости от реферера.example.com Доверенный_реферер Order deny, allow Запретить для всех Разрешить только при наличии переменной среды trusted_referer
Этот код проверяет, содержит ли заголовок HTTP referer ваш собственный домен. В случае его отсутствия доступ к директории /osm будет заблокирован. Обратный слэш применяется для экранирования точки. Для добавления нескольких доменов в список доверенных рефереров используйте следующий формат.
SetEnvIf Referer (example\.com|www\.example\.com|map\.example\.com) trusted_referer
Закройте файл после сохранения и выполните проверку синтаксиса.
sudo apache2ctl - t
Перезагрузите Apache после проверки правильности синтаксиса, чтобы изменения начали действовать.
sudo systemctl reload apache2
Автоматическое обновление TLS сертификата
Вы можете настроить задачу Cron для автоматического обновления TLS сертификата. Для этого откройте файл crontab от имени пользователя root.
sudo crontab - e
Вставьте следующую строку в конец файла.
@daily certbot renew --quiet && systemctl reload apache2
PostgreSQL база данных и веб-сервер находятся на отдельных хостах.
В случае, если PostgreSQL и веб-сервер Apache размещены на разных серверах, необходимо внести изменения в файл project. mml на сервере Apache.
nano /home/osm/openstreetmap-carto-4.20.0/project. mml
Найдите следующие фрагменты текста:
osm2pgsql: &osm2pgsql type: "postgis" dbname: "gis" key_field: "" geometry_field: "way" extent: "-20037508,-20037508,20037508,20037508"
Введите IP-адрес вашего сервера базы данных PostgreSQL.
osm2pgsql: &osm2pgsql type: "postgis" хост: "10.0.0.2" dbname: "gis" key_field: "" geometry_field: "way" extent: "-20037508,-20037508,20037508,20037508"
Сохраните файл и закройте его. После этого используйте компилятор стилей карт carto для создания XML-стилей для Mapnik.
carto project. mml > style. xml
Внесите изменения в основной конфигурационный файл на сервере базы данных PostgreSQL.
sudo nano /etc/postgresql/11/main/postgresql.conf
Включите следующую строку для настройки PostgreSQL на прослушивание всех сетевых интерфейсов.
listen_addresses = '*'
Сохраните и закройте документ. После этого внесите изменения в файл конфигурации для аутентификации клиента PostgreSQL.
sudo nano /etc/postgresql/11/main/pg_hba.conf
Вставьте данную строку в конец файла, чтобы разрешить пользователю osm подключаться с хоста Apache. Не забудьте заменить 10.0.0.1 на IP-адрес вашего Apache хоста.
host gis osm 10.0.0.1/32 trust
Сохраните изменения в файле и закройте его. После этого перезапустите PostgreSQL.
sudo systemctl restart postgresql
Перезапустите рендеринговый демон на сервере Apache.
sudo systemctl restart renderd
Проверьте журнал renderd. Убедитесь, что в нём отсутствуют ошибки, иначе карта не отобразится.
sudo journalctl - eu renderd
Рекомендуется ограничить доступ к порту 5432 вашего сервера postgresql.Например, вы можете воспользоваться следующей командой UFW, чтобы разрешить доступ исключительно с IP-адреса вашего хоста Apache.
sudo ufw allow in from 10.0.0.1 to any port 5432
Надеюсь, этот гид оказался полезным для вас в процессе настройки сервера тайлов OpenStreetMap на Debian 12. Возможно, вам также потребуется настроить сервер геокодирования Nominatim, чтобы обеспечить функциональность поиска.

