OpenStreetMap (OSM) es un mapa del mundo que los usuarios pueden editar libremente. Puede considerarlo como una alternativa de código abierto y autohospedado a Google Maps. Este tutorial le mostrará cómo construir su propio servidor de teselas OpenStreetMap en Debian 10 para que no tenga que usar un servicio de mapas propietario.
Características de OpenStreetMap
- Los datos de OpenStreetMap cubren todo el mundo, lo que facilita la asistencia a los usuarios en cualquier país o en todos los países.
- OpenStreetMap se actualiza cada minuto de cada hora de cada día, y estas actualizaciones están disponibles para usted en tiempo real.
- Los datos de OpenStreetMap son gratuitos y abiertos:no hay tarifa de suscripción ni tarifa de vista de página.
- Los datos de OpenStreetMap son ricos y detallados, y contienen enormes cantidades de datos que son relevantes para las personas sobre el terreno:las personas que los recopilaron.
Requisitos previos/Requisitos de hardware
La memoria RAM y el espacio en disco necesarios dependen del mapa del país que vaya a utilizar. Por ejemplo,
- El mapa del Reino Unido requiere al menos 12 GB de RAM y 100 GB de espacio en disco.
- Todo el mapa del planeta requiere al menos 32 GB de RAM y 1 TB de SSD (unidad de estado sólido). No es viable utilizar un disco duro giratorio para todo el mapa del planeta.
Necesitará más espacio en disco si va a renderizar mosaicos previamente para acelerar la carga del mapa en el navegador web, lo cual es muy recomendable. Consulte esta página de uso del disco de teselas para ver cuánto espacio en disco se requiere para la representación previa de teselas. Por ejemplo, si va a renderizar previamente mosaicos desde el nivel de zoom 0 hasta el nivel de zoom 15 para el mapa del planeta, se requiere un espacio de disco adicional de 460 GB.
Otra cosa a tener en cuenta es que importar datos de mapas grandes, como todo el planeta, a la base de datos PostgreSQL lleva mucho tiempo. Considere agregar más RAM y especialmente usar SSD en lugar de girar el disco duro para acelerar el proceso de importación.
Si vas a alojar todo el mapa del mundo, te recomiendo que compres el VPS extragrande de Contabo, que presume
- Una CPU de 10 núcleos
- 60 GB de RAM
- SSD Intel Optane de 1,6 TB
Cuesta solo 26,99 €/mes.
Paso 1:Actualización del software
Siempre es una buena práctica actualizar el software del servidor antes de realizar cualquier trabajo importante en su servidor. Inicie sesión en su servidor a través de SSH y ejecute el siguiente comando.
sudo apt update; sudo apt upgrade
Si encuentra los siguientes errores,
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").
Eso significa que su computadora local está tratando de enviar la variable de entorno del entorno local al VPS de Debian, pero Debian no tiene instalado el entorno local. Para solucionar esto, edite el archivo de configuración del demonio SSH.
sudo nano /etc/ssh/sshd_config
Desplácese hacia abajo hasta el final, encontrará la siguiente línea, que le indica al demonio SSH que acepte variables de entorno del cliente SSH.
AcceptEnv LANG LC_*
Cámbielo a lo siguiente, para que el demonio SSH no acepte variables de entorno.
AcceptEnv no
Guarde y cierre el archivo. Luego reinicie el demonio SSH.
sudo systemctl restart ssh
Cierra la sesión y vuelve a iniciarla. Ya no verás el error de configuración regional.
Paso 2:Instale el servidor de base de datos PostgreSQL y la extensión PostGIS
Usaremos PostgreSQL para almacenar datos de mapas. PostGIS es una extensión geoespacial de PostgreSQL. Ejecute los siguientes comandos para instalarlos.
sudo apt install postgresql postgresql-contrib postgis postgresql-11-postgis-2.5
El servidor de la base de datos PostgreSQL se iniciará automáticamente y escuchará en 127.0.0.1:5432
. El postgres
El usuario se creará en el sistema operativo durante el proceso de instalación. Es el superusuario del servidor de base de datos PostgreSQL. De forma predeterminada, este usuario no tiene contraseña y no es necesario establecer una porque puede usar sudo
para cambiar a postgres
usuario e inicie sesión en el servidor PostgreSQL.
sudo -u postgres -i
Ahora puede crear un usuario de base de datos PostgreSQL osm
.
createuser osm
Luego crea una base de datos llamada gis
y al mismo tiempo hacer osm
como propietario de la base de datos. -E UTF8
especifica que el esquema de codificación de caracteres que se usará en la base de datos es UTF8.
createdb -E UTF8 -O osm gis
A continuación, cree el postgis
y hstore
extensión para el gis
base de datos.
psql -c "CREATE EXTENSION postgis;" -d gis psql -c "CREATE EXTENSION hstore;" -d gis
Establecer osm
como propietario de la mesa.
psql -c "ALTER TABLE spatial_ref_sys OWNER TO osm;" -d gis
Salir de postgres
usuario.
exit
Crear osm
usuario en su sistema operativo para que el servidor de teselas pueda ejecutarse como osm
usuario. El siguiente comando creará un usuario del sistema sin contraseña.
sudo adduser --system osm
Paso 3:Descargue la hoja de estilo del mapa y los datos del mapa
Cambie al directorio de inicio de osm.
cd /home/osm/
Descargue las últimas hojas de estilo de mapas de CartoCSS en osm
directorio de inicio del usuario con git.
sudo apt install git git clone https://github.com/gravitystorm/openstreetmap-carto.git
Si ve el error "permiso denegado" mientras ejecuta el comando anterior, puede otorgar permisos con el siguiente comando. Reemplazar username
con tu nombre de usuario real.
sudo apt install acl sudo setfacl -R -m u:username:rwx /home/osm/
A continuación, ejecute el siguiente comando para descargar los datos del mapa de todo el planeta (50G) en formato PBF (ProtoBufBinary).
wget -c http://planet.openstreetmap.org/pbf/planet-latest.osm.pbf
Tenga en cuenta que las velocidades de descarga de openstreetmap.org actualmente están restringidas a 2048 KB/s. Puede descargar el mapa de la planta desde otro espejo, como
wget -c https://download.bbbike.org/osm/planet/planet-latest.osm.pbf
Si desea un mapa de un país/estado/provincia/ciudad individual, vaya a http://download.geofabrik.de. Además, BBBike.org ofrece extractos de más de 200 ciudades y regiones de todo el mundo en diferentes formatos. Por ejemplo, descargue los datos del mapa de Gran Bretaña (1.1G) con el siguiente comando.
wget -c http://download.geofabrik.de/europe/great-britain-latest.osm.pbf
Paso 4:optimizar el rendimiento del servidor PostgreSQL
El proceso de importación puede llevar algún tiempo. Para acelerar este proceso, podemos ajustar algunas configuraciones del servidor PostgreSQL para mejorar el rendimiento. Edite el archivo de configuración principal de PostgreSQL.
sudo nano /etc/postgresql/11/main/postgresql.conf
Primero, debemos cambiar el valor de shared_buffer
. La configuración predeterminada es:
shared_buffers = 128MB
Esto es demasiado pequeño. La regla general es establecerlo en el 25% de su RAM total (excluyendo el espacio de intercambio). Por ejemplo, mi VPS tiene 60 G de RAM, así que lo configuré en:
shared_buffers = 15GB
Busque la siguiente línea.
#work_mem = 4MB #maintenance_work_mem = 64MB
Una vez más, el valor es demasiado pequeño. Yo uso la siguiente configuración.
work_mem = 1GB maintenance_work_mem = 8GB
Luego busque la siguiente línea.
#effective_cache_size = 4GB
Si tiene mucha RAM como yo, puede establecer un valor más alto para el tamaño_caché_efectivo como 20G.
effective_cache_size = 20GB
Guarde y cierre el archivo. Reinicie PostgreSQL para que los cambios surtan efecto.
sudo systemctl restart postgresql
De forma predeterminada, PostgreSQL intentaría usar páginas enormes en la RAM. Sin embargo, Linux por defecto no asigna páginas grandes. Compruebe el ID de proceso de PostgreSQL.
sudo head -1 /var/lib/postgresql/11/main/postmaster.pid
Salida de muestra:
7031
Luego verifique el valor de VmPeak de este ID de proceso.
grep ^VmPeak /proc/7031/status
Salida de muestra:
VmPeak: 16282784 kB
Este es el tamaño máximo de memoria que utilizará PostgreSQL. Ahora compruebe el tamaño de la página enorme en Linux.
cat /proc/meminfo | grep -i huge
Salida de muestra:
AnonHugePages: 0 kB ShmemHugePages: 0 kB HugePages_Total: 0 HugePages_Free: 0 HugePages_Rsvd: 0 HugePages_Surp: 0 Hugepagesize: 2048 kB Hugetlb: 0 kB
Podemos calcular cuántas páginas grandes necesitamos. Divida el valor de VmPeak por el tamaño de la página grande:16282784 kB / 2048 kB =7950. Edite /etc/sysctl.conf
archivo.
sudo nano /etc/sysctl.conf
Agregue la siguiente línea para asignar 7950 páginas grandes.
vm.nr_hugepages = 7950
Guarde y cierre el archivo. Luego aplique los cambios.
sudo sysctl -p
Si vuelves a consultar el meminfo,
cat /proc/meminfo | grep -i huge
Podemos ver que hay 7950 páginas enormes disponibles.
AnonHugePages: 0 kB ShmemHugePages: 0 kB HugePages_Total: 7950 HugePages_Free: 7950 HugePages_Rsvd: 0 HugePages_Surp: 0 Hugepagesize: 2048 kB Hugetlb: 16281600 kB
Reinicie PostgreSQL para usar páginas grandes.
sudo systemctl restart postgresql
Usar pantalla en servidores remotos
Dado que el proceso de importación puede llevar mucho tiempo y su computadora puede estar desconectada de Internet, se recomienda usar la utilidad de pantalla para mantener activa su sesión. Pantalla de instalación en el servidor Debian 10:
sudo apt install screen
Luego pantalla de inicio:
screen
En el primer lanzamiento, verá un texto de introducción, simplemente presione Enter
para terminar. Entonces podrá ejecutar comandos como de costumbre.
Paso 5:Importe los datos del mapa a PostgreSQL
Para importar datos de mapas, necesitamos instalar osm2pgsql
que convierte los datos de OpenStreetMap en bases de datos PostgreSQL habilitadas para postGIS.
sudo apt install osm2pgsql
Otorgue permisos al usuario de postgres.
sudo setfacl -R -m u:postgres:rwx /home/osm/
Cambiar a postgres
usuario.
sudo -u postgres -i
Ejecute el siguiente comando para cargar la hoja de estilo del mapa y los datos del mapa en el gis
base de datos. Reemplace great-britain-latest.osm.pbf
con su propio archivo de datos de mapas.
osm2pgsql --slim -d gis --hstore --multi-geometry --number-processes 10 --tag-transform-script /home/osm/openstreetmap-carto/openstreetmap-carto.lua --style /home/osm/openstreetmap-carto/openstreetmap-carto.style -C 32000 /home/osm/great-britain-latest.osm.pbf
donde
--slim
:se ejecuta en modo delgado en lugar de modo normal. Esta opción es necesaria si desea actualizar los datos del mapa utilizando los archivos de cambios de OSM (OSC) en el futuro.-d gis
:seleccionar base de datos.--hstore
:agregue etiquetas sin columna a una columna hstore (clave/valor) adicional a las tablas de PostgreSQL--multi-geometry
:generar características multigeométricas en tablas postgresql.--style
:especifica la ubicación del archivo de estilo--number-processes
:número de núcleos de CPU en su servidor. tengo 10.-C
flag especifica el tamaño de caché en MegaBytes. Debería ser alrededor del 70% de la memoria RAM libre en su máquina. Un tamaño de caché más grande da como resultado una velocidad de importación más rápida. Por ejemplo, mi servidor tiene 60 GB de RAM libres, por lo que puedo especificar-C 32000
. Tenga en cuenta que PostgreSQL necesitará RAM para shared_buffers. Use esta fórmula para calcular qué tan grande debe ser el tamaño de la memoria caché:(Total RAM - PostgreSQL shared_buffers) * 70%
- Finalmente, debe especificar la ubicación del archivo de datos del mapa.
Salida de comando:
Si va a importar los datos completos del mapa del planeta, utilice --drop
y la opción --flat-nodes
opción para aumentar la velocidad de importación. Tenga en cuenta que --flat-nodes
La opción no es adecuada para mapas pequeños.
osm2pgsql --slim -d gis --drop --flat-nodes /home/osm/nodes.cache --hstore --multi-geometry --number-processes 10 --tag-transform-script /home/osm/openstreetmap-carto/openstreetmap-carto.lua --style /home/osm/openstreetmap-carto/openstreetmap-carto.style -C 32000 /home/osm/planet-latest.osm.pbf
El uso de RAM aumentará gradualmente durante el proceso de importación.
Ahora probablemente no necesite hacer otras cosas en su servidor. Ya que está utilizando Pantalla, puede presionar Ctrl+A , suelte esas teclas y luego presione D para desconectarse de la sesión de pantalla actual. Verá un mensaje como el siguiente.
[detached from 32113.pts-1.buster]
Esto me dice que el ID de sesión de pantalla anterior es 32113. Puede cerrar la sesión de SSH e incluso apagar su computadora. No te preocupes, el proceso de importación de OSM aún se está ejecutando. Cuando necesite regresar y verificar el progreso de la importación, acceda a SSH a su servidor y ejecute el siguiente comando para obtener el ID de sesión de pantalla anterior.
screen -ls
Salida de muestra:
There is a screen on: 32113.pts-1.buster (05/19/2020 03:45:29 PM) (Detached) 1 Socket in /run/screen/S-linuxbabe.
Luego puede volver a adjuntar a la sesión de pantalla anterior.
screen -r 32113
Y podrás continuar con tu trabajo. Una vez que se complete la importación, otorgue todos los privilegios de gis
base de datos al osm
usuario.
psql -c "GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO osm;" -d gis
Salir de postgres
usuario.
exit
Nota :Si la importación de osm2pgsql aún no ha terminado, no continúe con el paso 6.
Paso 6:Instalar mod_tile y Renderd
mod_tile
es un módulo de Apache que se requiere para servir mosaicos y renderd
es el demonio de renderizado para renderizar mosaicos de OpenStreetMap. El repositorio predeterminado de Debian Buster no incluye mod_tile
y renderd
, por lo que necesitamos compilar el código fuente.
Primero, instale la dependencia de compilación.
sudo apt install git autoconf libtool libmapnik-dev apache2-dev
Luego, clona el repositorio desde Github.
git clone https://github.com/openstreetmap/mod_tile.git cd mod_tile/
Editar un archivo.
nano debian/compat
De forma predeterminada, el nivel de compatibilidad está establecido en 7. Sin embargo, debe usar el nivel de compatibilidad 9, así que cambie el número 7 a 9. Guarde y cierre el archivo.
Luego edite otro archivo.
nano debian/changelog
Localice la primera línea.
libapache2-mod-tile (0.4-12~precise2) precise; urgency=low
Cámbialo por lo siguiente. 0.4-12
debe cambiarse a 0.4.12
y precise2
debe cambiarse a buster
.
libapache2-mod-tile (0.4.12~buster) precise; urgency=low
Guarde y cierre el archivo. Luego compila el paquete fuente.
./autogen.sh sudo dpkg-buildpackage -uc -us
Ahora habrá dos .deb
paquetes en el directorio superior. Instálelos con apt
.
cd .. sudo apt install ./libapache2-mod-tile_0.4.12~buster_amd64.deb ./renderd_0.4.12~buster_amd64.deb
Durante la instalación, instalará el servidor web Apache y le preguntará si desea habilitar mod_tile en la configuración de Apache. Seleccione Sí y presione Entrar. Esto creará un archivo de configuración de Apache para mod_tile (/etc/apache2/sites-available/tileserver_site.conf
).
El demonio de renderizado se iniciará automáticamente, como se puede ver con:
systemctl status renderd
Paso 7:Generar hoja de estilo de Mapnik
Instale los paquetes necesarios.
sudo apt install curl unzip gdal-bin mapnik-utils libmapnik-dev python3-pip python3-psycopg2
También necesitamos instalar nodejs y npm desde el repositorio ascendente con los siguientes comandos.
curl -sL https://deb.nodesource.com/setup_12.x | sudo -E bash - sudo apt-get install -y nodejs
Luego instale el paquete carto con npm.
sudo npm install -g carto
Instala el yaml
Módulo Python.
sudo -H pip3 install pyyaml
Cambiar a postgres
usuario.
sudo -u postgres -i
Cd en el directorio de estilo carto.
cd /home/osm/openstreetmap-carto/
Obtener archivos de formas.
scripts/get-external-data.py
Si encuentra el siguiente mensaje de error mientras ejecuta el comando anterior, entonces tiene problemas de DNS. Simplemente espere unos minutos y vuelva a ejecutar el script de Python.
Failed to establish a new connection: [Errno -3] Temporary failure in name resolution
Ahora crea la hoja de estilo XML de Mapnik con el carto
compilador de hojas de estilo de mapa.
carto project.mml > style.xml
Otorgar todos los privilegios del gis
base de datos al osm
usuario.
psql -c "GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO osm;" -d gis
Salir de postgres
usuario.
exit
Paso 8:Instalar fuentes
Necesitas instalar el ttf-dejavu
paquete.
sudo apt install ttf-dejavu
Para mostrar caracteres no latinos, instale los siguientes paquetes.
sudo apt install fonts-noto-cjk fonts-noto-cjk-extra fonts-noto-hinted fonts-noto-unhinted ttf-unifont
Paso 9:Configurar renderd
Edite el archivo de configuración renderd.
sudo nano /etc/renderd.conf
En el [renderd]
sección, cambie la cantidad de subprocesos de acuerdo con la cantidad de núcleos de CPU en su servidor.
num_threads=10
En el [default]
sección, cambie el valor de XML y HOST a lo siguiente. Tenga en cuenta que las líneas que comienzan con punto y coma (;) son comentarios.
XML=/home/osm/openstreetmap-carto/style.xml HOST=tile.your-domain.com
En [mapnik]
sección, cambie el valor de plugins_dir
a lo siguiente.
plugins_dir=/usr/lib/mapnik/3.0/input/
Puede imprimir el directorio de complementos de entrada predeterminado con el siguiente comando.
mapnik-config --input-plugins
Si desea mostrar caracteres no latinos, es mejor cambiar la configuración de fuente a la siguiente.
font_dir=/usr/share/fonts/truetype font_dir_recurse=true
Guarde y cierre el archivo. Luego edite el archivo de script de inicio
sudo nano /etc/init.d/renderd
Busque la siguiente línea.
RUNASUSER=www-data
Cambia el usuario a osm
. Esto es necesario para cargar datos de mapas desde la base de datos PostgreSQL.
RUNASUSER=osm
También configure la ruta del archivo de configuración renderd.
DAEMON_ARGS="-c etc/renderd.conf"
Guarde y cierre el archivo. Establecer osm
como propietario de /var/lib/mod_tile/
directorio, que contendrá los archivos de mosaico renderizados.
sudo chown osm /var/lib/mod_tile/ -R
Luego reinicie el servicio renderd.
sudo systemctl daemon-reload sudo systemctl restart renderd
Debe comprobar el registro de renderd.
sudo journalctl -eu renderd
Asegúrese de que renderd no produzca ningún error en el registro después del reinicio, o el mapa no se mostrará.
Paso 10:Configurar Apache
Edite el archivo de host virtual de OSM.
sudo nano /etc/apache2/sites-available/tileserver_site.conf
Cambie ServerName a su propio nombre de dominio como tile.your-domain.com
. También debe crear un registro DNS A para este subdominio.
ServerName tile.your-domain.com
Guarde y cierre el archivo. Reinicie Apache.
sudo systemctl restart apache2
Luego, en la barra de direcciones de su navegador web, escriba
tile.your-domain.com/osm/0/0/0.png
Debería ver el mosaico del mapa mundial. ¡Felicitaciones! Acabas de crear con éxito tu propio servidor de teselas de OSM.
Si ha habilitado el firewall UFW, asegúrese de abrir los puertos 80 y 443 con el siguiente comando.
sudo ufw allow 80,443/tcp
Si ve el 404 no encontrado error, simplemente espere unos minutos, actualice la página en su navegador y debería poder cargar el mosaico del mapa mundial. Si aún no se carga, reinicie el servicio renderd (sudo systemctl restart renderd
).
Paso 11:Muestre su mapa web en mosaico
El mapa web en mosaico también se conoce como mapa deslizable en la terminología de OpenStreetMap. Hay dos bibliotecas de mapas de JavaScript gratuitas y de código abierto que puede usar para su servidor de teselas:OpenLayer y Folleto . La ventaja de Leaflet es que es fácil de usar y su mapa será compatible con dispositivos móviles.
Capa abierta
Para mostrar su mapa resbaladizo con OpenLayer, descargue JavaScript y CSS de openlayer.org y extráigalo a la carpeta webroot.
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
A continuación, cree el index.html
archivo.
sudo nano /var/www/index.html
Pegue el siguiente código HTML en el archivo. Reemplaza el texto de color rojo y ajusta la longitud, la latitud y el nivel de zoom según tus necesidades.
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Accessible Map</title> <link rel="stylesheet" href="http://tile.your-domain.com/v5.3.0/css/ol.css" type="text/css"> <script src="http://tile.your-domain.com/v5.3.0/build/ol.js"></script> <style> a.skiplink { position: absolute; clip: rect(1px, 1px, 1px, 1px); padding: 0; border: 0; height: 1px; width: 1px; overflow: hidden; } a.skiplink:focus { clip: auto; height: auto; width: auto; background-color: #fff; padding: 0.3em; } #map:focus { outline: #4A74A8 solid 0.15em; } </style> </head> <body> <a class="skiplink" href="#map">Go to map</a> <div id="map" class="map" tabindex="0"></div> <button id="zoom-out">Zoom out</button> <button id="zoom-in">Zoom in</button> <script> var map = new ol.Map({ layers: [ new ol.layer.Tile({ source: new ol.source.OSM({ url: 'http://tile.your-domain.com/osm/{z}/{x}/{y}.png' }) }) ], target: 'map', controls: ol.control.defaults({ attributionOptions: /** @type {olx.control.AttributionOptions} */ ({ collapsible: false }) }), view: new ol.View({ center: [244780.24508882355, 7386452.183179816], zoom:5 }) }); document.getElementById('zoom-out').onclick = function() { var view = map.getView(); var zoom = view.getZoom(); view.setZoom(zoom - 1); }; document.getElementById('zoom-in').onclick = function() { var view = map.getView(); var zoom = view.getZoom(); view.setZoom(zoom + 1); }; </script> </body> </html>
Guarde y cierre el archivo. Ahora puede ver su mapa resbaladizo escribiendo su subdominio en la barra de direcciones del navegador.
tile.your-domain.com
o
tile.your-domain.com/index.html
Folleto
Para mostrar su mapa resbaladizo con Leftlet, descargue JavaScript y CSS de leftletjs.com y extráigalo a la carpeta webroot.
cd /var/www/ sudo wget http://cdn.leafletjs.com/leaflet/v1.7.1/leaflet.zip sudo unzip leaflet.zip
A continuación, cree el index.html
archivo.
sudo nano /var/www/index.html
Pegue el siguiente código HTML en el archivo. Reemplaza el texto de color rojo y ajusta la longitud, la latitud y el nivel de zoom según tus necesidades.
<html> <head> <meta charset="UTF-8"> <title>My first osm</title> <link rel="stylesheet" type="text/css" href="leaflet.css"/> <script type="text/javascript" src="leaflet.js"></script> <style> #map{width:100%;height:100%} </style> </head> <body> <div id="map"></div> <script> var map = L.map('map').setView([55,8],5); L.tileLayer('http://tile.your-domain.com/osm/{z}/{x}/{y}.png',{maxZoom:18}).addTo(map); </script> </body> </html>
Guarde y cierre el archivo. Ahora puede ver su mapa resbaladizo escribiendo la dirección IP de su servidor en el navegador.
tile.your-domain.com
o
tile.your-domain.com/index.html
Paso 12:Renderización previa de mosaicos
La representación de mosaicos sobre la marcha aumentará el tiempo de carga del mapa en el navegador web. Para renderizar previamente mosaicos en lugar de renderizar sobre la marcha, utilice la siguiente render_list
dominio. Utilice -z
y -Z
flag especifique el nivel de zoom y reemplace la cantidad de subprocesos de acuerdo con la cantidad de núcleos de CPU en su servidor. Render_list
representa una lista de mosaicos de mapas mediante el envío de solicitudes al demonio de representación. Los mosaicos renderizados previamente se almacenarán en caché en /var/lib/mod_tile
directorio.
render_list -m default -a -z 0 -Z 19 --num-threads=10
Si luego actualizó los datos del mapa, puede volver a renderizar previamente todos los mosaicos usando --force
opción.
render_list -m default -a -z 0 -Z 19 --num-threads=10 --force
Para renderizar mosaicos de mapa en segundo plano, agregue &
símbolo al final.
render_list -m default -a -z 0 -Z 19 --num-threads=10 &
Ahora puede cerrar la ventana de terminal. Para verificar el progreso de la representación, abra otra sesión SSH y ejecute el siguiente comando.
sudo journalctl -eu renderd
El comando anterior mostrará el último registro de renderd
Servicio. Las siguientes líneas muestran que mi servidor OSM ahora está representando mosaicos de mapas en el nivel de zoom 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
Paso 13:habilite HTTPS
Para cifrar el tráfico HTTP podemos obtener e instalar un certificado TLS gratuito de Let’s Encrypt. Primero, instale el cliente Let's Encrypt (certbot) en Debian 10.
sudo apt install certbot
Como estamos usando el servidor web Apache, también necesitamos instalar el complemento Apache.
sudo apt install python3-certbot-apache
Luego ejecute el siguiente comando para obtener e instalar el certificado TLS.
sudo certbot --apache --agree-tos --redirect --hsts --staple-ocsp --must-staple --email [email protected] -d tile.your-domain.com
Una vez instalado el certificado, actualice la página web y verá un candado en la barra de direcciones.
Si ve un triángulo amarillo en la barra de direcciones de Firefox, eso significa que las URL de mosaico aún usan HTTP. Debe editar el archivo index.html y reemplazar todo el protocolo HTTP con HTTPS con el siguiente comando.
sudo sed -i 's/http/https/g' /var/www/index.html
Paso 14:habilite HTTP2
Para mejorar aún más el rendimiento de la carga de mapas, puede habilitar el protocolo HTTP2. Primero, debe habilitar el módulo HTTP2.
sudo a2enmod http2
Luego abra el archivo de host virtual SSL.
sudo nano /etc/apache2/sites-enabled/tileserver_site-le-ssl.conf
Coloque la siguiente directiva después de la apertura <VirtualHost *:443>
etiqueta.
Protocols h2 http/1.1
Guarde y cierre el archivo. Luego reinicie Apache para que los cambios surtan efecto.
sudo systemctl restart apache2
Restringe el acceso a tu servidor de teselas de OSM con el encabezado de referencia HTTP
De forma predeterminada, cualquiera puede usar OpenLayer o Leaflet para crear un mapa deslizante con la URL de su servidor de teselas. Para restringir el acceso a su servidor de teselas, edite el archivo de host virtual de Apache.
sudo nano /etc/apache2/sites-enabled/tileserver_site-le-ssl.conf
Agregue las siguientes líneas en <VirtualHost>
etiquetas.
<Location /osm> SetEnvIf Referer example\.com trusted_referer Order deny,allow Deny from all Allow from env=trusted_referer </Location>
El código anterior verifica si el encabezado de referencia HTTP incluye su propio dominio. Si no, acceda al /osm
el directorio será denegado. La barra invertida se usa para escapar del carácter de punto. Para agregar varios nombres de host como referentes de confianza, use la siguiente sintaxis.
SetEnvIf Referer (example\.com|www\.example\.com|map\.example\.com) trusted_referer
Guarde y cierre el archivo. Luego pruebe la sintaxis.
sudo apache2ctl -t
Si la sintaxis es correcta, vuelva a cargar Apache para que los cambios surtan efecto.
sudo systemctl reload apache2
Certificado TLS de renovación automática
Puede crear un trabajo Cron para renovar automáticamente el certificado TLS. Simplemente abra el archivo crontab del usuario root.
sudo crontab -e
Agregue la siguiente línea al final del archivo.
@daily certbot renew --quiet && systemctl reload apache2
Base de datos PostgreSQL y servidor web en diferentes hosts
Si su servidor web PostgreSQL y Apache residen en diferentes hosts, entonces necesita editar el project.mml
archivo en el servidor Apache.
nano /home/osm/openstreetmap-carto-4.20.0/project.mml
Encuentra las siguientes líneas:
osm2pgsql: &osm2pgsql type: "postgis" dbname: "gis" key_field: "" geometry_field: "way" extent: "-20037508,-20037508,20037508,20037508"
Especifique la dirección IP del servidor de la base de datos PostgreSQL.
osm2pgsql: &osm2pgsql type: "postgis" host: "10.0.0.2" dbname: "gis" key_field: "" geometry_field: "way" extent: "-20037508,-20037508,20037508,20037508"
Guarde y cierre el archivo. A continuación, cree la hoja de estilo XML de Mapnik con carto
compilador de hojas de estilo de mapa.
carto project.mml > style.xml
En el servidor de base de datos PostgreSQL, edite el archivo de configuración principal.
sudo nano /etc/postgresql/11/main/postgresql.conf
Agregue la siguiente línea para configurar PostgreSQL para escuchar en todas las interfaces.
listen_addresses = '*'
Guarde y cierre el archivo. Luego edite el archivo de configuración de autenticación del cliente de PostgreSQL.
sudo nano /etc/postgresql/11/main/pg_hba.conf
Agregue la siguiente línea al final del archivo para permitir que osm
usuario para iniciar sesión desde el host de Apache. Reemplace 10.0.0.1 con la dirección IP del servidor Apache.
host gis osm 10.0.0.1/32 trust
Guarde y cierre el archivo. Luego reinicie PostgreSQL.
sudo systemctl restart postgresql
Reinicie el demonio de procesamiento en el servidor Apache.
sudo systemctl restart renderd
Debe verificar el registro de renderd. Asegúrese de que renderd no produzca ningún error en el registro, o el mapa no se mostrará.
sudo journalctl -eu renderd
También debe restringir el acceso al puerto 5432 del servidor de base de datos PostgreSQL. Por ejemplo, puede usar el siguiente comando UFW para permitir solo la dirección IP del host Apache.
sudo ufw allow in from 10.0.0.1 to any port 5432
Siguiente paso
Espero que este tutorial le haya ayudado a configurar el servidor de teselas de OpenStreetMap en Debian 10. También puede configurar el servidor de codificación geográfica de Nominatim para proporcionar la función de búsqueda.
- Configurar el servidor de geocodificación OSM Nominatim en Debian 10
Como siempre, si encuentra útil esta publicación, suscríbase a nuestro boletín gratuito para obtener más consejos y trucos. Cuídate 🙂