読者です 読者をやめる 読者になる 読者になる

もなかアイスの試食品

「とりあえずやってみたい」そんな気持ちが先走りすぎて挫折が多い私のメモ書きみたいなものです.

CentOS6.8にMapServerのビルド&インストールしてみた

はじめに

単純にMapServerのインストールなら、以下のコマンドでインストールされる

# yum install mapserver

↓参考サイト

システム覚書帳 : [mapserver]CentOS6.5でmapserver6.0.3をyumでインストール - めっちゃ簡単!

ただし、今回は「PHP 5.6」と「PostgreSQL 9.6」を使用したいので、ソースコードからコンパイル&インストールする方法でやる

MapServerの最新は「7.x」だけど、コンパイル時に依存的な問題に引っかかったため、6.4.4にした

今回構築したMapServerの環境

SELinuxの無効化

# vi /etc/sysconfig/selinux
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
#SELINUX=enforcing
SELINUX=disabled

CentOSを再起動する

"Development Tools"をインストール

# yum groupinstall "Development Tools"

ApacheサーバのインストールとEPELリポジトリの追加

# yum install httpd httpd-devel epel-release

PHP5.6のインストール

# rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
# yum install --enablerepo=remi,remi-php56 php php-devel php-mbstring php-pdo php-gd php-xml php-pear php-pgsql

PostgreSQL9.6 & PostGIS2.3のインストール

# rpm -Uvh https://download.postgresql.org/pub/repos/yum/9.6/redhat/rhel-6-x86_64/pgdg-centos96-9.6-3.noarch.rpm
# yum install postgresql96 postgresql96-server postgresql96-devel  postgis2_96

PostgreSQLのDBクラスタの構築・サーバ起動については過去記事と同じなのでリンク

monakaice88.hatenablog.com

MapServerのインストールだけなら不要なのでココでは省略

MapServerのビルド & インストール

MapServerのビルドとインストールは以下のサイトを参考にした

↓参考サイト

システム覚書帳 : [mapserver]CentOS6.5で、可能な限りyumでmapserverをセットアップする

↓公式サイト

Compiling on Unix — MapServer 7.0.4 documentation

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

# yum install libpng libpng-devel
# yum install freetype freetype-devel
# yum install libjpeg libjpeg-devel
# yum install zlib zlib-devel

推奨パッケージのインストール

# yum install proj proj-devel proj-epsg
# yum install libcurl libcurl-devel
# yum install gdal gdal-devel

オプションなパッケージのインストール

# yum install libtiff libtiff-devel
# yum install libgeotiff libgeotiff-devel
# yum install geos geos-devel
# yum install libxml2 libxml2-devel
# yum install giflib giflib-devel
# yum install fcgi fcgi-devel
# yum install cairo cairo-devel
# yum install libxslt libxslt-devel

MapServerのインストールに「cmake28」が必要なのでインストールする

# yum install cmake28

MapServerのソースコードのダウンロード

# cd
# yum install wget
# wget http://download.osgeo.org/mapserver/mapserver-6.4.4.tar.gz

ダウンロード可能なソースコードの一覧はこちら

MapServerのソースコードアーカイブを展開し、ビルド準備する

# tar xvhf mapserver-6.4.4.tar.gz
# cd mapserver-6.4.4
# mkdir build
# cd build
# cmake28 .. -DWITH_CURL=ON -DWITH_CLIENT_WFS=ON -DWITH_CLIENT_WMS=ON -DWITH_PHP=ON -DWITH_KML=ON -DWITH_XMLMAPFILE=ON -DWITH_POSTGIS=ON -DCMAKE_PREFIX_PATH=/usr/pgsql-9.6/bin/ -DWITH_FRIBIDI=0

cmakeコマンドがうまくいくと以下のように出力される

-- /usr/include/php/main
-- Found PHP5-Version 5.6.29 (using /usr/bin/php-config)
-- * Summary of configured options for this build
--  * Mandatory components
--   * png: /usr/lib64/libpng.so
--   * jpeg: /usr/lib64/libjpeg.so
--   * freetype: /usr/lib64/libfreetype.so
--  * Optional components
--   * GDAL: /usr/lib64/libgdal.so
--   * OGR: /usr/lib64/libgdal.so
--   * GD: disabled
--   * GIF: /usr/lib64/libgif.so
--   * MYSQL: disabled
--   * FRIBIDI: disabled
--   * GIF: /usr/lib64/libgif.so
--   * CAIRO: /usr/lib64/libcairo.so
--   * SVGCAIRO: disabled
--   * RSVG: disabled
--   * CURL: /usr/lib64/libcurl.so
--   * PROJ: /usr/lib64/libproj.so
--   * LIBXML2: /usr/lib64/libxml2.so
--   * POSTGIS: /usr/pgsql-9.6/lib/libpq.so
--   * GEOS: /usr/lib64/libgeos_c.so
--   * FastCGI: /usr/lib64/libfcgi.so
--   * Oracle Spatial: disabled
--   * SDE: disabled
--   * Exempi XMP: disabled
--  * Optional features
--   * WMS SERVER: ENABLED
--   * WFS SERVER: ENABLED
--   * WCS SERVER: ENABLED
--   * SOS SERVER: disabled
--   * WMS CLIENT: ENABLED
--   * WFS CLIENT: ENABLED
--   * ICONV: ENABLED
--   * Thread-safety support: disabled
--   * KML output: ENABLED
--   * Z+M point coordinate support: disabled
--   * XML Mapfile support: ENABLED
--  * Mapscripts
--   * Python: disabled
--   * PHP: ENABLED
--   * PERL: disabled
--   * RUBY: disabled
--   * JAVA: disabled
--   * C#: disabled
--   * Apache Module (Experimental): disabled
--
-- Will install files to /usr/local
-- Will install libraries to /usr/local/lib64
-- Configuring done
-- Generating done
-- Build files have been written to: /root/mapserver-6.4.4/build

cmakeコマンドが無事成功したときに「make && make install」コマンドを実行する・・・が

PHP5.6をインストールした環境(厳密には5.6.25以上?)では、「make」コマンド実行時に「mapscript/php/error.c 」でコンパイルエラーが発生する

↓こんな感じ

[ 82%] Building C object mapscript/php/CMakeFiles/php_mapscript.dir/error.c.o
/root/mapserver-6.4.4/mapscript/php/error.c: In function ‘zim_errorObj___get’:
/root/mapserver-6.4.4/mapscript/php/error.c:71: error: called object ‘zend_error’ is not a function
/root/mapserver-6.4.4/mapscript/php/error.c:72: error: called object ‘zend_error’ is not a function
make[2]: *** [mapscript/php/CMakeFiles/php_mapscript.dir/error.c.o] エラー 1
make[1]: *** [mapscript/php/CMakeFiles/php_mapscript.dir/all] エラー 2

これはPHPソースコードが変更されたため発生しているらしい

なので、以下のサイトを参考に「mapserver-6.4.4/mapscript/php/error.c」のソースコードを変更する

github.com

github.com

ソースコード「mapscript/php/error.c」未定義となっているマクロを34行目あたりに追記する

# vi /root/mapserver-6.4.4/mapscript/php/error.c
#if PHP_VERSION_ID >= 50625
#undef ZVAL_STRING
#define ZVAL_STRING(z, s, duplicate) do {       \
    const char *__s=(s);                            \
    zval *__z = (z);                                        \
    Z_STRLEN_P(__z) = strlen(__s);          \
    Z_STRVAL_P(__z) = (duplicate?estrndup(__s, Z_STRLEN_P(__z)):(char*)__s);\
    Z_TYPE_P(__z) = IS_STRING;                      \
} while (0)
#endif

もう一度ビルドを実行する

# cd /root/mapserver-6.4.4/build
# make
# make install

「make install」でインストールされたCGIApacheにコピーする

# cp /usr/local/bin/mapserv /var/www/cgi-bin/

Apacheサーバの起動

ポートの開放

# vi /etc/sysconfig/iptables
# Firewall configuration written by system-config-firewall
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
# ↓追記
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
# service httpd start

MapServerにアクセスしてみる

http://<サーバのIP>/cgi-bin/mapserv

ブラウザに以下の文字列が表示される。

No query information to decode. QUERY_STRING is set, but empty.

これが表示されると、無事にMapServerが動作している・・・らしい。

MapServerを構築したが、実は使い方がわかっていない・・・

次回以降にMapServerを使って、何かしらの機能なり画面なりを作って見ようと思う