GNU/Linux >> Linux の 問題 >  >> Ubuntu

Ubuntu18.04でOpenStreetMapタイルサーバーを設定する方法

OpenStreetMap、別名OSMは、自由に編集できるユーザー提供の世界地図です。これは、Googleマップのオープンソースで自己ホスト型の代替手段と考えることができます。このチュートリアルでは、Ubuntu 18.04で独自のOpenStreetMapタイルサーバーを構築して、独自のマップサービスを使用する必要がないようにする方法を説明します。

OpenStreetMapの機能

  • OpenStreetMapデータは全世界をカバーしているため、どの国でも、どの国でもユーザーを簡単にサポートできます。
  • OpenStreetMapは、毎日1時間ごとに毎分更新され、これらの更新はリアルタイムで利用できます。
  • OpenStreetMapデータは無料でオープンです–サブスクリプション料金やページビュー料金はありません。
  • OpenStreetMapデータは豊富で詳細であり、地上の人々、つまりそれを収集した人々に関連する膨大な量のデータが含まれています。

前提条件/ハードウェア要件

必要なRAMとディスク容量は、使用する国の地図によって異なります。たとえば、

  • 英国の地図には、少なくとも12GのRAMと60GBのディスク容量が必要です。
  • 惑星マップ全体には、少なくとも32GのRAMと1TBのSSDディスクが必要です。惑星の地図全体に回転するハードディスクを使用することは現実的ではありません。

Webブラウザでのマップの読み込みを高速化するためにタイルを事前レンダリングする場合は、より多くのディスク容量が必要になります。これを強くお勧めします。このページをチェックして、タイルの事前レンダリングに必要なディスク容量を確認してください。たとえば、惑星マップのズームレベル0からズームレベル15までタイルを事前レンダリングする場合は、追加の460GBのディスク容量が必要です。

もう1つの注意点は、地球全体のような大きな地図データをPostgreSQLデータベースにインポートするのに長い時間がかかることです。 RAMを追加することを検討してください。特に、SSDを使用することを検討してください。 ハードディスクを回転させてインポートプロセスを高速化する代わりに。

全世界地図をホストする場合は、Contaboから特大のVPSを購入することをお勧めします。

  • 10コアCPU
  • 60 GB RAM
  • 1.6 TB Intel Optane SSD

月額わずか26.99ユーロです。

ステップ1:ソフトウェアをアップグレードする

サーバーで主要な作業を行う前に、サーバーソフトウェアを更新することをお勧めします。 SSH経由でサーバーにログインし、次のコマンドを実行します。

sudo apt update; sudo apt upgrade

ステップ2:PostgreSQLデータベースサーバーとPostGIS拡張機能をインストールする

マップデータの保存にはPostgreSQLを使用します。 PostGISはPostgreSQLの地理空間拡張です。次のコマンドを実行してインストールします。

sudo apt install postgresql postgresql-contrib postgis postgresql-10-postgis-2.4

PostgreSQLデータベースサーバーは自動的に起動し、 127.0.0.1:5432でリッスンします 。 postgres ユーザーは、インストールプロセス中にOS上に作成されます。 PostgreSQLデータベースサーバーのスーパーユーザーです。デフォルトでは、このユーザーにはパスワードがなく、 sudo を使用できるため、パスワードを設定する必要はありません。 postgresに切り替えます ユーザーとPostgreSQLサーバーにログインします。

sudo -u postgres -i

これで、PostgreSQLデータベースユーザー osmを作成できます。 。

createuser osm

次に、 gisという名前のデータベースを作成します 同時に、 osmを作成します データベースの所有者として。 -E UTF8 データベースで使用される文字エンコードスキームがUTF8であることを指定します。

createdb -E UTF8 -O osm gis

次に、 postgisを作成します およびhstore gisの拡張機能 データベース。

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

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

osmを設定します テーブルの所有者として。

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

postgresを終了します ユーザー。

exit

osmを作成します タイルサーバーをosmとして実行できるように、オペレーティングシステム上のユーザー ユーザー。次のコマンドは、パスワードなしでシステムユーザーを作成します。

sudo adduser --system osm

ステップ3:マップスタイルシートとマップデータをダウンロードする

osmのホームディレクトリに移動します。

cd /home/osm/

最新のCartoCSSマップスタイルシートをosmにダウンロードします gitを使用したユーザーのホームディレクトリ。

sudo apt install git

git clone https://github.com/gravitystorm/openstreetmap-carto.git

上記のコマンドの実行中に「permissiondenied」エラーが表示された場合は、次のコマンドを使用してアクセス許可を付与できます。 usernameを置き換えます 実際のユーザー名で。

sudo setfacl -R -m u:username:rwx /home/osm/

次に、次のコマンドを実行して、惑星全体(50G)の地図データをPBF(ProtoBufBinary)形式でダウンロードします。

wget -c http://planet.openstreetmap.org/pbf/planet-latest.osm.pbf

openstreetmap.orgのダウンロード速度は、現在2048 KB/sに制限されていることに注意してください。植物の地図は、次のような別のミラーからダウンロードできます

wget -c https://download.bbbike.org/osm/planet/planet-latest.osm.pbf

個々の国/州/県/市の地図が必要な場合は、http://download.geofabrik.deにアクセスしてください。また、BBBike.orgは、世界中の200を超える都市と地域の抜粋をさまざまな形式で提供しています。たとえば、次のコマンドを使用して、英国(1.1G)の地図データをダウンロードします。

wget -c http://download.geofabrik.de/europe/great-britain-latest.osm.pbf

ステップ4:PostgreSQLサーバーのパフォーマンスを最適化する

インポートプロセスには時間がかかる場合があります。このプロセスを高速化するために、いくつかのPostgreSQLサーバー設定を調整してパフォーマンスを向上させることができます。 PostgreSQLのメイン構成ファイルを編集します。

sudo nano /etc/postgresql/10/main/postgresql.conf

まず、 shared_buffersの値を変更する必要があります 。デフォルト設定は次のとおりです。

shared_buffers = 128MB

これは小さすぎます。経験則では、RAM全体の25%(スワップスペースを除く)に設定します。たとえば、私のVPSには60G RAMがあるので、次のように設定します。

shared_buffers = 15GB

次の行を見つけます。

#work_mem = 4MB
#maintenance_work_mem = 64MB

繰り返しますが、値が小さすぎます。

work_mem = 1GB
maintenance_work_mem = 8GB

次に、次の行を見つけます。

#effective_cache_size = 4GB

私のようにRAMがたくさんある場合は、20Gのようにeffective_cache_sizeに高い値を設定できます。

effective_cache_size = 20GB

ファイルを保存して閉じます。変更を有効にするためにPostgreSQLを再起動します。

sudo systemctl restart postgresql

デフォルトでは、PostgreSQLはRAM内の巨大なページを使用しようとします。ただし、Linuxはデフォルトでは巨大なページを割り当てません。 PostgreSQLのプロセスIDを確認してください。

sudo head -1 /var/lib/postgresql/10/main/postmaster.pid

サンプル出力:

7031

次に、このプロセスIDのVmPeak値を確認します。

grep ^VmPeak /proc/7031/status

サンプル出力:

VmPeak: 16282784 kB

これは、PostgreSQLで使用されるピークメモリサイズです。次に、Linuxの巨大なページのサイズを確認します。

cat /proc/meminfo | grep -i huge

サンプル出力:

AnonHugePages:         0 kB
ShmemHugePages:        0 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB

必要な巨大ページの数を計算できます。 VmPeak値を巨大なページのサイズで除算します:16282784 kB / 2048kB=7950。/etc/sysctl.confを編集します。 ファイル。

sudo nano /etc/sysctl.conf

このファイルの最後に次の行を追加して、7950の巨大なページを割り当てます。

vm.nr_hugepages = 7950

ファイルを保存して閉じます。次に、変更を適用します。

sudo sysctl -p

meminfoをもう一度確認すると、

cat /proc/meminfo | grep -i huge

利用可能な7950の巨大なページがあることがわかります。

AnonHugePages:         0 kB
ShmemHugePages:        0 kB
HugePages_Total:    7950
HugePages_Free:     7950
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB

PostgreSQLを再起動して、巨大なページを使用します。

sudo systemctl restart postgresql

SSH接続が失われないように、SSHキープアライブを構成することをお勧めします。とても簡単です。ローカルのLinuxマシンでSSHクライアント構成ファイルを開くだけです。

sudo nano /etc/ssh/ssh_config

そして、ファイルの最後に次のテキストを貼り付けます。

ServerAliveInterval 60

次に、ファイルを保存して、Ubuntuサーバーに接続します。 VNCを介してリモートサーバーにアクセスし、不安定な接続がインポートプロセスを中断するのを防ぐこともできます。

ステップ5:マップデータをPostgreSQLにインポートする

地図データをインポートするには、 osm2pgsqlをインストールする必要があります OpenStreetMapデータをpostGIS対応のPostgreSQLデータベースに変換します。

sudo apt install osm2pgsql

postgresユーザーに権限を付与します。

sudo setfacl -R -m u:postgres:rwx /home/osm/

postgresに切り替えます ユーザー。

sudo -u postgres -i

次のコマンドを実行して、マップスタイルシートをロードし、データを gisにマップします。 データベース。 great-britain-latest.osm.pbfを置き換えます 独自のマップデータファイルを使用します。

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

ここで

  • -slim :通常モードではなくスリムモードで実行します。このオプションは、将来OSM変更ファイル(OSC)を使用して地図データを更新する場合に必要です。
  • -d gis :データベースを選択します。
  • -hstore :PostgreSQLテーブルの追加のhstore(キー/値)列に列のないタグを追加します
  • -マルチジオメトリ :postgresqlテーブルでマルチジオメトリ機能を生成します。
  • -スタイル :スタイルファイルの場所を指定します
  • -number-processes :サーバー上のCPUコアの数。私は10を持っています。
  • -C フラグは、キャッシュサイズをメガバイト単位で指定します。マシンの空きRAMの約70%である必要があります。キャッシュサイズが大きいほど、インポート速度が速くなります。たとえば、私のサーバーには60GBのRAMがあるので、 -C 32000を指定できます。 。 PostgreSQLにはshared_buffers用のRAMが必要になることに注意してください。次の式を使用して、キャッシュサイズの大きさを計算します。(Total RAM-PostgreSQL shared_buffers)* 70%
  • 最後に、地図データファイルの場所を指定する必要があります。

コマンド出力:

惑星の地図データ全体をインポートする場合は、-dropを使用します。 オプションと--flat-nodes インポート速度を上げるオプション。 --flat-nodesに注意してください このオプションは小さな地図には適していません。

osm2pgsql --slim -d gis --drop --flat-nodes 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

RAMの使用量は、インポートプロセス中に徐々に増加します。インポートが完了したら、 gisのすべての権限を付与します osmへのデータベース ユーザー。

psql -c "GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO osm;" -d gis

postgresを終了します ユーザー。

exit

ステップ6:mod_tileとRenderdをインストールします

mod_tile は、タイルを提供してレンダリングするために必要なApacheモジュールです。 OpenStreetMapタイルをレンダリングするためのレンダリングデーモンです。デフォルトのUbuntuリポジトリにはmod_tileは含まれていません およびrendered 、ただし、OSMPPAからインストールできます。

sudo apt install software-properties-common

sudo add-apt-repository ppa:osmadmins/ppa

sudo apt install libapache2-mod-tile renderd

インストール中に、Apache Webサーバーがインストールされ、Apache構成でmod_tileを有効にするかどうかを尋ねられます。 [はい]を選択してEnterキーを押します。これにより、mod_tileのApache構成ファイルが作成されます( /etc/apache2/sites-available/tileserver_site.conf

次のように、レンダリングデーモンが自動的に起動します。

systemctl status renderd

ステップ7:Mapnikスタイルシートを生成する

必要なパッケージをインストールします。

sudo apt install curl unzip gdal-bin mapnik-utils libmapnik-dev python3-pip

また、次のコマンドを使用して、アップストリームリポジトリからnodejsとnpmをインストールする必要があります。

curl -sL https://deb.nodesource.com/setup_12.x | sudo -E bash -
sudo apt-get install -y nodejs

次に、npmを使用してcartoパッケージをインストールします。

sudo npm install -g carto

psycopg2をインストールします Pythonモジュール。

sudo -H pip3 install psycopg2==2.8.5

postgresに切り替えます ユーザー。

sudo -u postgres -i

カルトスタイルのディレクトリにCdします。

cd /home/osm/openstreetmap-carto/

シェープファイルを取得します。

scripts/get-external-data.py

上記のコマンドの実行中に次のエラーメッセージが表示された場合は、DNSに問題があります。数分待ってから、Pythonスクリプトを再度実行してください。

Failed to establish a new connection: [Errno -3] Temporary failure in name resolution

次に、 cartoを使用してMapnikXMLスタイルシートを作成します。 マップスタイルシートコンパイラ。

carto project.mml > style.xml

gisのすべての権限を付与します osmへのデータベース ユーザー。

psql -c "GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO osm;" -d gis

postgresを終了します ユーザー。

exit

ステップ8:フォントをインストールする

ttf-dejavuをインストールする必要があります パッケージ。

sudo apt install ttf-dejavu

非ラテン文字を表示するには、次のパッケージをインストールします。

sudo apt install fonts-noto-cjk fonts-noto-hinted fonts-noto-unhinted ttf-unifont

ステップ9:レンダリングを構成する

レンダリングされた構成ファイルを編集します。

sudo nano /etc/renderd.conf

[rendered]で セクションで、サーバー上のCPUコアの数に応じてスレッドの数を変更します。

num_threads=10

[default]で セクションで、XMLとHOSTの値を次のように変更します。セミコロン(;)で始まる行はコメントであることに注意してください。

XML=/home/osm/openstreetmap-carto/style.xml
HOST=map.your-domain.com

[mapnik]で セクションで、 plugins_dirの値を変更します 以下に。

plugins_dir=/usr/lib/mapnik/3.0/input/

次のコマンドを使用して、デフォルトの入力プラグインディレクトリを印刷できます。

mapnik-config --input-plugins

ラテン文字以外の文字を表示する場合は、フォント設定を次のように変更することをお勧めします。

font_dir=/usr/share/fonts/truetype
font_dir_recurse=true

ファイルを保存して閉じます。次に、initスクリプトファイルを編集します

sudo nano /etc/init.d/renderd

次の行を見つけます。

RUNASUSER=www-data

ユーザーをosmに変更します 。これは、PostgreSQLデータベースからマップデータをロードするために必要です。

RUNASUSER=osm

ファイルを保存します。 osmを設定します / var / lib / mod_tile /の所有者として レンダリングされたタイルファイルを保持するディレクトリ。

sudo chown osm /var/lib/mod_tile/ -R

次に、レンダリングされたサービスを再起動します。

sudo systemctl daemon-reload

sudo systemctl restart renderd

レンダリングされたログを確認する必要があります。

sudo journalctl -eu renderd

レンダリングによってログにエラーが発生しないことを確認してください。エラーが発生しないと、マップが表示されません。

ステップ10:Apacheを構成する

OSM仮想ホストファイルを編集します。

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

ServerNameをmap.yourdomain.comのような独自のドメイン名に変更します 。このサブドメインのDNSAレコードも作成する必要があります。

ServerName map.yourdomain.com

ファイルを保存して閉じます。 Apacheを再起動します。

sudo systemctl restart apache2

次に、Webブラウザのアドレスバーに「

」と入力します。
map.your-domain.com/osm/0/0/0.png

世界地図のタイルが表示されます。おめでとうございます!独自のOSMタイルサーバーを正常に構築できました。

UFWファイアウォールを有効にしている場合は、必ず次のコマンドでポート80と443を開いてください。

sudo ufw allow 80,443/tcp

ステップ11:タイル化されたWebマップを表示する

タイル状のWebマップは、スリッピーマップとも呼ばれます。 OpenStreetMapの用語で。タイルサーバーに使用できる2つの無料のオープンソースJavaScriptマップライブラリがあります: OpenLayer およびリーフレット 。 Leafletの利点は、使い方が簡単で、地図がモバイルフレンドリーになることです。

OpenLayer

OpenLayerで滑りやすい地図を表示するには、openlayer.orgからJavaScriptとCSSをダウンロードし、webrootフォルダーに抽出します。

cd /var/www/

sudo wget https://github.com/openlayers/openlayers/releases/download/v5.3.0/v5.3.0.zip

sudo unzip v5.3.0.zip

次に、 index.htmlを作成します ファイル。

sudo nano /var/www/index.html

次のHTMLコードをファイルに貼り付けます。赤い色のテキストを置き換え、必要に応じて経度、緯度、ズームレベルを調整します。

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Accessible Map</title>
<link rel="stylesheet" href="http://map.yourdomain.com/v5.3.0/css/ol.css" type="text/css">
<script src="http://map.yourdomain.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://map.yourdomain.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>

ファイルを保存して閉じます。これで、ブラウザのアドレスバーにサブドメインを入力して、滑りやすい地図を表示できます。

map.yourdomain.com

または

map.yourdomain.com/index.html

リーフレット

Leftletで滑りやすい地図を表示するには、leftletjs.comからJavaScriptとCSSをダウンロードし、webrootフォルダーに解凍します。

cd /var/www/

sudo wget http://cdn.leafletjs.com/leaflet/v1.6.0/leaflet.zip

sudo unzip leaflet.zip

次に、 index.htmlを作成します ファイル。

sudo nano /var/www/index.html

次のHTMLコードをファイルに貼り付けます。赤い色のテキストを置き換え、必要に応じて経度、緯度、ズームレベルを調整します。

<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([53.555,9.899],5);
    L.tileLayer('http://map.yourdomain.com/osm/{z}/{x}/{y}.png',{maxZoom:18}).addTo(map);
</script>
</body>
</html>

ファイルを保存して閉じます。これで、ブラウザにサーバーのIPアドレスを入力して、滑りやすい地図を表示できます。

map.yourdomain.com

または

map.yourdomain.com/index.html

ステップ12:タイルの事前レンダリング

オンザフライでタイルをレンダリングすると、Webブラウザでのマップの読み込み時間が長くなります。オンザフライでレンダリングする代わりにタイルを事前レンダリングするには、次の render_listを使用します 指図。 -zを使用する および-Z フラグはズームレベルを指定し、サーバー上のCPUコアの数に応じてスレッドの数を置き換えます。 Render_list レンダリングデーモンにリクエストを送信して、マップタイルのリストをレンダリングします。事前にレンダリングされたタイルは、 / var / lib / mod_tileにキャッシュされます。 ディレクトリ。

render_list -m default -a -z 0 -Z 19 --num-threads=10

後でマップデータを更新した場合は、-force を使用して、すべてのタイルを再度事前レンダリングできます。 オプション。

render_list -m default -a -z 0 -Z 19 --num-threads=10 --force

マップタイルを背景にレンダリングするには、を追加します 最後に記号。

render_list -m default -a -z 0 -Z 19 --num-threads=10 &

これで、ターミナルウィンドウを閉じることができます。レンダリングの進行状況を確認するには、別のSSHセッションを開き、次のコマンドを実行します。

sudo journalctl -eu renderd

上記のコマンドは、 renderの最新のログを表示します サービス。次の行は、OSMサーバーがズームレベル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

ステップ13:HTTPSを有効にする

HTTPトラフィックを暗号化するために、Let’sEncryptから無料のTLS証明書を取得してインストールできます。まず、Ubuntu 18.04にLet’s Encryptクライアント(certbot)をインストールします。

sudo add-apt-repository ppa:certbot/certbot

sudo apt install certbot

Apache Webサーバーを使用しているため、Apacheプラグインもインストールする必要があります。

sudo apt install python3-certbot-apache

次に、次のコマンドを実行してTLS証明書を取得してインストールします。

sudo certbot --apache --agree-tos --redirect --hsts --staple-ocsp --must-staple --email [email protected] -d map.yourdomain.com

証明書がインストールされたら、Webページを更新すると、アドレスバーにロックが表示されます。

Firefoxのアドレスバーに黄色の三角形が表示されている場合は、タイルのURLがまだHTTPを使用していることを意味します。次のコマンドを使用して、index.htmlファイルを編集し、すべてのHTTPプロトコルをHTTPSに置き換える必要があります。

sudo sed -i 's/http/https/g' /var/www/index.html

ステップ14:HTTP2を有効にする

マップの読み込みパフォーマンスをさらに向上させるために、HTTP2プロトコルを有効にすることができます。まず、HTTP2モジュールを有効にする必要があります。

sudo a2enmod http2

次に、SSL仮想ホストファイルを開きます。

sudo nano /etc/apache2/sites-enabled/tileserver_site-le-ssl.conf

を開いた後に次のディレクティブを配置します タグ。

Protocols h2 http/1.1

ファイルを保存して閉じます。次に、変更を有効にするためにApacheを再起動します。

sudo systemctl restart apache2

OSMタイルサーバーへのアクセスを制限する

デフォルトでは、誰でもOpenLayerまたはLeafletを使用して、タイルサーバーのURLを使用して滑りやすいマップを作成できます。タイルサーバーへのアクセスを制限するには、Apache仮想ホストファイルを編集します。

sudo nano /etc/apache2/sites-enabled/tileserver_site-le-ssl.conf

に次の行を追加します タグ。

    <Location /osm>
        SetEnvIf Referer example\.com trusted_referer
        Order deny,allow
        Deny from all
        Allow from env=trusted_referer
    </Location>

上記のコードは、HTTPリファラーヘッダーに独自のドメインが含まれているかどうかを確認します。そうでない場合は、 / osmにアクセスします ディレクトリは拒否されます。バックスラッシュは、ドット文字をエスケープするために使用されます。信頼できる参照元として複数のホスト名を追加するには、次の構文を使用します。

SetEnvIf Referer (example\.com|www\.example\.com|map\.example\.com) trusted_referer

ファイルを保存して閉じます。次に、構文をテストします。

sudo apache2ctl -t

構文がOKの場合は、変更を有効にするためにApacheをリロードします。

sudo systemctl reload apache2

TLS証明書の自動更新

Cronジョブを作成して、TLS証明書を自動的に更新できます。 rootユーザーのcrontabファイルを開くだけです。

sudo crontab -e

ファイルの最後に次の行を追加します。

@daily certbot renew --quiet && systemctl reload apache2

異なるホスト上のPostgreSQLデータベースとWebサーバー

PostgreSQLとApacheWebサーバーが異なるホスト上にある場合は、 project.mmlを編集する必要があります。 Apacheホスト上のファイル。

nano /home/osm/openstreetmap-carto-4.20.0/project.mml

次の行を見つけます:

osm2pgsql: &osm2pgsql
  type: "postgis"
  dbname: "gis"
  key_field: ""
  geometry_field: "way"
  extent: "-20037508,-20037508,20037508,20037508"

PostgreSQLデータベースサーバーのIPアドレスを指定します。

osm2pgsql: &osm2pgsql
  type: "postgis"
  host: "10.0.0.2"
  dbname: "gis"
  key_field: ""
  geometry_field: "way"
  extent: "-20037508,-20037508,20037508,20037508"

ファイルを保存して閉じます。次に、 cartoを使用してMapnikXMLスタイルシートを作成します マップスタイルシートコンパイラ。

carto project.mml > style.xml

PostgreSQLデータベースサーバーで、メインの構成ファイルを編集します。

sudo nano /etc/postgresql/10/main/postgresql.conf

次の行を追加して、すべてのインターフェースでリッスンするようにPostgreSQLを設定します。

listen_addresses = '*'

ファイルを保存して閉じます。次に、PostgreSQLクライアント認証構成ファイルを編集します。

sudo nano /etc/postgresql/10/main/pg_hba.conf

osm を許可するには、ファイルの最後に次の行を追加します Apacheホストからログインするユーザー。 10.0.0.1をApacheホストのIPアドレスに置き換えます。

host   gis   osm   10.0.0.1/32   trust

ファイルを保存して閉じます。次に、PostgreSQLを再起動します。

sudo systemctl restart postgresql

Apacheホストでレンダリングデーモンを再起動します。

sudo systemctl restart renderd

レンダリングされたログを確認する必要があります。レンダリングによってログにエラーが発生しないことを確認してください。エラーが発生しないと、マップが表示されません。

sudo journalctl -eu renderd

また、PostgreSQLデータベースサーバーのポート5432へのアクセスを制限する必要があります。たとえば、次のUFWコマンドを使用して、ApacheホストのIPアドレスのみを許可できます。

sudo ufw allow in from 10.0.0.1 to any port 5432

結論

このチュートリアルが、Ubuntu18.04でOpenStreetMapタイルサーバーをセットアップするのに役立つことを願っています。いつものように、この投稿が役に立った場合は、無料のニュースレターを購読して、より多くのヒントやコツを入手してください。気をつけて🙂


Ubuntu
  1. Ubuntu22.04でWireGuardを設定する方法

  2. Ubuntu20.04でNFSサーバーとクライアントをセットアップする方法

  3. Ubuntu16.04でTeamSpeakサーバーをセットアップする方法

  1. Ubuntu18.04にSquidプロキシサーバーをセットアップしてインストールする方法

  2. Ubuntu /DebianLAMPサーバーをセットアップする方法

  3. Ubuntu20.04でリバースプロキシとしてNginxを設定する方法

  1. Ubuntu18.04でNginxサーバーブロックを設定する方法

  2. Ubuntu18.04でOpenVPNサーバーをセットアップする方法

  3. Ubuntu20.04でNginxサーバーブロックを設定する方法