GNU/Linux >> Tutoriales Linux >  >> Ubuntu

Cómo configurar OpenStreetMap Tile Server en Ubuntu 20.04

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 🙂


Ubuntu
  1. Cómo configurar un servidor LAMP de Ubuntu/Debian

  2. Cómo configurar Nginx como proxy inverso en Ubuntu 20.04

  3. Cómo configurar WireGuard en Ubuntu 22.04

  4. Cómo configurar el servidor y el cliente NFS en Ubuntu 20.04

  5. Cómo configurar un servidor TeamSpeak en Ubuntu 16.04

Cómo configurar el servidor Prosody XMPP en Ubuntu 20.04

Cómo configurar el servidor Prosody XMPP en Ubuntu 18.04

Configurar el servidor de geocodificación OSM Nominatim en Ubuntu 20.04

Cómo configurar el servidor proxy Shadowsocks-libev en Ubuntu

Cómo configurar OpenStreetMap Tile Server en Ubuntu 18.04

Cómo configurar Tegola Vector Tile Server en Ubuntu 20.04 para OpenStreetMap