質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.32%

cakephpの移行でエラー発生

解決済

回答 1

投稿

  • 評価
  • クリップ 1
  • VIEW 2,314

progman

score 50

以前CAKEPHPで開発したシステムを違うサーバに移行しとうとしているのですが、つまづいています。

以下のログのようにがファイルのアクセスエラー(〜 is not writable〜)が出ていますが、その下のlsの結果のように
アクセスできる状態となっていて、エラーとはならないはずではないでしょうか、
最初のほうにでている「_cake_core_ cache was unable to write 'cake_dev_ja' to File」も/tmp/cake配下のアクセス権では
ないかとおもいますが、前述のとおり問題ないとおもいます。

私が開発し、サーバも私が構築したのですが、PHP、CakePHPはこのシステムを構築してからは、ほとんど使っていません。
どこか、追加で確認したりする点はあるでしょうか?
アドバイスいただければとおもいます。

サーバはCentOS7で開発環境(XAMPP)5.6には移行できて、動作しています。

1./var/log/httpd/error_logの内容
[Fri Dec 22 21:55:22.201386 2017] [mpm_prefork:notice] [pid 25221] AH00170: caught SIGWINCH, shutting down gracefully
[Fri Dec 22 21:55:23.284201 2017] [core:notice] [pid 28576] SELinux policy enabled; httpd running as context system_u:system_r:httpd_t:s0
[Fri Dec 22 21:55:23.284965 2017] [suexec:notice] [pid 28576] AH01232: suEXEC mechanism enabled (wrapper: /usr/sbin/suexec)
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using localhost.localdomain. Set the 'ServerName' directive globally to suppress this message
[Fri Dec 22 21:55:23.307759 2017] [auth_digest:notice] [pid 28576] AH01757: generating secret for digest authentication ...
[Fri Dec 22 21:55:23.308913 2017] [lbmethod_heartbeat:notice] [pid 28576] AH02282: No slotmem from mod_heartmonitor
[Fri Dec 22 21:55:23.323517 2017] [mpm_prefork:notice] [pid 28576] AH00163: Apache/2.4.6 (CentOS) PHP/5.4.16 configured -- resuming normal operations
[Fri Dec 22 21:55:23.323556 2017] [core:notice] [pid 28576] AH00094: Command line: '/usr/sbin/httpd -D FOREGROUND'
[Fri Dec 22 21:55:32.814182 2017] [:error] [pid 28579] [client 192.168.0.2:62833] PHP Warning:  _cake_core_ cache was unable to write 'cake_dev_ja' to File cache in /opt/htdocs/cake/lib/Cake/Cache/Cache.php on line 310
[Fri Dec 22 21:55:32.814235 2017] [:error] [pid 28579] [client 192.168.0.2:62833] PHP Warning:  _cake_core_ cache was unable to write 'cake_dev_ja' to File cache in /opt/htdocs/cake/lib/Cake/Cache/Cache.php on line 310
[Fri Dec 22 21:55:32.814244 2017] [:error] [pid 28579] [client 192.168.0.2:62833] PHP Warning:  /tmp/cake/cache/persistent/ is not writable in /opt/htdocs/cake/lib/Cake/Cache/Engine/FileEngine.php on line 316
[Fri Dec 22 21:55:32.814333 2017] [:error] [pid 28579] [client 192.168.0.2:62833] PHP Warning:  /tmp/cake/cache/models/ is not writable in /opt/htdocs/cake/lib/Cake/Cache/Engine/FileEngine.php on line 316
[Fri Dec 22 21:55:32.814582 2017] [:error] [pid 28579] [client 192.168.0.2:62833] PHP Warning:  /opt/htdocs/cake/app/tmp/cache/ is not writable in /opt/htdocs/cake/lib/Cake/Cache/Engine/FileEngine.php on line 316
[Fri Dec 22 21:55:32.837404 2017] [:error] [pid 28579] [client 192.168.0.2:62833] PHP Warning:  file_put_contents(/tmp/cake/log/error.log) [<a href='http://php.net/function.file-put-contents'>function.file-put-contents</a>]: failed to open stream: No such file or directory in /opt/htdocs/cake/lib/Cake/Log/Engine/FileLog.php on line 69
[Fri Dec 22 21:55:32.839196 2017] [:error] [pid 28579] [client 192.168.0.2:62833] PHP Warning:  file_put_contents(/tmp/cake/log/error.log) [<a href='http://php.net/function.file-put-contents'>function.file-put-contents</a>]: failed to open stream: No such file or directory in /opt/htdocs/cake/lib/Cake/Log/Engine/FileLog.php on line 69
[Fri Dec 22 21:55:32.850936 2017] [:error] [pid 28579] [client 192.168.0.2:62833] PHP Warning:  file_put_contents(/tmp/cake/log/error.log) [<a href='http://php.net/function.file-put-contents'>function.file-put-contents</a>]: failed to open stream: No such file or directory in /opt/htdocs/cake/lib/Cake/Log/Engine/FileLog.php on line 69
[Fri Dec 22 21:55:32.851844 2017] [:error] [pid 28579] [client 192.168.0.2:62833] PHP Warning:  file_put_contents(/tmp/cake/log/error.log) [<a href='http://php.net/function.file-put-contents'>function.file-put-contents</a>]: failed to open stream: No such file or directory in /opt/htdocs/cake/lib/Cake/Log/Engine/FileLog.php on line 69
[Fri Dec 22 21:55:32.852065 2017] [:error] [pid 28579] [client 192.168.0.2:62833] PHP Warning:  file_put_contents(/tmp/cake/log/error.log) [<a href='http://php.net/function.file-put-contents'>function.file-put-contents</a>]: failed to open stream: No such file or directory in /opt/htdocs/cake/lib/Cake/Log/Engine/FileLog.php on line 69

2.デイレクトリ状態
[root@localhost httpd]# ls -ld /tmp/cake/cache/persistent/ /tmp/cake/cache/models/ /opt/htdocs/cake/app/tmp/cache/ /tmp/cake/log/
drwxrwxrwx. 5 apache apache 51 12月 20 06:08 /opt/htdocs/cake/app/tmp/cache/
drwxrwxrwx. 2 apache apache  6 12月 22 07:55 /tmp/cake/cache/models/
drwxrwxrwx. 2 apache apache  6 12月 22 07:53 /tmp/cake/cache/persistent/
drwxrwxrwx. 2 apache apache  6 12月 22 07:50 /tmp/cake/log/

3。各バージョン
[root@localhost httpd]# httpd -v
Server version: Apache/2.4.6 (CentOS)
Server built:   Oct 19 2017 20:39:16
[root@localhost httpd]# php -v
PHP 5.4.16 (cli) (built: Nov 15 2017 16:33:54) 
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2013 Zend Technologies
[root@localhost httpd]# tail -3 /opt/htdocs/cake/lib/Cake/VERSION.txt
// +--------------------------------------------------------------------------------------------+ //
////////////////////////////////////////////////////////////////////////////////////////////////////
2.0.3

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • asahina1979

    2017/12/22 22:38

    /tmp/cake/cache, /tmp/cake, /tmp のパーミッションは? 封鎖区域なきがするな

    キャンセル

回答 1

checkベストアンサー

+2

SELinuxが動いている状態なので、どうするか決めなければいけません。

[Fri Dec 22 21:55:23.284201 2017] [core:notice] [pid 28576] SELinux policy enabled; httpd running as context system_u:system_r:httpd_t:s0

SELinuxを無効にする場合は、下記のようにSELINUX=disabledにしてからサーバーを再起動します。

sudo vi /etc/selinux/config

SELinuxを使う場合はポリシーを作成しなくてはなりません。まずは、現在のSELinuxのモードをgetenforceコマンドで取得します。
Enforcing以外の場合は、一時的に下記に切り替えて作業を行います。PermissiveモードではSELinuxポリシー違反をログに出力してくれます。

setenforce Permissive

Auditが起動していない場合はうまくログに書き出してくれません。その場合はAuditを自動起動に設定してから/etc/selinux/configSELINUX=permissiveに変更して再起動します。再起動する前に下記のようにすれば自動的にラベルの再構築を行ってくれます。

sudo systemctl enable auditd.service
sudo touch /.autorelabel
sudo reboot

必要なルールは下記audit2allowコマンドで表示されます。多分httpd, mysqldなどが必要になるかと思います。

#audit2allowインストール
sudo yum -y install policycoreutils-python

#とりあえず、ぜんぶ確認してみる(見やすい形に成形)
sudo audit2allow -w -a 

#すべてのモジュールを確認
sudo audit2allow -a -m

#モジュールごとに確認
sudo audit2allow -a -m httpd
sodo audit2allow -a -m mysqld

必要なルールが表示されますので、local.teというファイルにコピペしていきます。下記の例の先頭のようにmodule local 1.0とすれば、SELinuxにlocalモジュールを追加するという意味になります。

下記は私のCentOS6開発環境での例です。
HTTPS利用、MySQLソケットファイルを/tmpに、PHPのDBアクセス、Dovecotを考慮してあります。

module local 1.0;

# Apache:
# Allow access ssl cert files
require {
    type user_devpts_t;
    type httpd_sys_script_t;
    class capability { dac_override };
    class chr_file { read write };
}

#============= httpd_sys_script_t ==============
allow httpd_sys_script_t self:capability { dac_override };
allow httpd_sys_script_t user_devpts_t:chr_file { read write };


# MySQL:
# Allow create socket file at /tmp
require {
        type tmp_t;
        type mysqld_t;
        class sock_file create;
}

#============= mysqld_t ==============
allow mysqld_t tmp_t:sock_file create;


# PHP: 
# Allow socket connection to DB from PHP
require {
    type init_t;
    class unix_stream_socket connectto;
}

#============= httpd_t ==============
allow httpd_t init_t:unix_stream_socket connectto;

# Dovecot:
# Allow read /var/spool/vmail/* directory from postfix
require {
        type postfix_virtual_t;
        type dovecot_spool_t;
        class dir create;
}

#============= postfix_virtual_t ==============
allow postfix_virtual_t dovecot_spool_t:dir create;

上記ファイルができたら、下記でモジュールをmakeしてからinstallします。

cd local.teを作成したディレクトリ
sudo checkmodule -m -M -o local.mod local.te
sudo semodule_package --outfile local.pp --module local.mod

#インストール
sudo semodule --install=local.pp

#確認
sudo semodule -l | grep local

コンパイルされた状態のルールモジュールを作成したい場合は、下記のようにできます。

sudo audit2allow -a -M モジュール名
sudo semodule --install=モジュール名.pp
sudo semodule -l | grep モジュール名

ルールモジュールを削除したい場合は下記のようにします。

sudo semodule -r モジュール名

最後にPHPアプリケーションがうまく動いていることを確認(必要なDBアクセスやメールなども確認しましょう)して、SELinuxのモードをEnforcingに戻して完了です。

sudo setenforce Enforcing

/etc/selinux/configファイルを変更している場合は、SELINUX=enforcingにしてからサーバーを再起動します。

sudo vi /etc/selinux/config

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/12/25 22:36

    レスありがとうございます。

    原因がわかりました。
    https://qiita.com/k1LoW/items/50017db5e66f87051afd
    などに書かれていますが、Private tmp という機能があって、
    /tmp下にアクセスしているつもりが、実際には
    /tmp/systemd-private-XXX-httpd.service-XXXXX/tmp
    にアクセスしているというものです。

    この長いディレクトリ名の下に/tmp/cake下のディレクトリをコピー
    して、正常動作を確認しました。

    実際の運用はどうするか、一考が必要ですが原因がわかったので、
    対応を考えればよいです。

    何度もレスありがとうございました。

    キャンセル

  • 2017/12/25 23:11

    なるほど勉強になりました。原因がわかってよかったです。レスが役に立ってなくてすみません。

    キャンセル

  • 2017/12/26 07:00

    今回は大きくいうと、SELinux、Private Tmpの2つの原因があって、
    SELinuxはTomakさんのアドバイスで解決したものです。
    これによりエラーが一気に減りました。

    lamppの環境でリリースしようかと、あきらめかけていたのですが、
    解決に近づいていると感じましたし、
    また、レスいただいたので、なんとか調査を続けようとおもいました。
    大変、感謝しています。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.32%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る