WebGISの構築6−プロキシ化

今回は、下図赤枠部分に示す地図配信サーバーのリバースプロキシ化(以降、プロキシ化)を行います。

今回の作業範囲
  • ブラウザからのURL受付はWebサーバーのNGINXにて行います。
  • NGINXは地図配信サーバー(TileServer)にリクエストを転送します。

前回までの作業で、TileServerから地図タイル配信は可能となりました。このまま運用しても問題はないのですが、プロキシ化は実施しておくべきでしょう。その理由は、以下のようなものです。

  • ポート80(HTTPデフォルト)のアクセスがプロキシに1本化することで、アクセスログの収集や接続制御、セキュリティ設定が1本化される
  • 地図配信サーバーや静的HTMLファイルの配信などにポート80を共有できる
  • SSL化が容易に可能となる

プロキシ化の概要

プロキシとは、”代理者”を意味するもので、クライアントからのHTTPリクエストを一旦受け付け、その内容によりTileServerなどへリクエストを転送します。プロキシの動作例を示すと、下図のようにURLが”/map”の場合はTileServerにリクエストを転送し、“/index.html”の場合はファイルの内容をクライアントに配信する動きをします。

プロキシの動作例

プロキシ化の手順

プロキシ化は以下の手順で行います。
1.NGINXの導入
2.NGINXのコンフィグ設定
3.TileServerの起動パラメータ設定

なお、構築環境は以下の通りです。
・OS:CentOS8(CentOS Linux release 8.1.1911)
・Webサーバー:NGINX 1.14.1

NGINXの導入

NGINXの導入は、yumコマンドにて以下のように行います。

$ yum search nginx
$ sudo yum install nginx
Installed:
nginx-1:1.14.1-9.module_el8.0.0+184+e34fea82.x86_64
nginx-all-modules-1:1.14.1-9.module_el8.0.0+184+e34fea82.noarch
nginx-filesystem-1:1.14.1-9.module_el8.0.0+184+e34fea82.noarch
nginx-mod-http-image-filter-1:1.14.1-9.module_el8.0.0+184+e34fea82.x86_64
nginx-mod-http-perl-1:1.14.1-9.module_el8.0.0+184+e34fea82.x86_64
nginx-mod-http-xslt-filter-1:1.14.1-9.module_el8.0.0+184+e34fea82.x86_64
nginx-mod-mail-1:1.14.1-9.module_el8.0.0+184+e34fea82.x86_64
nginx-mod-stream-1:1.14.1-9.module_el8.0.0+184+e34fea82.x86_64
Complete!
$ nginx -v
nginx version: nginx/1.14.1
$ sudo systemctl enable nginx
Created symlink /etc/systemd/system/multi-user.target.wants/nginx.service → /usr/lib/systemd/system/nginx.service.
$ sudo systemctl start nginx

以下にコマンド(黄色下線)の内容を説明します。

  • nginxの存在をyumリポジトリ上で確認
  • rootユーザーにてyum installを実行
  • バージョン確認(nginx -v)
  • systemctlにてデーモン登録
  • systemctlにてデーモン起動

ここまで作業したらクライアント(ブラウザ)からNGINXを起動したサーバーへアクセスします。以下のような画面が表示されるとNGINXの導入は成功です。

起動成功時の画面

NGINXのコンフィグ設定

NGINXの導入が完了したら、以下のコンフィグファイルを設定してプロキシ化します。
 /etc/nginx/nginx.conf
 ※”/etc/nginx/conf.d/”配下の拡張子”.conf”のファイルを編集してもOK

例えば、サイトの”osaka”ディレクトリにアクセスがあった場合にポート20000で起動しているTileServerへリクエストを転送したい場合は、以下のように設定します。
それ以外の設定項目は、TileServer側にHTTPヘッダー情報を転送するための項目です。

server {
 location / {
  root /etc/nginx/www;
 }
 location /osaka/ {
  proxy_set_header Host $host;
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header X-Forwarded-Host $host;
  proxy_set_header X-Forwarded-Server $host;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_set_header X-Forwarded-Proto $scheme;
  proxy_pass http://localhost:20002/;
 }
}

設定が終了したら、以下のコマンドを実行してNGINXを再起動します。

$ sudo systemctl nginx restart

TileServerの起動パラメータ設定

NGINXのプロキシ設定が終了したら、Docker上のTileServerを停止し、以前のコンテナを削除してパラメータを変更して起動します。
コマンド的には、以下のようになります。

$ docker container stop tile-osaka
$ docker container remove tile-osaka
$ docker run -d -it –name tile-osaka -v /home/takamoto/tiladata/osaka:/data -p 20002:80 klokantech/tileserver-gl –public_url http://labo.takamoto.biz/osaka/

上記は、TileServerのポート番号を20002とし、公開URLを”http://labo.takamoto.biz/osaka/”としています。
また、TileServerの起動引数として、公開URLを指定(–public_url)を指定する必要があります。指定したURLは、TileServerが配信するHTMLやJavaScriptなどに埋め込むURLとして利用されます。
URLにアクセスすると、TileServerのデフォルト画面(下記画面)が表示されます。

TileServerのデフォルト画面

まとめ

今回は、NGINXを導入してTileServerにプロキシ経由でアクセスする環境を構築しました。
次回は、SSL化を行います。