1. 問題の説明
今日WordPressサイトを新しいサーバーに移行したのですが、写真をアップロードすると「アップロードしたファイルをwp-content/uploadsに移動できません」というメッセージが表示されます。何が起こっているのでしょうか、また、なぜこのようなことが起こっているのでしょうか。
エラーは次のとおりです。
2023/02/20 08:57:48 [error] 9861#9861: *79624 FastCGI sent in stderr: "PHP message: PHP Warning: file_put_contents(/usr/share/nginx/html/wordpress/wp-content/uploads/wpo/images/wpo_logo_small.png.webp): failed to open stream: Permission denied in /usr/share/nginx/html/wordpress/wp-content/plugins/wp-optimize/vendor/rosell-dk/webp-convert/src/Convert/Converters/BaseTraits/DestinationPreparationTrait.php on line 71
PHP message: PHP Warning: file_put_contents(/usr/share/nginx/html/wordpress/wp-content/uploads/wpo/images/wpo_logo_small.png.webp): failed to open stream: Permission denied in
/usr/share/nginx/html/wordpress/wp-content/plugins/wp-optimize/vendor/rosell-dk/webp-convert/src/Convert/Converters/BaseTraits/DestinationPreparationTrait.php on line 71
PHP message: PHP Warning: file_put_contents(/usr/share/nginx/html/wordpress/wp-content/uploads/wpo/images/wpo_logo_small.png.webp): failed to open stream: Permission denied in
/usr/share/nginx/html/wordpress/wp-content/plugins/wp-optimize/vendor/rosell-dk/webp-convert/src/Convert/Converters/BaseTraits/DestinationPreparationTrait.php on line 71
PHP message: PHP Warning: file_put_contents(/usr/share/nginx/html/wordpress/wp-content/uploads/wpo/images/wpo_logo_small.png.webp): failed to open stream: Permission denied in
/usr/share/nginx/html/wordpress/wp-content/plugins/wp-optimize/vendor/rosell-dk/webp-convert/src/Convert/Converters/BaseTraits/DestinationPreparationTrait.php on line 71
PHP message: PHP Warning: file_put_contents(/usr/share/nginx/html/wordpress/wp-content/uploads/wpo/images/wpo_logo_small.png.webp): failed to open stream: Permission denied in
/usr/share/nginx/html/wordpress/wp-content/plugins/wp-optimize/vendor/rosell-dk/webp-convert/src/Convert/Converters/BaseTraits/DestinationPreparationTrait.php on line 71
PHP message: PHP Warning: file_put_contents(/usr/share/nginx/html/wordpress/wp-content/uploads/wpo/images/wpo_logo_small.png.webp): failed to open stream: Permission denied in
/usr/share/nginx/html/wordpress/wp-content/plugins/wp-optimize/vendor
上記のエラー ログの主なエラー メッセージは次のとおりです。
failed to open stream: Permission denied
即无法打开二进制流(即上传的图片),权限被拒绝
このような問題が発生した場合は、必ずエラー ログを確認してください。!!
nginxのエラーログ、phpのエラーログ、システムログなどについては、エラー情報を注意深く確認する必要があり、対応するエラー情報が表示されますが、それができない場合は、phpのデバッグモードを有効にすることができます。
2. 問題解決
2.1 所有者とグループを変更する
- 新しい nginx ユーザー グループを作成する
2.1 新しい nginx ユーザー グループを作成する
useradd nginx -s /sbin/nologin -M
- nginx設定ファイルを変更する
# vim /etc/nginx/nginx.conf
user nginx;
- php-fpm設定ファイルを変更する
find コマンドを使用して www.conf ファイルを見つけます。
find / -name www.conf
PHP起動ユーザーとユーザーグループを変更する
# vim /etc/php-fpm/www.conf
user = nginx
group = nginx
- nginx と php-rpm をリロードする
systemctl restart nginx
systemctl restart php-rpm
- Wordpress ユーザーとユーザー グループを変更する
wordpressのルートディレクトリ(判定基準はwp-admin、wp-content、wp-includesの3つのディレクトリ)に入り、ルートディレクトリ内の全ファイルのユーザーグループをnginxに変更します。
ファイル所有者の変更
chown -R nginx wordpress
ファイルユーザーグループの変更
chgrp -R nginx wordpress
-R は、WordPress ディレクトリとその下のすべてのファイルとディレクトリを変更することを意味します。
ps aux | grep nginxが有効になることを確認します。
2.2 すべての権限を付与する
ファイルが存在するディレクトリを見つけて、フォルダーのアクセス許可を 777 に設定します。(この方法は比較的暴力的です)
chmod -R 777 /usr/share/nginx/html/wordpress
2.3 ファイアウォールと selinux をオフにする
上記の 2 つの質問は、インターネット上のほとんどの人によって提起されていますが、次の selinux に関する質問は、あなたも考えたこともなかったはずです。
CentOS 7 では、SELinux はデフォルトで有効になっています。SELinux は、サーバーがリクエストを処理する方法と、ユーザーがソケット、ネットワーク ポート、およびベース ディレクトリと対話する方法を制限および定義することにより、サーバーのセキュリティを向上させます。SELinux では、 DocumentRoot へのファイルまたはディレクトリへのアクセスまたは書き込みに問題が発生する可能性があります。
解決策は次のとおりです: selinux を閉じる
永続的な方法 - サーバーの再起動が必要です
修改/etc/selinux/config文件中设置SELINUX=disabled ,然后重启服务器。
一時的な方法 - システムパラメータを設定する
コマンドを使用する
setenforce 0
ノート:
setenforce 1 设置SELinux 成为enforcing模式 (开启)
setenforce 0 设置SELinux 成为permissive模式(关闭)
2.4 SELinuxのセットアップ
セキュリティ上の理由から、システム全体が危険にさらされる可能性があるため、SELinux を無効にすることはお勧めできません。ただし、SELinux ポリシーを更新して、特定のディレクトリでの読み取りと書き込みを許可することができます。以下は、Apache ユーザーが Wordpress の特定のディレクトリに対して読み書きできるようにする SELinux ポリシーを設定するためのコマンドの完全なセットです。
- まず SELinux コンテキストを再確立します
restorecon -Rv /usr/share/nginx/html/wordpress
- ウェブルートの所有者を変更する
chown -R nginx:nginx /usr/share/nginx/html/wordpress
- 基本権限を変更する
chmod -R g+w /usr/share/nginx/html/wordpress
chmod g+s /usr/share/nginx/html/wordpress
- SELinux権限を確立する
# 将所有文件设为只读
chcon -R -t httpd_sys_content_t /usr/share/nginx/html/wordpress
# 只允许写入上传目录
chcon -R -t httpd_sys_rw_content_t /usr/share/nginx/html/wordpress/wp-content/uploads/
2.5 リモートファイルパラメータオープン
vim php.ini
设置 allow_url_fopen = On //该选项默认已开启,为on便是激活了 URL 形式的 fopen 封装协议使得可以访问 URL 对象文件等。
注:allow_url_fopen がオフの場合、fopen も file_get_contents もリモート ファイルを開くことができません。