Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

WebGISの構築 on Ubuntu20.04 LTS

はじめに

これまでQGISを使った位置情報の可視化についていくつか整理してきたが、これはデスクトップ側での操作方法のため、可視化したものを公開したり、周りと共同でアップロードするのには向いていない。
今回は、QGISで作成したレイヤを共有するためにWebGIS(QGIS-Server)をセットアップしてみたので、その内容をメモとして残しておく。

実行環境

【WebGISの導入環境】
  ・Ubuntu20.04 LTS(GCP上)
  ・QGIS-Server 3.10.4
  ・Apache2.4.41

やりたい事

1.GCPにUbuntuのインスタンス作成
2.QGIS-Serverのインストール
3.Apache2のインストール

※2以降の手順は、基本的に 公式ドキュメント に沿って構築していく。

1.GCPにUbuntuのインスタンス作成

・GCPのホーム画面に入り、[新しいプロジェクト] をクリック。(ブラウザはChrome)
Qiita-no010_img01.jpg

・プロジェクト作成画面が開くため『プロジェクト名』を決めて [作成] をクリック。

・ナビゲーションメニュー内の【ComputeEngine > VMインスタンス】をクリック。
Qiita-no010_img02.jpg

・[作成] をクリックし、以下の情報を入力、選択したら [作成] をクリック。

 <右側は今回の設定値>
  ●名前   :qgis-web-client2
  ●リージョン:asia-northeast1(東京)
  ●ゾーン  :asia-northeast1-b

  ●マシン構成
    マシンファミリー:汎用
    シリーズ    :E2
    マシンタイプ  :e2-small
 
  ●ブートディスク
    OS      :Ubuntu
    バージョン  :Ubuntu20.04 LTS
    ディスクの種類:標準の永続ディスク
    サイズ    :10GB

  ●ファイアウォール
    HTTPトラフィックを許可
    HTTPSトラフィックを許可

  ●ネットワーキング(ネットワークインターフェース)
    外部IP:IPアドレスを作成
        ※名前は適当に決める。

  ※上記以外の設定値はデフォルトのまま

作成には少し時間がかかるが、作成が完了したら 接続-[SSH] をクリックしてコンソール画面を開く。
Qiita-no010_img03.jpg

ここから先の作業はrootログインして実行。(デフォルトのGCPアカウントユーザーで sudo を使えるが、毎回打つのが面倒なので)
※GCPのVMインスタンスにrootログインする方法はこちらの記事
 【GCPのVMインスタンスにrootでログインする方法】

2.QGIS-Serverのインストール

パッケージ管理ツールの更新。

$ apt update
$ apt -y upgrade

必要パッケージののインストール。

$ apt install -y nano curl iputils-ping net-tools

QGIS-Serverのパッケージをインストール

$ apt install qgis-server

QGISサーバーの実行ファイルの格納場所を確認。
公式ドキュメントでは /usr/lib/cgi-bin/qgis_mapserv.fcgi となっている。

$ find / -name 'qgis_mapserv.fcgi'
/usr/lib/cgi-bin/qgis_mapserv.fcgi

試しに実行してみる。

$ /usr/lib/cgi-bin/qgis_mapserv.fcgi

"Loading native module /usr/lib/qgis/server/libdummy.so"
"Loading native module /usr/lib/qgis/server/libwcs.so"
"Loading native module /usr/lib/qgis/server/libwfs.so"
"Loading native module /usr/lib/qgis/server/libwfs3.so"
"Loading native module /usr/lib/qgis/server/libwms.so"
"Loading native module /usr/lib/qgis/server/libwmts.so"
QFSFileEngine::open: No file name specified
Content-Length: 54
Content-Type: text/xml; charset=utf-8
Server:  Qgis FCGI server - QGis version 3.10.4-A Coruña
Status:  500
<ServerException>Project file error</ServerException>

この段階では、上記の様なレスポンスであれば正常に動いているという判断で良いらしい。

トレーニング用プロジェクトのダウンロード

### プロジェクトデータの格納先フォルダの作成
$ mkdir /home/qgis/
$ mkdir /home/qgis/projects/

### トレーニング用プロジェクトのダウンロード。
$ wget https://github.com/qgis/QGIS-Training-Data/archive/master.zip -d

### ダウンロードしたZIPファイルを解凍。 ※『QGIS-Training-Data-2.0』ディレクトリができる。
$ unzip master.zip

### 解凍したファイルのチュートリアル用データをコピー
$ cp -pr ./QGIS-Training-Data-master/exercise_data/qgis-server-tutorial-data/* /home/qgis/projects/

コピー先ディレクトリの中身を確認。

$ ls -l /home/qgis/projects/

total 13352
drwxrwxr-x 2  Icons
-rw-rw-r-- 1  README.md
drwxrwxr-x 2  Template
-rw-rw-r-- 1  naturalearth.sqlite
-rw-rw-r-- 1  world.qgs
-rw-rw-r-- 1  world3.qgs

# ※上記の表示は一部省略してる。

3.Apache2のインストール

・Apacheのインストール&起動確認
・confファイルを複製して編集
・仮想ホストを作成し、読み込むconfファイルとホスト情報を紐づける。

Apache HTTP server に必要なパッケージをインストール。

$ apt install -y apache2 libapache2-mod-fcgid

※そもそも、UbuntuのApache2構成についてはこちらの記事を参考に。
 【Apache2 on Ubuntu20.04 LTS】

cgi モジュールの有効化をして Ubuntu上のブラウザからhttp://localhost/cgi-bin/qgis_mapserv.fcgi?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetCapabilitiesのURLにアクセスする。

# モジュール有効化
$ a2enmod cgid

# Apache2の再起動
$ systemctl restart apache2

Ubuntu上のブラウザでは下の様な画面が表示されるはず。(Ubuntuへのリモデはこちらを参考に【Ubuntu on GCP にリモートデスクトップ接続】
Qiita-no010_img04.jpg
cgid が有効化されていない場合、『Not Found』となる。

 
モジュールの有効化、エイリアスをサイトconfigに設定するため、
/etc/apache2/sites-available/ に qgis_demo.conf を作成。

$ nano /etc/apache2/sites-available/qgis_demo.conf
/etc/apache2/sites-available/qgis_demo.conf
以下の内容で作成(公式ドキュメント参照)
-------------------------------------------------
<VirtualHost *:80>
        ServerAdmin webmaster@localhost
        DocumentRoot /var/www/html
        # Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
        # error, crit, alert, emerg.
        # It is also possible to configure the loglevel for particular
        # modules, e.g.
        #LogLevel info ssl:warn
        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined
        # For most configuration files from conf-available/, which are
        # enabled or disabled at a global level, it is possible to
        # include a line for only one particular virtual host. For example the
        # following line enables the CGI configuration for this host only
        # after it has been globally disabled with "a2disconf".
        #Include conf-available/serve-cgi-bin.conf


        # Tell QGIS Server instances to use a specific display number for xvfb
        # necessary for printing, see below
        FcgidInitialEnv DISPLAY ":99"

        # Activate QGIS log (different from apache logs)
        # 今回はここは設定されていなくても大丈夫
        #FcgidInitialEnv QGIS_SERVER_LOG_FILE /var/log/qgis/qgisserver.log
        FcgidInitialEnv QGIS_SERVER_LOG_LEVEL "0"
        FcgidInitialEnv QGIS_SERVER_LOG_STDERR "1"
        FcgidInitialEnv QGIS_DEBUG 1

        # Add a default QGIS project
        SetEnv QGIS_PROJECT_FILE /home/qgis/projects/world.qgs

        # QGIS_AUTH_DB_DIR_PATH must lead to a directory writeable by www-data
        # 今回はここは設定されていなくても大丈夫
        #FcgidInitialEnv QGIS_AUTH_DB_DIR_PATH "/var/www/qgis-server/qgisserverdb/"
        #FcgidInitialEnv QGIS_AUTH_PASSWORD_FILE "/var/www/qgis-server/qgisserverdb/qgis-auth.db"

        <IfModule mod_fcgid.c>
        # Longer timeout for WPS... default = 40
            FcgidIOTimeout 120
            FcgidMaxRequestLen 26214400
            FcgidConnectTimeout 60
        </IfModule>

        # /usr/lib/cgi-bin/qgis_mapserv.fcgi のパスへのエイリアスを作成。
        <Location /qgisserver>
            SetHandler fcgid-script
            FcgidWrapper /usr/lib/cgi-bin/qgis_mapserv.fcgi virtual
            Options +ExecCGI -MultiViews +FollowSymLinks
            Require all granted
        </Location>

</VirtualHost>
-------------------------------------------------

作成したサイト設定ファイル qgis_demo.conf をApache起動時にロードされる様に展開する。

# デフォルトのサイトは一旦削除
$ a2dissite 000-default

# 作成したファイルを展開
$ a2ensite qgis_demo
Enabling site qgis.demo.

/sites-available/qgis.demo.conf へのシンボリックリンクとして /etc/apache2/sites-enabled/qgis.demo.conf が作成される。
/etc/apache2/sites-enabled/*.confapache起動時に実行される。)

### モジュールを有効化
$ a2enmod fcgid
$ a2enconf serve-cgi-bin

### Apacheサービスの再起動
$ systemctl restart apache2

xvfbのインストールとサービスの登録

$ apt install -y xvfb

Xvfb 自体はLinuxなどディスプレイを持っていないOS上で、画面入出力をシミュレートするためのツール。デスクトップ環境を用意しなくてもChromeやFirefoxなどでテストができる。

[Xvfb] サービスファイルの作成。

$ nano /etc/systemd/system/xvfb.service
/etc/systemd/system/xvfb.service
[Unit]
Description=X Virtual Frame Buffer Service
After=network.target

[Service]
ExecStart=/usr/bin/Xvfb :99 -screen 0 1024x768x24 -ac +extension GLX +render -noreset

[Install]
WantedBy=multi-user.target

上記で作成した Xvfb サービスの開始

$ systemctl enable xvfb.service
$ systemctl start xvfb.service
$ systemctl status xvfb.service

apacheの再起動

$ systemctl restart apache2

Ubuntu内のブラウザから以下のURLにアクセスして、地図の様な画面が開かれればセットアップ完了!

http://localhost/qgisserver?MAP=/home/qgis/projects/world.qgs&SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&BBOX=-432786,4372992,3358959,7513746&SRS=EPSG:3857&WIDTH=665&HEIGHT=551&LAYERS=countries&FORMAT=image/jpeg

Qiita-no010_img05.jpg

※実はこの地図を開くところが上手く行かずにかなり手こずった。(画面を開くけど真っ白だった。)
原因は、参照にした公式ドキュメントに記載されていたトレーニングデータや最後のURL(パラメータ部分)の情報が古かったため。

まとめ

次はqgsファイルを格納して、ShapeデータやPostgreSQLのデータを表示できるかなどを試したいと思う。(まずはMAPのセットアップなどが必要かもしれないが...)

smiler5617
ITとデータサイエンスのスキルを向上させたいので、学んだことを発信していきます。 【年齢】30前半 【経験言語】html/css/javascript/php/python/R/SQL ※Tableau、QGIS、AA(RPA)も経験あり 【趣味】ゴルフ
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away