EC CUBE 2.13.5 を建てようとしたらハマった。
環境
OS Debian
PHP 5.4.16 (cli) (built: Nov 6 2016 00:29:02)
mysql Ver 14.14 Distrib 5.7.19, for Linux (x86_64) using EditLine wrapper
EC CUBEの公式ドキュメントから必須のライブラリだったりは確認済み。
php.iniを見るに全て enable になっている(MySQLも起動してる)。。。
だけど、
http://example.com/html/install/
を開くと
/var/www/html/html/../data/cache/ にユーザ書込み権限(777等)を付与して下さい。
というエラーが出て進めない。
この記事の目次
実行ユーザーと権限の確認
phpファイルを適当に作成(あとで必ず削除)して、
info.phpというファイル名でphpファイルを作成。
<?php phpinfo() ?>
http://example.com/info.phpで実行ユーザがApacheになっていることを確認
サーバーにログインして、
$ id apache $ cd /var/www/html/ $ ls -al
PHPの実行ユーザーにディレクトリの編集権限があることを確認
実行権限は間違いなくある。
コマンドでファイルの生成を試みる
書込み権限などは付与できているはずなので、コマンドでファイルの生成を試みる
$ su apache $ touch /var/www/html/data/cache/testfile
・・・作れた
コマンドラインからのファイル生成はできるけれど、phpからの編集ができない
とりあえず可能性があるものをどんどん試す
誤り1:Smartyのコンパイルエラー?
$params['filename'] = str_replace('\\', '/', $params['filename']); $params['filename'] = str_replace('//', '/', $params['filename']);
(参考:Azureでインストールしたら真っ白)
解決せず
誤り2:Session_start()が悪さしてる?
$ cd data/class/session/sessionfactory/ $ sudo vi SC_SessionFactory_UseCookie.php
SC_SessionFactory_UseCookie.php 56行目 - session_start(); + //session_start();
$ cd data/class/session/sessionfactory/ $ sudo vi SC_SessionFactory_UseRequest.php
SC_SessionFactory_UseRequest.php 190行目 - session_start(); + //session_start();
(参考:ECCUBEを入れようとしても真っ白)
解決せず
誤り3:PHPのバージョンの問題?
$ sudo apt-get install apt-file $ sudo apt-file update $ sudo apt-file search add-apt-repository $ sudo apt-get install software-properties-common $ sudo add-apt-repository ppa:ondrej/php $ sudo apt update $ sudo apt install php5.6
(参考:【PHP】Ubuntu 16.04ではPHP5.6をインストールすることは出来ない)
これでもダメでした。考えたら(Debianだから当然だけど)
エラーの発生箇所を調査
$ find ./ -type f -print | xargs grep 'ユーザ書込み権限(777等)' ./data/class/SC_Initial.php: . ' にユーザ書込み権限(777等)を付与して下さい。</div>';
findでテキストを検索してみたところ、./data/class/SC_Initial.phpのファイルでエラーを起こしてるがわかった。
SC_Initial.php 197行目 if (is_writable(CACHE_REALDIR)) { …. } else { die($errorMessage); // ここが実行されてる。 }
エラーログを全て書き出す
エラーログを吐き出すように、index.phpに下記を追加
ini_set( 'display_errors', 1 );
あらためてhttp://example.com/html/install/を開いて見る
Fatal error: Call to undefined function posix_getpwuid() in FILEDIR/FILENAME on line NUM
posix_getpwuidが存在しないと怒られた。なので、再度コマンドラインから下記を実行
$ sudo yum install php-posix php54w-posix $ sudo systemctl restart httpd
これで、is_writable自体はきちんと動作しているようだが、 Permission defined になった。
is_writable()がどうしてもfalseを返してしまう現象が起こっている
(参考:PHP is_writable() function always returns false for a writable directory)
僕の理解が追いついていないけれど、同様の症状の人がいたので回答のコマンドを叩いてみる
$ sudo chcon -R -t httpd_sys_rw_content_t tmp
だめだった。
phpファイル内からコマンド実行して、レスポンスを受け取ってみる。
test.php echo exec('id', $output); var_dump( $output ); uid=48(apache) gid=48(apache) groups=48(apache) context=system_u:system_r:httpd_t:s0array(1) { [0]=> string(84) "uid=48(apache) gid=48(apache) groups=48(apache) context=system_u:system_r:httpd_t:s0" }
うん。
ちゃんとユーザーはapacheでディレクトリの編集権限を持っているアカウントと同一。
結論:SELinuxのせいだった
SELinuxを停止したら動きました。
SELinuxをPermissiveモードにする
$ sudo setenforce 0
これで Permission defined が消えた!!
sudo vi /etc/selinux/config
config - SELINUX=Enforcing + SELINUX=disabled
$ sudo shutdown -r
(参考:SELinuxを無効にするには)