Nginx

PHP move_uploaded_file 失敗

  • April 5, 2019

這是一個常見問題,但我仔細檢查了建議的解決方案,但沒有成功。

這些是來自 PHP 的錯誤:

Warning: move_uploaded_file(images/img01.jpg): failed to open stream: Permission denied in /usr/share/nginx/html/media/test.php on line 28

Warning: move_uploaded_file(): Unable to move '/tmp/phpRvUCVx' to 'images/img01.jpg' in /usr/share/nginx/html/media/test.php on line 28

伺服器已安裝 nginx 和 php 7.3 (php-fpm)

上傳文件夾權限:

drwxrwxrwx.  2 nginx  nginx       6 Apr  5 03:11 images

來自 ps aux | 的資訊 grep php

centos   24211  0.0  0.0 112708   980 pts/0    S+   16:01   0:00 grep --color=auto php
root     24674  0.0  0.6 285532 11452 ?        Ss   Apr04   0:04 php-fpm: master process (/etc/opt/remi/php73/php-fpm.conf)
nginx    24675  0.0  0.4 287740  8724 ?        S    Apr04   0:00 php-fpm: pool www
nginx    24676  0.0  0.4 287740  8720 ?        S    Apr04   0:00 php-fpm: pool www
nginx    24677  0.0  0.4 287740  8684 ?        S    Apr04   0:00 php-fpm: pool www
nginx    24678  0.0  0.5 287916  9232 ?        S    Apr04   0:00 php-fpm: pool www
nginx    24679  0.0  0.5 287916  9308 ?        S    Apr04   0:00 php-fpm: pool www
nginx    25107  0.0  0.4 287740  8716 ?        S    Apr04   0:00 php-fpm: pool www

來自 ps aux | 的資訊 grep nginx

root     15041  0.0  0.1 125116  2324 ?        Ss   Apr04   0:00 nginx: master process /usr/sbin/nginx
nginx    15042  0.0  0.2 125956  5328 ?        S    Apr04   0:00 nginx: worker process
nginx    15043  0.0  0.2 125956  5328 ?        S    Apr04   0:00 nginx: worker process
nginx    24675  0.0  0.4 287740  8724 ?        S    Apr04   0:00 php-fpm: pool www
nginx    24676  0.0  0.4 287740  8720 ?        S    Apr04   0:00 php-fpm: pool www
nginx    24677  0.0  0.4 287740  8684 ?        S    Apr04   0:00 php-fpm: pool www
nginx    24678  0.0  0.5 287916  9272 ?        S    Apr04   0:00 php-fpm: pool www
nginx    24679  0.0  0.5 287916  9308 ?        S    Apr04   0:00 php-fpm: pool www
nginx    25107  0.0  0.4 287740  8716 ?        S    Apr04   0:00 php-fpm: pool www
centos   26097  0.0  0.0 112712   976 pts/0    S+   16:39   0:00 grep --color=auto nginx

PHP-FPM 的配置

user = nginx
group = nginx
listen = /var/run/php73-fpm/php73-fpm.sock
listen.owner = nginx
listen.group = nginx

我錯過了什麼?提前致謝

您在這裡遇到了多個問題,其中一些問題可能是您在嘗試解決原始問題時介紹的。

首先,您的 PHP 程序似乎以 nginx 使用者身份執行。這不是預設配置,不推薦。您應該讓它按照最初設置的方式使用自己的使用者 ID 執行。

其次,您的images目錄的權限允許所有使用者對其進行寫入。這顯然是一個壞主意,永遠不應該這樣做,即使是“測試”也不應該。適當地設置所有權和權限。如果您想到chmod 777可能對您有所幫助的想法,請記住您走錯了路。

第三,您似乎已將您的網站文件放在/usr/share/nginx/html. 您不應該將此目錄用於您自己的文件;它僅適用於 nginx 附帶的預設文件。請改用下面的目錄/srv,例如/srv/www. 還要避免/var/www,這是為 Web 伺服器預設文件(通常是 Apache httpd 提供的文件)保留的另一個目錄。

最後,針對眼前的問題,SELinux 不允許 nginx 或 php-fpm 寫入隨機目錄。httpd_sys_rw_content_t您需要通過將其預設上下文設置為然後設置任何現有文件的上下文來告訴 SELinux 目錄及其內容應該是可寫的。例如:

semanage fcontext -a -t httpd_sys_rw_content_t "/srv/www/wherever/images(/.*)?"
restorecon -rv /srv/www/wherever/images

引用自:https://serverfault.com/questions/961736