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の無効化
- "Development Tools"をインストール
- ApacheサーバのインストールとEPELリポジトリの追加
- PHP5.6のインストール
- PostgreSQL9.6 & PostGIS2.3のインストール
- MapServerのビルド & インストール
- Apacheサーバの起動
- MapServerにアクセスしてみる
今回構築したMapServerの環境
- CentOS6.8(最小インストール)
- Apache 2.2
- PHP 5.6
- PostgreSQL 9.6
- PostGIS 2.3
- MapServer 6.4.4
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クラスタの構築・サーバ起動については過去記事と同じなのでリンク
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」のソースコードを変更する
ソースコード「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」でインストールされたCGIをApacheにコピーする
# 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の公式のインストール方法はコチラ↓
まず、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
↓ 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」と変化しているため、バックアップの復元でコケる。
バージョンアップやLinux→Windows、またはWindows→Linuxへ移植しやすくするためには、「create extension」で機能を有効化したほうが良いでしょう。
自分は初めて9.3で環境構築した時は、SQLから構築したため結構ハマった・・・
Apache2.4 + Windowsでサーバが固まった話
以下が当時の環境
- Windows Server 2012 R2
- Apache 2.4
- PHP 5.6
「PHPのアプリが遅い」と言われ、
WEBサーバとDBサーバの通信が怪しいということ(にしておいて)、それぞれのサーバのTCPのやり取り・フラグをシーケンス図に書いたりした結果
わからないこと が わかった
どうしようかな~と思ったとき、PHPにはスクリプトの処理時間が30秒(デフォルトで)以上掛かると、 処理を中断する機能があったことを思い出した。
なんでそれが動作しないんだろうなー・・・
あり得るとしたら・・・Apacheが固まっているぐらいしか・・・
いやーそんなことあるのかなー(半信半疑)?
「Apache Windows 固まる」で検索したら直ぐに出てきたでござる(´・ω・`)
上記のサイトを参考に設定を追加した。
# 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
動作を確認した所、一応現象は出なくなった
アプリケーションが遅いって言われたら、まず疑うべきはアプリケーションより環境やなと思った今日このごろです。