Utwórz i zoptymalizuj swój serwer kafelków dla OpenStreetMap w oparciu o Ubuntu 14.04
- Instalowanie OpenStreetMap
- Konfiguracja PostgreSQL i Mapnik
- Konfiguracja Apache
- Importuj kartę
- Sprawdź wydajność karty
- Konfiguracja Nginx
- 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-softwareDodaj repozytorium
sudo add-apt-repository ppa: kakrueger / openstreetmapZaktualizowano
sudo apt-get updateStawiamy jedyny pakiet, który ściągnie wszystko, co niezbędne do działania pełnowartościowego serwera map.
sudo apt-get zainstaluj libapache2-mod-tilePodczas 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:
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ę
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.confPokazuję 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 postgresqlUmieść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 = 16Teraz musisz ponownie uruchomić renderującego demona renderującego kafelki (demon renderujący Mapnik)
usługa renderd restartKonfiguracja 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.
Przeprowadź regulację portu w /etc/apache2/ports.conf na 8080
Słuchaj 8080Dodajemy 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.confUruchom ponownie.
ponowne uruchomienie usługi apache2Importuj 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 restartOptymalizuj 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_areaZapisz 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?