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 Ubuntu 20.04 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 en 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
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-12-postgis-3
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 --group 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/12/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/12/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 el archivo /etc/sysctl.conf.
sudo nano /etc/sysctl.conf
Agregue la siguiente línea al final de este archivo 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
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 Ubuntu 20.04:
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.focal]
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.focal (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.
Resolución de problemas
Si encuentra el siguiente error al importar datos de mapas desde un archivo PBF,
PBF error : invalid Blobheader size (> max_blob_header_size)
probablemente se deba a que su archivo PBF está dañado. Verifique el md5sum del archivo PBF como se muestra a continuación.
md5sum great-britain-latest.osm.pbf
Compare el resultado con el valor md5sum en la página de descarga del archivo PBF.
Paso 6:Instala Renderd y mod_tile
renderd
es un demonio para renderizar mosaicos de OpenStreetMap desde la base de datos de PostgreSQL.mod_tile
es un módulo de Apache que se usa para servir mosaicos a clientes (por ejemplo, navegadores web)
El repositorio predeterminado de Ubuntu no incluye mod_tile
y renderd
, pero podemos instalarlos desde el PPA de OSM.
sudo apt install software-properties-common sudo add-apt-repository ppa:osmadmins/ppa sudo apt install apache2 libapache2-mod-tile renderd
Se instalará el servidor web Apache y un archivo de configuración para renderd
también se creará en /etc/apache2/conf-available/renderd.conf
.
Habilitar el tile
módulo.
sudo a2enmod tile
A continuación, cree un host virtual para el servidor de teselas.
sudo nano /etc/apache2/sites-available/tileserver_site.conf
Agregue las siguientes líneas en este archivo. Reemplace tile.your-domain.com
con su verdadero nombre de dominio. No te olvides del registro A de DNS.
<VirtualHost *:80> ServerName tile.your-domain.com LogLevel info Include /etc/apache2/conf-available/renderd.conf </VirtualHost>
Guarde y cierre el archivo. Habilite este servidor virtual.
sudo a2ensite tileserver_site.conf
Reinicie Apache para que los cambios surtan efecto.
sudo systemctl restart apache2
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
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 carto
paquete con npm
.
sudo npm install -g carto
Instala el psycopg2
Módulo Python.
sudo -H pip3 install psycopg2==2.8.5
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
Editar renderd
archivo de configuración.
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
Agregar un default
capa. Las líneas que comienzan con punto y coma (;) son comentarios.
; ADD YOUR LAYERS: [default] URI=/osm/ XML=/home/osm/openstreetmap-carto/style.xml HOST=tile.your-domain.com
Guarde y cierre el archivo. Luego crea un nuevo directorio para el servicio renderd.
sudo mkdir /etc/systemd/system/renderd.service.d/
Cree un archivo de configuración personalizado en este directorio.
sudo nano /etc/systemd/system/renderd.service.d/custom.conf
Agregue las siguientes líneas en este archivo.
[Service] User=osm
Guarde y cierre el archivo. Cambiar la propiedad de /run/renderd/
y /var/cache/renderd/tiles/
directorio.
sudo chown osm /run/renderd/ -R sudo chown osm /var/cache/renderd/tiles/ -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:Prueba
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
Ahora que tiene un servidor de teselas OSM en funcionamiento, necesita usar una biblioteca de mapas de JavaScript para mostrar el mapa en sus otros servidores. En este tutorial, estoy creando el mapa web en el servidor de teselas, pero puede hacerlo en cualquier otro servidor.
Un mapa web en mosaico también se conoce como mapa resbaladizo. 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/html/ 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/html/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/html/ sudo wget http://cdn.leafletjs.com/leaflet/v1.7.1/leaflet.zip sudo unzip leaflet.zip
A continuación, cree el index.html
expediente. Si ya existe un index.html
archivo, luego elimine el contenido original.
sudo nano /var/www/html/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,0.8],6); 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. Los osmadmins/ppa
PPA contiene un certbot
que funciona mal binario, por lo que recomiendo instalar certbot
de la tienda Snap.
sudo apt install snapd sudo snap install --classic certbot
Luego ejecute el siguiente comando para obtener e instalar el certificado TLS.
sudo /snap/bin/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 /snap/bin/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/12/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/12/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 Ubuntu 20.04. También es posible que desee configurar el servidor de geocodificación de Nominatim para proporcionar la funcionalidad de búsqueda de direcciones.
- Configurar el servidor de geocodificación OSM Nominatim en Ubuntu 20.04
Puede proporcionar funcionalidad de navegación a su mapa con Open Source Routing Machine (OSRM).
- Cómo instalar OSRM en Ubuntu 20.04:máquina de enrutamiento de código abierto
Como siempre, si encuentra útil esta publicación, suscríbase a nuestro boletín gratuito para obtener más consejos y trucos. Cuídate 🙂