1. HOME
  2. システム開発
  3. 〜YATTA〜 EC-CUBE3用にapacheのインスタンスとphpバージョンを分ける
システム開発

〜YATTA〜 EC-CUBE3用にapacheのインスタンスとphpバージョンを分ける

システム開発

117

2017年7月の EC-CUBE 2系のサポート終了日が近づいてきましたね。弊社でも EC-CUBE3 の構築案件が増えてくるようになりました。先日、弊社検証サーバーに EC-CUBE3 が素直にインストールできない事件が発生しましたので、その顛末を綴ろうかと思います。

phpのバージョンを素直にあげられない!

その他の CMS 同様、EC-CUBE3 をインストールしようと、何も考えずに検証サーバーにデータベースとインストールファイルを用意し、ブラウザからセットアップ画面を開こうとしたところ・・・。

ローカルの MAMP では何事もなく開いたセットアップ画面がひらきません・・・。
EC-CUBE3 のシステム要件 を確認してみますとそこにはこうありました・・・。

PHP対応バージョン  5.3.9 ~ 7.0.x

あ、ここです。完全にここです。弊社検証サーバーの php は 5系ですが 5.3.9 未満なのです。じゃあ何も考えずに yum であげればいいじゃんと思われるかもしれませんが、その他のシステムの検証用に、本番環境にあわせる形であえて php のバージョンを 5.3.9 未満にしているのです。いろいろと大人の事情で 5.3.9 未満なのです。

もう EC-CUBE3 用に apache のインスタンスを分けてしまおう! ということで、apache を分け、php をソースからビルドしてみました。そんなに時間かかんないだろうと思っていましたが、思いのほか詰まってしまいました・・・。(日曜日が潰れました)

今回のゴールとなる構成

apache
バージョン
apache
インスタンス名
apxs名 php
バージョン
その他のシステム 2.2.15 httpd apxs 5.3.9未満
EC-CUBE3 2.2.15 httpd2 apxs_for_httpd2 7.1.2

他のシステムはこれまでの apache と php5.3.9 未満を利用します。EC-CUBE3用に apache のインスタンス (httpd2) を分け、httpd2 では本記事執筆時の最新バージョンである php 7.1.2 を利用します。EC-CUBE3 のシステム要件には phpバージョン 7.0.x までとありますが、7.1.2 でもいまのところ動いております。(保証はできませんのでそこのところヨロシク)
なお、弊社検証サーバーは CentOS 6系です。apxs とはなんぞや?という方も、いまは読み飛ばしていただいて大丈夫です。後ほど解説します。

作業1. apache のインスタンスを分けよう

cp コマンドで、/etc/init.d/httpd デーモンと /etc/httpd 配下の設定ファイルをコピーします。






# cp -R /etc/httpd /etc/httpd2
# cp -R /etc/init.d/httpd /etc/init.d/httpd2

設定ファイルに以下を追加・変更します。

/etc/init.d/httpd






OPTIONS="-f /etc/httpd/conf/httpd.conf -k start"   //起動時に読み込む設定ファイル指定

/etc/init.d/httpd2






OPTIONS="-f /etc/httpd2/conf/httpd.conf -k start"  //起動時に読み込む設定ファイル指定
CONFFILE=/etc/httpd2/conf/httpd.conf               //起動時に読み込む設定ファイル指定
pidfile=${PIDFILE-/var/run/httpd2.pid}             //起動時のプロセスIDが既存のものと重複しない様、httpd2用に
lockfile=${LOCKFILE-/var/lock/subsys/httpd2}       //ファイルロック用設定を httpd2用に

/etc/httpd2/conf/httpd.conf






Listen      既存のhttpdと被らないポートを指定
ServerRoot  "/etc/httpd2"
PidFile     run/httpd2.pid

作業2. モジュールへのシンボリックリンク変更

これはやらなくていいのかもしれませんが、気持ち悪いので httpd2 用にライブラリを作成(コピー)し、モジュールへのシンボリックリンクも httpd2 用に変更しました。






# cp -R /usr/lib64/httpd /usr/lib64/httpd2
# cd /usr/lib64/httpd2
# ln -nfs ../../usr/lib64/httpd2/modules modules

問題なければ、この状態で # service httpd2 start コマンドにて httpd2 インスタンスが起動できるはずです。

作業3. apxs を準備

apxs とは httpd のモジュール追加時に利用するツールです。httpd-devel に含まれています。デベロッパー(開発者用)ツールなので、 CentOS 6 標準インストールの環境だと入っていませんでした。
$rpm -qa httpd-devel でインストールを確認できない場合は、






# yum install httpd-devel

で httpd-devel ごと入れちゃいましょう。弊社検証サーバーの環境では、 /usr/sbin の中に apxs ができました。






$ ls -al /usr/sbin | grep apxs
-rwxr-xr-x   1 root root       22029  1月 13 02:09 2017 apxs

この apxs を、httpd2 用に複製しておきます。






# cp /usr/sbin/apxs /usr/sbin/apxs_for_httpd2

作業4. php 7.1.2 をソースからビルド

適当なディレクトリに入り、php のソースを wget し解凍します。今回は /opt にしました。






# cd /opt/
# wget http://jp2.php.net/get/php-7.1.2.tar.gz/from/this/mirror -O php-7.1.2.tar.gz
# tar xzvf php-7.1.2.tar.gz

コンパイル時には、EC-CUBE3 に必要な各種ライブラリを指定します。
また、apxs には先ほどの apxs_for_httpd2 を指定します。
ビルド後は、php 7.1.2 用の php.ini をコピーしときます。






# cd /opt/php-7.1.2
#  ./configure \
>  --enable-mbstring \
>  --enable-zip \
>  --with-curl \
>  --with-zlib-dir=/usr \
>  --with-zlib=/usr \
>  --with-openssl \
>  --with-mysqli=mysqlnd \
>  --enable-mysqlnd \
>  --with-pdo-mysql=mysqlnd \
>  --prefix=/opt/php-7.1.2 \
>  --with-apxs2=/usr/sbin/apxs_for_httpd2

# make && make install
# cp /opt/php-7.1.2/php.ini-production /opt/php-7.1.2/php.ini

作業5. httpd2で php7.1.2 用の php.ini を参照するように設定

httpd2 の設定ファイルに以下を追加します。

/etc/httpd2/conf/httpd.conf






AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
PHPIniDir "/opt/php-7.1.2/php.ini"

作業6. httpd2 では php 実行時に php7 の ライブラリを使うように設定

最後に、http2 インスタンスでは php 7.1.2 のライブラリファイルである、libphp7.so を利用するように設定しておきます。






# cp /opt/php-7.1.2/libs/libphp7.so /usr/lib64/httpd2/modules/

/etc/httpd2/conf.d/php.conf






#
# PHP is an HTML-embedded scripting language which attempts to make it
# easy for developers to write dynamically generated webpages.
#

  LoadModule php7_module modules/libphp7.so


  LoadModule php7_module modules/libphp7-zts.so


#
# Cause the PHP interpreter to handle files with a .php extension.
#
AddHandler php7-script .php
AddType text/html .php

#
# Add index.php to the list of files that will be served as directory
# indexes.
#
DirectoryIndex index.php

#
# Uncomment the following line to allow PHP to pretty-print .phps
# files as PHP source code:
#
#AddType application/x-httpd-php-source .phps

・・・何も考えずに 5 の部分を 7にしました・・・。
modules/libphp7-zts.so は用意していませんが、apache を prefork方式で動かしているので問題ないと思います。気になるなら< IfModule worker.c >部は消しても良いと思います。

EC-CUBE3 のインストール画面を確認しよう

以上で作業は終了です。
/etc/httpd2/conf/httpd.conf に設定したポートに接続してみましょう。もちろん、ルートディレクトリに EC-CUBE3 のインストーラを設置するのをお忘れなく。

20170222_eccube3_install

問題なければ、ようやく上の画像のように EC-CUBE3 のインストール画面が表示されるはずです。


20170222_hakoda02

YATTA!!

参考

本記事執筆にあたり、次のサイトを参考にさせていただきました。

ナッツウェル技術研究室様
Apacheを複数のプロセスで起動する方法

俺的備忘録 〜なんかいろいろ〜様
CentOS 7でApacheのインスタンスごとに違うバージョンのPHPを利用する

このエントリーをはてなブックマークに追加