Сышышь ты, выходи сюда,
поговорим !

Utwórz i zoptymalizuj swój serwer kafelków dla OpenStreetMap w oparciu o Ubuntu 14.04

  1. Instalowanie OpenStreetMap
  2. Konfiguracja PostgreSQL i Mapnik
  3. Konfiguracja Apache
  4. Importuj kartę
  5. Sprawdź wydajność karty
  6. Konfiguracja Nginx
  7. Optymalizuj OpenStreetMap (PostGIS)

Dzisiaj powiem ci, jak po prostu skonfigurować i skonfigurować własny serwer map (serwer kafli) oparty na Ubuntu Server 14.04 LTS i OpenStreetMap .

Zacznijmy więc. Z Wikipedia :

OpenStreetMap (dosłownie „otwarta mapa ulic”), w skrócie OSM, to niekomercyjny projekt kartograficzny w sieci, polegający na tworzeniu szczegółowej bezpłatnej mapy geograficznej świata przez społeczność użytkowników Internetu.

Jest dość szczegółowy urzędnik artykuł o instalacji i konfiguracji serwera kafli ale istnieje jeszcze prostszy i szybszy sposób.

Instalowanie OpenStreetMap

Stawiamy

sudo apt-get zainstaluj właściwości python-software

Dodaj repozytorium

sudo add-apt-repository ppa: kakrueger / openstreetmap

Zaktualizowano

sudo apt-get update

Stawiamy jedyny pakiet, który ściągnie wszystko, co niezbędne do działania pełnowartościowego serwera map.

sudo apt-get zainstaluj libapache2-mod-tile

Podczas instalacji ( openstreetmap-postgis-db-setup ) pojawi się kilka pytań:

Umożliwi to włączenie mod_tile w konfiguracji apache?
Odpowiedz Tak

Ten skrypt pobiera dane linii brzegowej i linii brzegowej. OSTRZEŻENIE: Dane mają rozmiar około 400 - 500Mb. Czy chcesz pobrać linie brzegowe?
Odpowiedz Tak

Czy chcesz użyć nowej bazy danych Postgis? Osm2pgsql. OSTRZEŻENIE: Spowoduje to usunięcie istniejącej bazy danych. Czy chcesz utworzyć db postgis?
Odpowiedz Tak

Jeśli go nie potrzebujesz, trzeba go użyć. Nazwa bazy danych do utworzenia:
Określ gis

Proszę podać db. Będziesz chciał uzyskać swoją db. Lista użytkowników jest pusta oddzielona: Np. „Www-data peter”. Powinieneś mieć dostęp do db:
Określ dane www

Założona.

Konfiguracja PostgreSQL i Mapnik

Najpierw o najbardziej Mapnik :

Mapnik to program, którego używamy do rysowania głównej warstwy Slippy Map dla OSM, wraz z innymi warstwami, takimi jak „mapa cyklu” i „noname”. Jest to również nazwa nadana głównej warstwie, która dla niektórych jest myląca.

Mapnik to darmowy zestaw narzędzi do mapowania . Jest napisany w C ++ i Pythonie. Wykorzystuje bibliotekę AGG i umożliwia wygładzanie obiektów na mapie z dużą dokładnością. Może odczytywać dane w bitmapach ESRI, PostGIS, TIFF, plikach .osm, a także obsługuje dowolne formaty GDAL lub OGR. Pakiety są dostępne dla większości wersji systemu Linux, pliki binarne są dostępne dla systemów Mac OS X i Windows.

Dość dziwny niuans polega na tym, że nie zaproponowano nam ustawienia hasła dostępu użytkownika gis (utworzonego automatycznie) do bazy danych o tej samej nazwie.

Ustawiamy hasło dla użytkownika gis

su postgres -c "psql -d gis" gis = # hasło gis

Teraz musisz określić użytkownika i hasło w pliku konfiguracyjnym mapnik.
Zróbmy to w prosty sposób - zastępując narzędzie rpl:

rpl <nazwa parametru = nazwa_bazy> <! [CDATA [gis]]> </ parametr> '' <nazwa parametru = "nazwa_bazy_danych"> <! [CDATA [gis]]> </ parametr> <parametr name = "użytkownik"> <! [CDATA [gis]]> </ Parametr> <Nazwa parametru = "hasło"> <! [CDATA [1234567890]]> </ Parametr> 'etc / mapnik-osm-carto -data / osm.xml

Gdzie „1234567890” jest hasłem określonym przez użytkownika gis

Dajemy możliwość połączenia się z lokalnego serwera za pomocą config /etc/postgresql/9.3/main/pg_hba.conf
Dodaj do niego linię

lokalne wszystkie md5

Konfigurujemy PostgreSQL (w odniesieniu do charakterystyki serwera: 16 rdzeni, 16 GB pamięci RAM, baza danych na dysku twardym).

/etc/postgresql/9.3/main/postgresql.conf

Pokazuję tylko to, co zmieniłem:

listen_addresses = '*' max_connections = 200 shared_buffers = 12GB work_mem = 2GB maintenance_work_mem = 8GB synchronous_commit = off # tylko do importu, musisz usunąć! fsync = off # tylko dla importu, musisz go usunąć! wal_buffers = 16MB checkpoint_segments = 1024 checkpoint_completion_target = 0.9 random_page_cost = 2.0 cpu_tuple_cost = 0.001 cpu_index_tuple_cost = 0.0005 efficient_cache_size = 14GB autovacuum = off # do importu, a następnie należy go usunąć!

I uruchom ponownie Postgres, aby zastosować wszystkie ustawienia.

restart usługi postgresql

Umieśćmy małą konfigurację demona renderdemon tile ( demon renderujący Mapnik ) i zwiększ liczbę wątków renderd do liczby rdzeni (16 w moich przypadkach)

vi /etc/renderd.conf [renderd] num_threads = 16

Teraz musisz ponownie uruchomić renderującego demona renderującego kafelki (demon renderujący Mapnik)

usługa renderd restart

Konfiguracja Apache

Serwer map będzie działał na wiązce Apache + PostgreSQL .
Nie jestem zadowolony z tej grupy. Po głównych krokach dostarczymy nginx do szybszej pracy w pakiecie nginx + Apache + PostgreSQL .

Skonfiguruj Apache.
Nazwami serwerów dla przykładu będzie osm.net .
Pamiętaj, że wskazałem port 8080.

grep -v '#' /etc/apache2/sites-available/tileserver_site.conf <VirtualHost *: 8080> ServerAdmin [email protected] Nazwa serwera osm.net DocumentRoot / var / www Informacje LogLevel ModTileTileDir / var / lib / mod_tile LoadTileConfigFile / itd / renderd.conf ModTileRequestTimeout 10 ModTileMissingRequestTimeout 30 ModTileMaxLoadOld 2 ModTileMaxLoadMissing 25 ModTileRenderdSocketName /var/run/renderd/renderd.sock ModTileCacheDurationMax 604800 ModTileCacheDurationDirty 900 ModTileCacheDurationMinimum ModTileCacheDurationMediumZoom 10800 13 86400 9 518 400 ModTileCacheDurationLowZoom ModTileCacheLastModifiedFactor 0,20 ModTileEnableTileThrottling wyłączony ModTileEnableTileThrottlingXForward 0 ModTileThrottlingTiles ModTileThrottlingRenders 1 10000 128 0,2 <katalog /> Opcje FollowSymLinks AllowOverride Brak </ Directory> <Katalog / var / www /> Opcje -Indexes -FollowSymLinks -MultiViews AllowOverride Brak Zamów zezwolenie, Odmów Zezwalaj na wszystko </ Directory> </ VirtualHost>

Przeprowadź regulację portu w /etc/apache2/ports.conf na 8080

Słuchaj 8080

Dodajemy nazwę naszego serwera do /etc/apache2/apache2.conf, ponieważ Apache nie może działać bez niego.

echo "nazwa_serwera osm.net" >> /etc/apache2/apache2.conf

Uruchom ponownie.

ponowne uruchomienie usługi apache2

Importuj kartę

Pobierz z projektu Geofabrik na przykład mapa Ukrainy w formacie .pbf i wlej go do naszej bazy danych.

mkdir / var / osm wget -O /var/osm/ukraine.`date +% Y-% m-% d`.osm.pbf https://download.geofabrik.de/europe/ukraine-latest.osm. pbf osm2pgsql -d gis -U gis -W -c --slim -C 4000 --numer-procesów 16 var/osm/ukraine.`date +% Y-% m-% d`.osm.pbf

Na maszynie wirtualnej z 16 rdzeniami, 16 GB pamięci RAM i macierzą RAID-10 na dysku twardym zajmuje to około 30 minut.
Szybkość importu jest bardzo ograniczona przez dysk. Na dysku SSD płynie zauważalnie szybciej.

Zauważ parametr -c (--create) podczas importowania przez osm2pgsql. Dzięki tej opcji wszystkie istniejące informacje z tabel zostaną usunięte. Jeśli chcesz zaimportować kilka innych krajów, zamiast -c, określ opcję -a (--append).

Po zaimportowaniu wszystkich niezbędnych krajów (lub całego świata) nie zapomnij wrócić do ustawień domyślnych z konfiguracji PostgreSQL /etc/postgresql/9.3/main/postgresql.conf parametrów synchronous_commit, fsync i autovacuum.

Sprawdź wydajność karty

Bieżący pakiet jest dostarczany jako przykład /var/www/osm/slippymap.html
Proponuję sprawdzić na tym etapie poprawność ustawień PostgreSQL + Apache (mod_tile) + Mapnik , zanim przejdziemy do konfiguracji nginx.

Otwórz w przeglądarce https://osm.net:8080/osm/slippymap.html
Powinien pojawić się prosty interfejs i mapa. Ważne jest, aby element został wybrany w interfejsie Płytki lokalne.
Jeśli pomyślisz i przejrzysz, mapa zostanie przerysowana, stopniowo ładując różne płytki.
Tutaj na przykład adres płytki w centrum Kijowa będzie wyglądał następująco: https://osm.net:8080/osm/11/1197/690.png
A jeśli zobaczysz zdjęcie - oznacza to, że wszystko zostało wykonane poprawnie.

Pamięć podręczna renderowanych kafelków zostanie dodana do folderu / var / lib / mod_tile / default /.
A potem nadszedł czas, aby przekazać tę pamięć podręczną nie przez powolnego potwora Apache, ale przez szybki nginx.

Konfiguracja Nginx

Stawiamy

apt-get zainstaluj nginx-light cat /etc/nginx/nginx.conf użytkownik-dane www-data; process_processes 32; worker_priority -20; pid /var/run/nginx.pid; error_log /var/log/nginx/error.log ostrzega; wydarzenia {pracownik_łączenia 1024; accept_mutex on; multi_accept on; } http {zawiera /etc/nginx/mime.types; default_type application / octet-stream; reset_timedout_connection on; server_tokens off; log_format main '$ remote_addr - [$ time_local]' '$ host {$ upstream_cache_status} "$ request" $ status $ bytes_sent' '"$ http_referer" "$ http_user_agent" "" "gzip_ratio" $ upstream_response_time "; log_format ip_only '$ remote_addr'; sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; client_header_buffer_size 16m; client_max_body_size 512m; server_names_hash_max_size 4096; server_names_hash_bucket_size 512; variables_hash_max_size 4096; variables_hash_bucket_size 512; types_hash_max_size 8192; port_in_redirect wyłączony; gzip na; gzip_vary on; gzip_min_length 1024; gzip_buffers 16 8k; gzip_comp_level 5; gzip_http_version 1.0; gzip_proxied any; gzip_disable "msie6"; gzip_types tekst / zwykły tekst / css aplikacja / x-javascript tekst / xml aplikacja / xml aplikacja / xml + rss tekst / javascript tekst / json; fastcgi_temp_path / var / cache / nginx / temp / fastcgi; proxy_temp_path / var / cache / nginx / temp / proxy; zestaw znaków utf-8; index index.html index.htm; access_log off; error_log / dev / null; dołącz /etc/nginx/conf.d/upstream.conf; włącz / etc / nginx / sites-enabled / *; } cat /etc/nginx/conf.d/upstream.conf upstream apache {serwer 127.0.0.1:8080; } cat / etc / nginx / sites-enabled / 001-osm server {listen 80; nazwa_serwera osm.net; access_log /var/log/nginx/osm.net.access.log main; error_log /var/log/nginx/osm.net.error.log; root / var / www; index index.html; zestaw znaków utf-8; # Lokalizacja OSM ~ * ^ / osm / ([0-9] +) / ([0-9] +) / ([0-9] +) Png $ {proxy_pass https: // apache; dołącz / etc / nginx / proxy_params; access_log off; autoindeks wyłączony; wygasa 1d; add_header Cache-Control „public”; } # statyczne zasoby lokalizacja ~ * ^. + (ico | htm | html | txt | jpg | jpeg | css | js | png | gif | mapa | woff | woff2 | ttf | tif | tiff | pdf) $ {access_log off; autoindeks wyłączony; wygasa 1d; add_header Cache-Control „public”; }}

Uruchom ponownie

serwis nginx restart

Optymalizuj OpenStreetMap (PostGIS)

(na podstawie artykułu Tuning PostGIS )

CREATE INDEX idx_poly_idlanduse ON planet_osm_polygon USING gist (way) GDZIE ((landuse IS NOT NULL) OR (leisure IS NOT NULL) OR (aeroway = ANY ('{fartuch, lotnisko}' :: text [])) OR (udogodnienie = DOWOLNY ('parking, uniwersytet, szkoła wyższa, szkoła, przedszkole, grave_yard}' :: text [])) OR (military = ANY ('{koszary, danger_area}' :: text [])) OR („naturalna” = DOWOLNY ('{pole, plaża, pustynia, wrzosowisko, błoto, użytki zielone, drewno, piasek, zarośla}' :: text [])) OR (moc = DOWOLNY ('{stacja, sub_station, generator}' :: tekst [ ])) OR (tourism = ANY ('{attraction, camp_site, caravan_site, picnic_site, zoo}' :: text [])) OR (highway = ANY ('{services, rest_area}' :: text []))) ; CREATE INDEX "planet_osm_polygon_nobuilding_index" ON "planet_osm_polygon" USING gist ("way") GDZIE "building" IS NULL; CREATE INDEX ferry_idx ON planet_osm_line USING gist (way) WHERE (route = 'prom' :: tekst); CREATE INDEX "idx_poly_aeroway" na planet_osm_polygon UŻYWANIE gist (way) GDZIE "aeroway" NIE JEST NULL; CREATE INDEX "idx_poly_aeroway" na planet_osm_polygon UŻYWANIE gist (way) GDZIE "aeroway" NIE JEST NULL; CREATE INDEX "idx_poly_historic" na planet_osm_polygon UŻYWANIE gist (way) GDZIE „historyczne” NIE JEST NULL; CREATE INDEX "idx_poly_leisure" na planet_osm_polygon UŻYWANIE gist (way) GDZIE "leisure" NIE JEST NULL; CREATE INDEX "idx_poly_man_made" na planet_osm_polygon USING gist (way) WHERE "man_made" NIE JEST NULL; CREATE INDEX "idx_poly_military" na planet_osm_polygon UŻYWANIE gist (way) GDZIE "wojskowy" NIE JEST NULL; CREATE INDEX "idx_poly_power" na planet_osm_polygon KORZYSTANIE Z GIST (sposób) GDZIE "moc" NIE JEST NULL; CREATE INDEX "idx_poly_landuse" na planet_osm_polygon UŻYWANIE gist (way) GDZIE "landuse" NIE JEST NULL; CREATE INDEX "idx_poly_amenity" na planet_osm_polygon KORZYSTANIE Z GIST (sposób) GDZIE "udogodnienie" NIE JEST NULL; CREATE INDEX "idx_poly_natural" na planet_osm_polygon UŻYWANIE gist (way) WHERE "natural" NIE JEST NULL; CREATE INDEX "idx_poly_highway" na planet_osm_polygon UŻYWANIE gist (way) WHERE "highway" NIE JEST NULL; CREATE INDEX "idx_poly_tourism" na planet_osm_polygon UŻYWANIE gist (way) GDZIE "tourism" NIE JEST NULL; CREATE INDEX "idx_poly_building" na planet_osm_polygon UŻYWANIE gist (way) GDZIE "building" NIE JEST NULL; CREATE INDEX "idx_poly_barrier" na planet_osm_polygon UŻYWANIE gist (way) WHERE "bariera" NIE JEST NULL; CREATE INDEX "idx_poly_railway" na planet_osm_polygon UŻYWANIE gist (way) WHERE "railway" NIE JEST NULL; CREATE INDEX "idx_poly_aerialway" na planet_osm_polygon UŻYWANIE gist (way) GDZIE "aerialway" NIE JEST NULL; CREATE INDEX "idx_poly_power_source" na planet_osm_polygon USING gist (way) WHERE "power_source" NIE JEST NULL; CREATE INDEX "idx_poly_generator: source" na planet_osm_polygon UŻYWANIE gist (way) WHERE "generator: źródło" NIE JEST NULL; CREATE INDEX "idx_line_aerialway" na planet_osm_line USING gist (way) GDZIE "aerialway" NIE JEST NULL; CREATE INDEX "idx_line_waterway" na planet_osm_line USING gist (way) GDZIE "waterway" NIE JEST NULL; CREATE INDEX "idx_line_bridge" na planet_osm_line USING gist (way) GDZIE "bridge" NIE JEST NULL; CREATE INDEX "idx_line_tunnel" na planet_osm_line USING gist (way) GDZIE "tunel" NIE JEST NULL; CREATE INDEX „idx_line_access” na planet_osm_line USING gist (way) GDZIE „dostęp” NIE JEST NULL; CREATE INDEX "idx_line_railway" na planet_osm_line USING gist (way) WHERE "railway" NIE JEST NULL; CREATE INDEX „idx_line_power” na planet_osm_line USING gist (way) GDZIE „power” NIE JEST NULL; CREATE INDEX „idx_line_name” na planet_osm_line USING gist (way) WHERE „name” NIE JEST NULL; CREATE INDEX "idx_line_ref" na planet_osm_line USING gist (way) GDZIE "ref" NIE JEST NULL; CREATE INDEX "idx_point_aerialway" na planet_osm_point UŻYWANIE gist (way) GDZIE "aerialway" NIE JEST NULL; CREATE INDEX "idx_point_power_source" na planet_osm_point USING gist (way) WHERE "power_source" NIE JEST NULL; CREATE INDEX "idx_point_shop" na planet_osm_point USING gist (way) GDZIE "shop" NIE JEST NULL; CREATE INDEX "idx_point_place" na planet_osm_point USING gist (way) WHERE "place" NIE JEST NULL; CREATE INDEX "idx_point_barrier" na planet_osm_point UŻYWANIE gist (way) WHERE "bariera" NIE JEST NULL; CREATE INDEX "idx_point_railway" na planet_osm_point UŻYWANIE gist (way) WHERE "railway" NIE JEST NULL; CREATE INDEX "idx_point_amenity" na planet_osm_point UŻYWANIE gist (sposób) GDZIE "udogodnienie" NIE JEST NULL; CREATE INDEX "idx_point_natural" na planet_osm_point USING gist (way) WHERE "natural" NIE JEST NULL; CREATE INDEX „idx_point_highway” na planet_osm_point UŻYWANIE gist (way) WHERE „highway” NIE JEST NULL; CREATE INDEX "idx_point_tourism" na planet_osm_point USING gist (way) GDZIE "tourism" NIE JEST NULL; CREATE INDEX "idx_point_power" na planet_osm_point USING gist (way) GDZIE "power" NIE JEST NULL; CREATE INDEX "idx_point_aeroway" na planet_osm_point UŻYWANIE gist (way) WHERE "aeroway" NIE JEST NULL; CREATE INDEX "idx_point_historic" na planet_osm_point UŻYWANIE gist (way) GDZIE "historyczny" NIE JEST NULL; CREATE INDEX "idx_point_leisure" na planet_osm_point UŻYWANIE gist (way) GDZIE "leisure" NIE JEST NULL; CREATE INDEX "idx_point_man_made" na planet_osm_point UŻYWANIE gist (way) WHERE "man_made" NIE JEST NULL; CREATE INDEX "idx_point_waterway" na planet_osm_point UŻYWANIE gist (way) GDZIE "droga wodna" NIE JEST NULL; CREATE INDEX "idx_point_generator: source" na planet_osm_point UŻYWANIE gist (way) WHERE "generator: źródło" NIE JEST NULL; CREATE INDEX "idx_point_capital" na planet_osm_point UŻYWANIE gist (way) WHERE "capital" NIE JEST NULL; CREATE INDEX "idx_point_lock" na planet_osm_point USING gist (way) WHERE "lock" NIE JEST NULL; CREATE INDEX "idx_point_landuse" na planet_osm_point UŻYWANIE gist (way) GDZIE "landuse" NIE JEST NULL; CREATE INDEX "idx_point_military" na planet_osm_point UŻYWANIE gist (sposób) GDZIE "wojskowy" NIE JEST NULL; CREATE INDEX idx_poly_wayarea_text ON planet_osm_polygon UŻYWANIE gist (sposób) GDZIE nazwa NIE JEST NULL I miejsce IS NULL I way_area
Zapisz te zapytania do /var/osm/osm.indexes.sql i wykonaj je su postgres -c "psql -d gis -U gis -W" gis => i /var/osm/osm.indexes.sql

Rozgrzewka pamięci podręcznej Mapnika


W przypadku często używanych płytek warto rozgrzać pamięć podręczną Mapnika.
Jest to bardzo proste polecenie: cd / var / lib / mod_tile lista_ renderowania -m wartość domyślna -a -z 0 -Z 10 -n 16
Gdzie
-z 0 - początkowy zoom (od)
-Z 10 - ostateczne powiększenie (do)
-n 16 to liczba rdzeni
Ten sam przykład z mapą Ukrainy dla 16 rdzeni i powiększeniem od 0 do 10 zajmuje około 20 minut.
To wszystko.
Powodzenia

Zobacz także:

Czy chcesz pobrać linie brzegowe?
Czy chcesz utworzyć db postgis?