GNU/Linux >> Tutoriales Linux >  >> Ubuntu

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

Tegola es un servidor de teselas vectoriales de código abierto para OpenStreetMap . Anteriormente explicamos el proceso de configuración del servidor de teselas de OSM con mapnik y mod_tile, que es un ráster servidor de teselas basado en. Este tutorial le mostrará cómo configurar Tegola vector servidor de teselas en Ubuntu 20.04.

Beneficios de los mosaicos vectoriales

  • Mejor calidad de visualización para dispositivos de alto DPI (pantalla retina)
  • Pequeño formato eficiente (no se necesitan imágenes de 512 x 512)
  • Texto más claro y legible
  • Etiquetado sobre la marcha para visualización frontal
  • Separe el contenido y el estilo, lo que permite crear varios estilos que apunten a la misma pila de mosaicos.
  • Modo día y noche

Formatos de teselas vectoriales

Hay varios formatos para teselas vectoriales.

  • GeoJSON
  • TopoJSON
  • Tesela vectorial de Mapbox (MVT)
  • 05m
  • OpenScienceMap binario
  • Arc GeoServices JSON

Tegola utiliza el formato de mosaico vectorial Mapbox.

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.

Lleva mucho tiempo importar datos de mapas grandes, como todo el planeta, a la base de datos PostgreSQL. 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

Establezca una contraseña para el usuario de osm.

psql -c "ALTER USER osm WITH PASSWORD 'secret_password';"

Luego crea una base de datos llamada osm 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 osm

A continuación, cree el postgis y hstore extensión para osm base de datos.

psql -c "CREATE EXTENSION postgis;" -d osm

psql -c "CREATE EXTENSION hstore;" -d osm

Establecer osm como propietario de la mesa.

psql -c "ALTER TABLE spatial_ref_sys OWNER TO osm;" -d osm

Crea una base de datos llamada natural_earth y al mismo tiempo hacer osm como propietario de la base de datos.

createdb -E UTF8 -O osm natural_earth

A continuación, cree el postgis y hstore extensión para la natural_earth base de datos.

psql -c "CREATE EXTENSION postgis;" -d natural_earth

psql -c "CREATE EXTENSION hstore;" -d natural_earth

Salir de postgres usuario.

exit

Paso 3: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 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 4:Importe los datos del mapa a PostgreSQL

Para importar datos de mapas, usaremos imposm que convierte los datos de OpenStreetMap en bases de datos PostgreSQL habilitadas para postGIS. Descárguelo de Github.

wget https://github.com/omniscale/imposm3/releases/download/v0.11.1/imposm-0.11.1-linux-x86-64.tar.gz

Extraiga el archivo.

tar xvf imposm-0.11.1-linux-x86-64.tar.gz

Muévalo a /opt/ directorio.

sudo mv imposm-0.11.1-linux-x86-64 /opt/imposm

Descargar tegola-osm guiones.

git clone https://github.com/go-spatial/tegola-osm.git

Muévalo a /opt/ directorio.

sudo mv tegola-osm /opt/

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

Ejecute el siguiente comando para importar datos de mapas.

/opt/imposm/imposm import -connection postgis://osm:osm_password@localhost/osm -mapping /opt/tegola-osm/imposm3.json -read great-britain-latest.osm.pbf -write

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 hayan importado los datos del mapa, ejecute el siguiente comando para implementarlo en producción.

/opt/imposm/imposm import -connection postgis://osm:osm_password@localhost/osm -mapping /opt/tegola-osm/imposm3.json -deployproduction

Paso 5:Descarga Tegola

Vaya a la página de Tegola Github y descargue la versión de Linux. Puede usar el siguiente comando para descargarlo en la terminal.

wget https://github.com/go-spatial/tegola/releases/download/v0.13.0/tegola_linux_amd64.zip

Descomprímelo.

sudo apt install unzip

unzip tegola_linux_amd64.zip

Mueva el binario a /usr/local/bin/ directorio.

sudo mv tegola /usr/local/bin/

Paso 6:Importe el conjunto de datos OSM Land y Natural Earth

Edite el /opt/tegola-osm/osm_land.sh archivo.

sudo nano /opt/tegola-osm/osm_land.sh

Ingrese los detalles de su base de datos.

# database connection variables
DB_NAME="osm"
DB_HOST="localhost"
DB_PORT="5432"
DB_USER="osm"
DB_PW="osm_password"

Guarde y cierre el archivo. Instalar gdal .

sudo apt install gdal-bin

Generar relación land_polygons en el gis base de datos.

/opt/tegola-osm/osm_land.sh

A continuación, edite el /opt/tegola-osm/natural_earth.sh archivo.

sudo nano /opt/tegola-osm/natural_earth.sh

Ingrese los detalles de su base de datos.

# database connection variables
DB_NAME="natural_earth"
DB_HOST="localhost"
DB_PORT="5432"
DB_USER="osm"
DB_PW="osm_password"

Guarde y cierre el archivo. Luego genera tablas en el natural_earth base de datos.

/opt/tegola-osm/natural_earth.sh

Ejecute postgis_helpers secuencia de comandos SQL.

sudo -u postgres psql -d osm -a -f /opt/tegola-osm/postgis_helpers.sql

Ejecute el postgis_index.sql script para agregar índices a las columnas de la tabla OSM para aumentar el rendimiento de las consultas.

sudo -u postgres psql -d osm -a -f /opt/tegola-osm/postgis_index.sql

Paso 7:Inicie Tegola

Edite el archivo de configuración.

sudo nano /opt/tegola-osm/tegola.toml

Configure el puerto de escucha, el tipo de caché y el proveedor de datos de la siguiente manera.

[webserver]
port = ":8080"

# Tegola offers three tile caching strategies: "file", "redis", and "s3"
[cache]
type = "file"
basepath="/tmp/tegola-cache"

#   OpenStreetMap (OSM)
[[providers]]
name = "osm"
type = "postgis"
host = "127.0.0.1"
port = "5432"
database = "osm"
user = "osm"
password = "osm_password"

# Natural Earth
[[providers]]
name = "ne"
type = "postgis"
host = "127.0.0.1"
port = "5432"
database = "natural_earth"
user = "osm"
password = "osm_password"

Busque la siguiente línea.

center = [-76.275329586789, 39.153492567373, 8.0] # optional center value. part of the TileJSON spec

Puede establecer una ubicación central personalizada (longitud y latitud) para su mapa y el nivel de zoom predeterminado. Tenga en cuenta que debe usar valores decimales y no puede usar valores enteros.

center = [0.8, 55.5, 5.0] # optional center value. part of the TileJSON spec

Guarde y cierre el archivo. Entonces empieza Tegola.

/usr/local/bin/tegola serve --config=/opt/tegola-osm/tegola.toml

Ahora Tegola está escuchando en el puerto 8080.

Paso 8:Cree un servicio Systemd para Tegola

Tegola corre en primer plano. Para ejecutarlo en segundo plano, podemos crear un servicio systemd, que también permite que Tegola se inicie automáticamente en el momento del arranque del sistema. Presiona Ctrl+C para detener el proceso Tegola actual, luego cree el archivo tegola.service.

sudo nano /etc/systemd/system/tegola.service

Agregue las siguientes líneas a este archivo.

[Unit]
Description=Tegola Vector Tile Server

[Service]
Type=simple
User=www-data
ExecStart=/usr/local/bin/tegola serve --config=/opt/tegola-osm/tegola.toml
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target

Guarde y cierre el archivo. Hacer www-data como propietario del /tmp/tegola-cache/ directorio.

sudo chown www-data:www-data /tmp/tegola-cache/ -R

Luego habilite e inicie este servicio.

sudo systemctl enable tegola --now

Compruebe su estado. Asegúrate de que se esté ejecutando.

systemctl status tegola

Luego, en la barra de direcciones de su navegador web, escriba

your-server-ip-address:8080

Debería ver el mapa de teselas vectoriales. ¡Felicitaciones! Acaba de crear con éxito su propio servidor de teselas vectoriales. Tenga en cuenta que las versiones anteriores de Firefox no pueden mostrar estos mosaicos vectoriales. Debe usar una biblioteca de terceros para mostrar mapas basados ​​en mosaicos vectoriales, lo cual se explica al final de este tutorial.

Paso 9:Configuración del proxy inverso

Para acceder a Tegola usando un nombre de dominio, podemos configurar un proxy inverso para Tegola con Nginx o Apache. Esto también nos permitirá habilitar HTTPS con el certificado Let's Encrypt gratuito.

Nginx

Nginx es un servidor web y proxy inverso muy popular. Si prefiere usar Nginx, ejecute el siguiente comando para instalarlo.

sudo apt install nginx

A continuación, cree un archivo de bloqueo del servidor para Tegola.

sudo nano /etc/nginx/conf.d/tegola.conf

Agregue el siguiente contenido a este archivo. Reemplace tile.example.com con su propio nombre de dominio. También debe crear un registro DNS A para este subdominio. Si no tiene un nombre de dominio real, le recomiendo ir a NameCheap para comprar uno. El precio es bajo y brindan protección de privacidad whois gratis de por vida.

server {
      listen 80;
      listen [::]:80;
      server_name tile.example.com;

      access_log /var/log/nginx/tegola.access;
      error_log /var/log/nginx/tegola.error;

      location / {
          proxy_pass http://127.0.0.1:8080;
          proxy_set_header Host $host;
          proxy_set_header X-Real-IP $remote_addr;

          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
          proxy_set_header X-Forwarded-Proto $scheme;
          proxy_set_header X-Forwarded-Protocol $scheme;
          proxy_set_header X-Forwarded-Host $http_host;
      }
}

Guarde y cierre este archivo. Luego pruebe la configuración de Nginx.

sudo nginx -t

Si la prueba es exitosa, vuelva a cargar Nginx para que el cambio surta efecto.

sudo systemctl reload nginx

Ahora puede acceder a Tegola a través de tile.example.com .

Apache

Si prefiere Apache sobre Nginx, instale el servidor web Apache usando el siguiente comando.

sudo apt install apache2

Para usar Apache como proxy inverso, debemos habilitar el proxy módulos y el módulo de cabecera.

sudo a2enmod proxy proxy_http headers

Luego cree un archivo de host virtual para Tegola.

sudo nano /etc/apache2/sites-available/tegola.conf

Coloque las siguientes configuraciones en el archivo. Reemplace tile.example.com con su nombre de dominio real. No olvide crear un registro DNS A para este subdominio. Si no tiene un nombre de dominio real, le recomiendo ir a NameCheap para comprar uno. El precio es bajo y brindan protección de privacidad whois gratis de por vida.

<VirtualHost *:80>
   ServerName tile.example.com
   ErrorDocument 404 /404.html

   #HTTP proxy
   ProxyPass / http://127.0.0.1:8080/
   ProxyPassReverse / http://127.0.0.1:8080/

   ProxyPreserveHost On

</VirtualHost>

Guarde y cierre el archivo. Luego habilite este servidor virtual.

sudo a2ensite tegola.conf

Reiniciar Apache

sudo systemctl restart apache2

Ahora puede acceder a Tegola usando el nombre de dominio tile.example.com .

Paso 10:habilite HTTPS

Para cifrar el tráfico HTTP cuando visita el servidor de Tegola desde el exterior, podemos habilitar HTTPS instalando un certificado TLS gratuito emitido por Let's Encrypt. Ejecute el siguiente comando para instalar el cliente Let's Encrypt (certbot) en Ubuntu 20.04.

sudo apt install certbot

Si usa Nginx, también necesita instalar el complemento Certbot Nginx.

sudo apt install python3-certbot-nginx

A continuación, ejecute el siguiente comando para obtener e instalar el certificado TLS.

sudo certbot --nginx --agree-tos --redirect --hsts --staple-ocsp --email [email protected] -d tile.example.com

Si usa Apache , entonces necesita instalar el complemento Certbot Apache.

sudo apt install python3-certbot-apache

A continuación, ejecute el siguiente comando para obtener e instalar el certificado TLS.

sudo certbot --apache --agree-tos --redirect --hsts --staple-ocsp --uir --email [email protected] -d tile.example.com

donde:

  • --nginx :use el complemento nginx.
  • --apache :Utilice el complemento de Apache.
  • --agree-tos :Acepto los términos del servicio.
  • --redirect :Forzar HTTPS por redirección 301.
  • --hsts :agregue el encabezado Strict-Transport-Security a cada respuesta HTTP. Obligar al navegador a usar siempre TLS para el dominio. Protege contra la eliminación de SSL/TLS.
  • --staple-ocsp :activa el grapado OCSP. Se grapa una respuesta OCSP válida al certificado que ofrece el servidor durante TLS.
  • --uir :actualizar solicitudes inseguras.

Ahora se debe obtener el certificado e instalarlo automáticamente. Y puede acceder a Tegola a través de HTTPS:https://tile.example.com .

Configurar un mapa de ejemplo

Debe usar una biblioteca de terceros para mostrar un mapa basado en mosaicos vectoriales. Uso OpenLayer como ejemplo. Crea un map.html archivo en su servidor y coloque los siguientes códigos.

<!doctype html>
<html lang="en">
    <head>
        <link rel="stylesheet" href="https://openlayers.org/en/v5.3.0/css/ol.css" type="text/css">
        <style>
            #map{height:1000px;width:100%;background-color:#1C79B5;}
        </style>
        <script src="https://openlayers.org/en/v5.3.0/build/ol.js" type="text/javascript"></script>
        <title>OpenLayers example</title>
    </head>
    <body>
        <div id="map" class="map"></div>
        <script type="text/javascript">

            var defaultStyle = new ol.style.Style({
                fill: new ol.style.Fill({
                    color: [234,231,221,1]
                }),
                stroke: new ol.style.Stroke({
                    color: [182,177,162,1],
                    width: 1
                })
            });

            var waterStyle = new ol.style.Style({
                fill: new ol.style.Fill({
                    color: [28,121,181,1]
                }),
                stroke: new ol.style.Stroke({
                    color: [27,107,159,1],
                    width: 1
                })
            });

            var streetStyle = new ol.style.Style({
                fill: new ol.style.Fill({
                    color: [111,44,173,1]
                }),
                stroke: new ol.style.Stroke({
                    color: [93,32,150,1],
                    width: 1
                })
            });

            function styleFunction(feature, resolution){
                if (feature.get('type') == 'water' || feature.get('layer') == 'water_areas' || feature.get('layer') == 'water_lines'){
                    return [waterStyle];
                }
                if (feature.get('layer') == 'transport_lines'){
                    return [streetStyle];
                }
                if (feature.get('layer') == 'country_polygons' || feature.get('layer') == 'landuse_areas'){
                    return null; // return null for no style to be applied
                }
                return [defaultStyle];
            }

            var map = new ol.Map({
                target: 'map',
                layers: [
                    new ol.layer.VectorTile({
                        source: new ol.source.VectorTile({
                            format: new ol.format.MVT(),
                            url:'https://tile.linuxbabe.com/maps/osm/{z}/{x}/{y}.pbf'
                        }),
                        style:styleFunction
                    })
                ],
                view: new ol.View({
                    center: ol.proj.fromLonLat([0.5,54.5]), //coordinates the map will center on initially
                    zoom: 6
                })
            });
        </script>
    </body>
</html>

Guarde y cierre el archivo. Así es como se ve.

Conclusión

Espero que este artículo le haya ayudado a configurar Tegola Vector Tile Server en Ubuntu 20.04. Como siempre, si esta publicación le resultó útil, suscríbase a nuestro boletín informativo 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 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 OpenStreetMap Tile Server en Ubuntu 20.04

¿Cómo configurar Tls para Postfix en Ubuntu?