move_uploaded_fileは「ストリームを開くことができませんでした:権限が拒否されました」エラーを表示します


143

CentOSでApache 2.2およびPHP 5.3を使用してアップロードディレクトリを設定しようとすると、このエラーが発生し続けます。

php.iniで:

upload_tmp_dir = /var/www/html/mysite/tmp_file_upload/

httpd.conf:

Directory /var/www/html/mysite/tmp_file_upload/>
    Options  -Indexes
    AllowOverride None
    Order allow,deny
    Allow from all
</Directory>
<Directory /var/www/html/mysite/images/>
                Options -Indexes
</Directory>

CentOSディレクトリの権限:

drwxrwxr-x 2 root root 4096 Nov 11 10:01 images
drwxr-xr-x 2 root root 4096 Nov 12 04:54 tmp_file_upload

私が何をしても、ファイルをアップロードすると、PHPからこのエラーが発生し続けます。

警告:move_uploaded_file(images / robot.jpg):ストリームを開けませんでした:78行目の/var/www/html/mysite/process.phpでアクセスが拒否されました

警告:move_uploaded_file():/var/www/html/mysite/process.phpの「/ tmp / phpsKD2Qm」を/images/robot.jpgに移動できません78行目

ご覧のとおり、アップロードファイルに関するphp.iniファイルからの設定はありません。

ここで何が悪いのですか?


775?サーバーがだれも実行していない可能性があります。この場合、rootのみが書き込みできます(「イメージ」権限)...
Konrad Borowski

どういう意味ですか ?どうすれば変更できますか?
user63898

すべての親ディレクトリにも適切な権限が必要であることに注意してください。
Sridhar Sarnobat 2017

回答:


188

これはあるimagestmp_file_uploadのみが書き込み可能なrootユーザー。アップロードを機能させるには、これらのフォルダーの所有者をhttpdプロセスの所有者と同じにするか、グローバルに書き込み可能にする必要があります(悪い習慣)。

  1. Apacheプロセスの所有者を確認してください:$ps aux | grep httpd。最初の列は通常、所有者になりますnobody
  2. 所有者を変更imagesしてtmp_file_uploadなることをnobodyまたは任意の手順1で見つかった所有者。

    $sudo chown nobody /var/www/html/mysite/images/
    
    $sudo chown nobody /var/www/html/mysite/tmp_file_upload/
  3. Chmod imagestmp_file_upload、必要に応じて、所有者が書き込み可能になりました[すでにこれを使用しているようです]。@Dmitry Teplyakovの回答に記載されています。

    $ sudo chmod -R 0755 /var/www/html/mysite/images/
    
    $ sudo chmod -R 0755 /var/www/html/mysite/tmp_file_upload/
  4. この動作が発生した理由の詳細については、マニュアルhttp://php.net/manual/en/ini.core.php#ini.upload-tmp-dirを確認してくださいopen_basedir。ディレクティブについても言及していることに注意してください。


4
おかげで:私たちの古い所有者はデーモン
でした

この修正は、サーバーのphpタイプをfast_CGI、CGIからApache_modに変更する可能性がある状況に適用されます。これで問題が解決しました。
elliotrock 2014年

1
これと同じエラーが発生していますが、プロセスとフォルダの両方がjacob(ローカルマシンなので)私が所有し、すべてのフォルダが755またはを持っています775
limeandcoconut 2015

sudo service httpd restart権限を変更した後、Apacheプロセスを再起動する必要がありました。次に、それは機能しました:)所有者chownを変更する代わりに、Apacheプロセスを「www」グループに追加し、これらのディレクトリを同じ「www」グループに追加しましたchgrp
Ali Saeed

76

このスクリプトを実行して、Apacheプロセスの所有者を確認することもできます。

<?php echo exec('whoami'); ?>

次に、宛先ディレクトリーの所有者を、取得したものに変更します。次のコマンドを使用します。

chown user destination_dir

そして、コマンドを使用します

chmod 755 destination_dir

宛先ディレクトリの権限を変更します。


3
ありがとうございます。最初にLaith Shadeedの方法を使用しましたが、ps aux |と入力しても同じ結果が得られませんgrep httpdおよび<?php echo exec('whoami'); ?>。なぜ誰か知っていますか?
Kukinsula 14年

1
ps aux | grep httpsはWebサーバーの所有者名を返しません。これは:ps aux | grep -E '[a] pache | [h] ttpd | [_] www | [w] ww-data | [n] ginx' | grep -v root | 頭-1 | cut -d \ -f1 Fron Symfonyドキュメント。
David Jacquel 2014

1
上記のコマンドでは、「-d \」と「-f1」の間に2つのスペースが必要です。そのままコピーアンドペーストすると、「cut:bad delimiter」のようなエラーが発生する場合があります。
Beejor 2015

1
プラス1 exec('whoami')。さらに30分節約できました。ubuntuユーザーをかき鳴らしていた
Khandelwal

11
これはwww-data通常
maxisme 2015

18

Mac OS Xを使用している場合は、Webサイトのファイルルートまたはフォルダに移動します。

次に、それを右クリックして、情報を取得し、一番下(共有と権限)に移動し、それを開いて、すべての読み取り専用を読み取りと書き込みに変更します。南京錠を開いて、設定アイコンに移動し、同封のアイテムに適用を選択してください...


Linuxシステムについての質問なのに、なぜMac OSについてコメントしているのですか?
Kmeixner 2016年

7
こんにちはホーカー、返信ありがとうございます。私はMacを使っています。あなたの答えが私の問題を解決しました。どうもありがとう。
Sanjay Sharma

2
この回答が大好きです
Alexey Sh。

2
@Kmeixner Linuxに関するこの質問ですが、OSXでもまったく同じ問題がありました。このコメントをありがとう、私/private/var/tmpは私のMacのフォルダーの書き込みオプションを変更した後、それは私のために働いた。
サラム

これは古い投稿ですが、まさにそれが私がする必要があったことです。ありがとう
TheRobQ

14

これでうまくいきました。

sudo adduser <username> www-data
sudo chown -R www-data:www-data /var/www
sudo chmod -R g+rwX /var/www

次に、ログアウトまたは再起動します。

SELinux不満がある場合は、以下を試してください

sudo semanage fcontext -a -t httpd_sys_rw_content_t '/var/www(/.*)?'
sudo restorecon -Rv '/var/www(/.*)?'

私の命を救った:) ..私はGIT post-reciveフックを使用してWebを展開し、展開するたびに彼の許可拒否エラーが発生し、Gitユーザーをwww-dataに追加して修正しました:)ありがとう
Zalaboza

これが最良の答えです。
saviour123 2017年

12

これを以前の提案に追加したかったのです。SELinuxが有効になっているバージョンのLinuxを使用している場合は、これもシェルで実行する必要があります。

chcon -R --type httpd_sys_rw_content_t /path/to/your/directory

グループを介して、またはディレクトリの所有者を変更して、Webサーバーにユーザー権限を付与する。


restorecon -R -v /path/to/your/directoryおそらくこれも後でこれに含める必要があります。access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/...
AbsoluteƵERØ

非常によく当てはまるかもしれませんが、私はchconが「変更されたコンテキスト」、つまり単に変更されたという仮定の下にありました。あなたが見ているものは、最初に「semanage fcontext」を使用して、それをいくつかの設定ファイル「file_contexts.local」に入れますが、コンテキストを変更することはありません。
Chris

@クリス、ありがとう。これは私の問題を解決しました。その件について少し光を当てていただけませんか。このコマンドは実際に何をしますか?manページとchconの情報まで調べましたが、入力したタイプの値が見つかりませんでした。ここでは少し混乱しています。
ジョーカー

ディレクトリまたはファイルをWebサーバー(httpd)で読み取り可能にします...正直に言って、私は自分でほとんど理解していないので、selinuxを説明したくありませんでした... nsa.gov/what-we-doを参照してください/研究/ selinuxを/ドキュメントaccess.redhat.com/documentation/en-us/red_hat_enterprise_linux/...
クリス・

11

このフォルダのアクセス許可を変更する

# chmod -R 0755 /var/www/html/mysite/images/


1
それは今のようになりました:drwxrwxr-x 2 root root 4096 Nov 11 10:01画像も:drwxrwxr-x 2 root root 4096 Nov 12 04:54 tmp_file_uploadでも同じエラー
user63898

7

これを試して:

  1. / etc / apache2 / envvarsを開きます

    sudo gedit /etc/apache2/envvars
  2. www-dataあなたと交換your_username

    "export APACHE_RUN_USER=www-data" 

    と置換する

    export APACHE_RUN_USER='your_username' 

7

composerを正常に実行した後でも、この関連する問題に遭遇しました。私は作曲家を更新しました、そして実行したときcomposer installまたはphp composer.phar install私は得ました:

...ストリームを開けませんでした:権限が拒否されました...

多くの調査の結果、フォルダのアクセス許可の変更に関する以前の回答が機能したことがわかりました。それらは現在、わずかに異なるディレクトリです。

私のインストールでは、OS Xでは、キャッシュファイルはにあり/Users/[USER]/.composer/cache、キャッシュファイルはrootが所有しているため、問題が発生しました。「.composer」の所有権をユーザーに再帰的に変更すると、問題は解決しました。

これは私がやったことです:

sudo chown -R [USER] cache

次に、コンポーザーのインストールを再度実行し、出来上がりました!


5

この問題は、Apacheユーザー(www-data)にフォルダーへの書き込み権限がない場合に発生します。この問題を解決するには、ユーザーをグループwww-data内に配置する必要があります。

私はこれを作った:

このphpコード<?php echo exec('whoami'); ?>を実行して、Apacheで使用されているユーザーを検出します。その後、ターミナルでコマンドを実行します。

user@machine:/# cd /var/www/html

user@machine:/var/www/html# ls -l

次のようなものが返されます。

total of files

drwxr-xr-x 7 user group size date folder

ユーザーを保持しましたが、グループをwww-dataに変更しました

chown -R user:www-data yourprojectfoldername

chmod 775 yourprojectfoldername

4

解決策はとても簡単です。IMAGE(宛先)フォルダーを右クリックして、プロパティに移動し、[権限]タブをクリックして、他のユーザーのアクセス権を[ ファイルの作成と削除 ]に変更するだけです


最速の方法ですが、FTPでGUIを使用しているのはあなただけです(FileZilla、WinSCP)
CLOUGH

3

tmp_file_uploadの権限を755に変更するだけです。以下はコマンドchmod -R 755 tmp_file_uploadです。


2

これを試して

find /var/www/html/mysite/images/ -type f -print0 | xargs -0 chmod -v 664


取得:chmod:「664」の後にオペランドがありません
user63898
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.