OpenStreetMapサーバをApache 1台、PostgreSQL 1台の2台構成にしました

弊社サービスのルナスコープやヨルカではOpenStreetMapの地図を利用していますが、今までは1台のサーバにApacheとPostgreSQLをインストールして利用していました。今回、地図データの更新とパフォーマンスアップの向上を狙って、Apache(Webサーバ) と PostgreSQL(DBサーバ)をそれぞれ用意する構成に変えました。(計測は行っていませんが、体感として若干早くなりました!)

こちらのページ( Installing an OpenStreetMap Tile Server on Ubuntu )がとても親切によくまとまっているので、この通りに進められればよいのですが、1台のサーバにApacheとPostgreSQLをインストールすることを前提としているため、かなり苦労しました。2台構成とするときの注意点だけブログでご紹介いたします。(あと、手順通りインストールしても設定ファイルが既に変わっており同じ手順が踏めない部分もはまりました。。)

今回利用するサーバ

・さくらのVPS 8G(CPU仮想6Core、メモリ8G):DBサーバ

・ さくらのVPS 4G(CPU仮想4Core、メモリ4G):Webサーバ

元々は、さくらのVPS 8G のサーバ1台にWebサーバとDBサーバを載せていたのですが、キャッシュされていない地図部分のリクエストが増えると、CPUリソースとメモリリソースをすべて使ってしまい、レスポンスが遅くなる現象を見ていました。パフォーマンスアップのため、少しだけ贅沢にしてWebサーバを分けることにしました。

Webサーバのrender(地図画像の生成プロセス)もCPUとメモリを食いますが、地図データを処理するPostgreSQLの方がリソースを使うので、DBサーバを8Gにしています。(もし、予算が潤沢にある場合は、1台のハイスペックマシンにWebサーバとDBサーバ載せてしまうほうがHTTPの通信時間が短くなるので一瞬早くなります。)

大まかな手順

基本的な考え方は「 Installing an OpenStreetMap Tile Server on Ubuntu 」で大丈夫です。ただ、2台構成にする時は「Install carto and build the Mapnik XML stylesheet」の項目の途中で工夫が必要でした。

project.mml を編集してから、style.xml を出力しないとうまく動きません!

project.mml の30行目くらいにある次の部分を見つけます。

27 osm2pgsql: &osm2pgsql
28 type: “postgis”
29 dbname: “gis”
30 key_field: “”
31 geometry_field: “way”
32 extent: “-20037508,-20037508,20037508,20037508”

そこに、DBサーバのhost、接続に使うuser、password、を指定します。

27 osm2pgsql: &osm2pgsql
28 type: “postgis”
29 host: “xxx.xxx.xxx.xxx”
30 user: “xxxxxx”
31 password: “xxxxxx”
32 dbname: “gis”
33 key_field: “”
34 geometry_field: “way”
35 extent: “-20037508,-20037508,20037508,20037508”

これをやってから、 「carto -a “3.0.22” project.mml > style.xml」 を実行してstyle.xml を作ります。

上記手順を行うことで、無事、2台サーバで地図を配信できるようになりました。

現在の地図サーバの動作は次のページで使っています。

ルナスコープ – 運営会社ページ: https://lunascope.io/company

ヨルカ – チケット&スタンプカード検索ページ: https://yoruca.me/search_shops