/var/www/html/html/../data/cache/ にユーザ書込み権限(777等)を付与して下さい。というエラーが出て進めない。

Pocket
LINEで送る

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
- session_start(); 
+ //session_start();
$ cd data/class/session/sessionfactory/
$ sudo vi SC_SessionFactory_UseRequest.php
- 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のファイルでエラーを起こしてるがわかった。

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ファイル内からコマンド実行して、レスポンスを受け取ってみる。

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
- SELINUX=Enforcing
+ SELINUX=disabled
$ sudo shutdown -r

(参考:SELinuxを無効にするには

SNSでもご購読できます。