PHPベースの ソフトウェアパッケージ をApache2.4.6とPHP)を搭載したRed Hat 7 Amazon EC2インスタンス(AMI-8cff51fb)にインストールしようとしています。 5.4.16 yumを使用してインストールされました。特定のディレクトリが0755または0775のアクセス許可を持つWebサーバーによって書き込み可能である必要があると表示されているため、インストールは失敗します。
問題のディレクトリには、root:Apache
所有権を持つ0775のアクセス許可があります。 httpdプロセスがApacheユーザーによって実行されていること、およびApacheユーザーがApacheグループのメンバーであることを確認しました。
/etc/passwd
を編集してApacheユーザーに一時的にログインシェルを与え、次にそのアカウントにsu
を与えると、touch
コマンドを使用してディレクトリ内にApacheユーザーとしてファイルを手動で作成できます。
インストーラースクリプトのソースコードを調べたところ、PHPのis_writable()
関数が問題のディレクトリに対してfalseを返しているため、失敗していることがわかりました。別のテストPHPスクリプトを作成して、表示されている動作を分離して検証しました。
<?php
$dir = '/var/www/html/limesurvey/tmp';
if (is_writable($dir)) {
echo $dir, ' is writable';
} else {
echo $dir, ' is NOT writable';
}
?>
書き込み不可のメッセージを出力します。上記の$dir
を/tmp
に変更すると、/tmp
が書き込み可能であることが正しく出力されます。
ディレクトリのアクセス許可を0777に変更したり、所有権をApache:apache
に変更したりすると、PHPは、ディレクトリが書き込み可能ではないことを報告します。同じアクセス許可で設定された/test
ディレクトリを作成しようとしました。所有権と私のテストスクリプトはまだ書き込み可能ではないと報告します。
私はこの振る舞いを説明するのに本当に途方に暮れているので、どんなアイデアでも歓迎します!
前もって感謝します。
/var/www/html/limesurvey
のディレクトリリストを以下に示します。 tmp
およびupload
ディレクトリには、Lime Surveyの インストール手順 に従って0775の権限があります。 test.php
は、上記の私のテストスクリプトです。
[ec2-user@ip-xx-x-x-xxx limesurvey]$ pwd
/var/www/html/limesurvey
[ec2-user@ip-xx-x-x-xxx limesurvey]$ ls -al
total 80
drwxr-xr-x. 20 root Apache 4096 Mar 30 11:25 .
drwxr-xr-x. 3 root root 23 Mar 25 14:41 ..
drwxr-xr-x. 2 root Apache 38 Mar 10 12:56 admin
drwxr-xr-x. 16 root Apache 4096 Mar 10 12:56 application
drwxr-xr-x. 3 root Apache 4096 Mar 10 12:56 docs
drwxr-xr-x. 2 root Apache 4096 Mar 10 12:56 fonts
drwxr-xr-x. 19 root Apache 4096 Mar 10 12:56 framework
-rw-r--r--. 1 root Apache 429 Mar 10 12:56 .gitattributes
-rw-r--r--. 1 root Apache 399 Mar 10 12:56 .gitignore
-rw-r--r--. 1 root Apache 296 Mar 10 12:56 .htaccess
drwxr-xr-x. 4 root Apache 4096 Mar 10 12:56 images
-rw-r--r--. 1 root Apache 6652 Mar 10 12:56 index.php
drwxr-xr-x. 5 root Apache 39 Mar 10 12:56 installer
drwxr-xr-x. 89 root Apache 4096 Mar 10 12:56 locale
drwxrwxr-x. 2 root Apache 39 Mar 25 14:41 logs
drwxr-xr-x. 4 root Apache 49 Mar 10 12:56 plugins
-rw-r--r--. 1 root Apache 61 Mar 10 12:56 README
drwxr-xr-x. 4 root Apache 4096 Mar 10 12:56 scripts
-rw-r--r--. 1 root Apache 380 Mar 10 12:56 .scrutinizer.yml
drwxr-xr-x. 5 root Apache 4096 Mar 10 12:56 styles
drwxr-xr-x. 5 root Apache 4096 Mar 10 12:56 styles-public
drwxr-xr-x. 12 root Apache 4096 Mar 10 12:56 templates
-rw-r--r--. 1 root Apache 159 Mar 30 11:11 test.php
drwxr-xr-x. 3 root Apache 20 Mar 10 12:56 themes
drwxr-xr-x. 26 root Apache 4096 Mar 10 12:56 third_party
drwxrwxr-x. 5 root Apache 80 Mar 26 13:45 tmp
drwxrwxr-x. 6 root Apache 79 Mar 10 12:57 upload
namei -l /var/www/html/limesurvey/tmp
を実行すると、次のようになります。
[ec2-user@ip-x-x-x-xxx ~]$ namei -l /var/www/html/limesurvey/tmp
f: /var/www/html/limesurvey/tmp
drwxr-xr-x root root /
drwxr-xr-x root root var
drwxr-xr-x root root www
drwxr-xr-x root root html
drwxr-xr-x root Apache limesurvey
drwxrwxr-x root Apache tmp
多くの頭を悩ませた後、SELinuxがディレクトリへの書き込みを妨げていることが判明しました。 何が起こっているのかを説明する良いチュートリアル を見つけました。このコマンドを実行することで修正できました:
Sudo chcon -R -t httpd_sys_rw_content_t tmp
inCentOS6上記はSELinuxで強制を有効にする必要があります
setenforce Permissive
ステータスを確認する
sestatus
https://wiki.centos.org/HowTos/SELinux を参照してください
ディレクトリに書き込むには、上記のディレクトリへの実行権限も必要です。
namei -l /var/www/html/limesurvey/tmp
正しい権限がないステップを表示する必要があります。
is_writableはデフォルトで、グループではなくユーザーのみをチェックします。したがって、グループが一致し、権限を持っている場合でも、is_writableはfalseを返します。このチェックを緩和するには、設定する必要があります
safe_mode_gid = On
PHP configで、またはそれに応じてユーザーを変更します。
HTTPDUSER=`ps aux | grep -E '[a]pache|[h]ttpd|[_]www|[w]ww-data|[n]ginx' | grep -v root | head -1 | cut -d\ -f1`
Sudo setfacl -R -m u:"$HTTPDUSER":rwX -m u:`whoami`:rwX tmp
Sudo setfacl -dR -m u:"$HTTPDUSER":rwX -m u:`whoami`:rwX tmp
Symfony2インストールガイドから直接取得したこれにより、ApacheツールとCLIツール間のキャッシュ書き込みアクセス共有の問題が解決されます。これは、tmp
ディレクトリでも機能する可能性があります。