もなかアイスの試食品

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

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を使って、何かしらの機能なり画面なりを作って見ようと思う

CentOS6.8にPostgreSQL9.6とPostGIS2.3の環境構築

昔、PostgreSQL9.3でPostGISの環境構築をやったけど中々ブログに書くタイミングがなかった・・・

現在、PostgreSQLの最新は9.6なので、最新版でCentOS6.8に環境構築をしてみようと思う

ちなみにPostGISの公式のインストール方法はコチラ↓

postgis.net


まず、yumでインストール出来るようにrpmでパッケージを追加

# rpm -U https://download.postgresql.org/pub/repos/yum/9.6/redhat/rhel-6-x86_64/pgdg-centos96-9.6-3.noarch.rpm


また、PostGISのパッケージインストールするためにはepelリポジトリが必要なので、以下のコマンドでepelリポジトリを追加

# yum install epel-release


あと、間違ってCentOS6で標準のPostgreSQL8.4をインストールしてしまわないように、パッケージを場外しておく

以下のコマンドでリポジトリの設定の変更

# vim /etc/yum.repos.d/CentOS-Base.repo

「exclude=*postgres*」を「base」と「updates」に追記する。

[base]
name=CentOS-$releasever - Base
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os&infra=$infra
#baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6

# ↓追記
exclude=*postgres*

#released updates 
[updates]
name=CentOS-$releasever - Updates
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=updates&infra=$infra
#baseurl=http://mirror.centos.org/centos/$releasever/updates/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
# ↓追記
exclude=*postgres*



以下のコマンドで、PostgreSQL9.6とPostGISをインストールする。

# yum install postgresql96 postgresql96-server postgis2_96

「依存性が解決できない」等言われてインストールできないときは、epelリポジトリを参照していない設定になっている可能性があるため、オプション「--enablerepo=epel」を追加するとインストール出来るかも

# yum install --enablerepo=epel postgresql96 postgresql96-server postgis2_96



DBクラスタの作成する

# cd /var/lib/pgsql/9.6/
# su postgres
$ /usr/pgsql-9.6/bin/initdb data/
$ exit



DBを起動して、拡張機能PostGIS」を有効にする。

↓ postgresql-9.6デーモンの起動
# service postgresql-9.6 start

↓ コマンドで新しいDB「sample」を作成
# createdb -U postgres sample

↓ psqlでsampleにログインする
# psql -U postgres sample

↓ psqlでsampleにログインする
sample=# create extension postgis;



実際にPostGIS拡張機能が有効になったかテーブル・関数を見て確認

↓テーブルの確認
sample=# \d
                 リレーションの一覧
 スキーマ |       名前        |    型    |  所有者  
----------+-------------------+----------+----------
 public   | geography_columns | ビュー   | postgres
 public   | geometry_columns  | ビュー   | postgres
 public   | raster_columns    | ビュー   | postgres
 public   | raster_overviews  | ビュー   | postgres
 public   | spatial_ref_sys   | テーブル | postgres


↓関数の確認
sample=# \df
非常に長い・・・qで表示を中断できる

備考

「create extension」を実行せずに、PostGISの機能を利用することは可能

以下、公式サイトからの転記(Chapter 2. PostGIS Installation

createdb yourdatabase
createlang plpgsql yourdatabase
psql -d yourdatabase -f postgis.sql
psql -d yourdatabase -f postgis_comments.sql
psql -d yourdatabase -f spatial_ref_sys.sql
psql -d yourdatabase -f topology.sql
psql -d yourdatabase -f topology_comments.sql

ただし、PostgreSQLのバージョンアップ(9.3→9.5)する時にDBバックアップが使えない。

PostGISのバージョンも変わっており、関数内の共有ライブラリのファイルパスが「2.1→2.2」と変化しているため、バックアップの復元でコケる。

バージョンアップやLinuxWindows、またはWindowsLinuxへ移植しやすくするためには、「create extension」で機能を有効化したほうが良いでしょう。

自分は初めて9.3で環境構築した時は、SQLから構築したため結構ハマった・・・

Apache2.4 + Windowsでサーバが固まった話

Windows + Apacheでエラくハマった

以下が当時の環境

PHPのアプリが遅い」と言われ、

PHPの処理を見直したり、TCPの通信ログを取ってみたり、

WEBサーバとDBサーバの通信が怪しいということ(にしておいて)、それぞれのサーバのTCPのやり取り・フラグをシーケンス図に書いたりした結果

わからないこと が わかった

どうしようかな~と思ったとき、PHPにはスクリプトの処理時間が30秒(デフォルトで)以上掛かると、 処理を中断する機能があったことを思い出した。

なんでそれが動作しないんだろうなー・・・

あり得るとしたら・・・Apacheが固まっているぐらいしか・・・

いやーそんなことあるのかなー(半信半疑)?

Apache Windows 固まる」で検索したら直ぐに出てきたでござる(´・ω・`)

blog.wolfs.jp

上記のサイトを参考に設定を追加した。

# Apparently this fixes an issue with Apache 2.4.6 on Windows hanging
# when serving requests from Internet Explorer 10/11.
# see http://stijndewitt.wordpress.com/2014/01/10/apache-hangs-ie11/
# Windows + Apacheでプロセスが固まるのを防ぐための設定
AcceptFilter http none
AcceptFilter https none

動作を確認した所、一応現象は出なくなった

アプリケーションが遅いって言われたら、まず疑うべきはアプリケーションより環境やなと思った今日このごろです。