我遇到了 php-fpm 的问题。它实际上是 php7 版本。我有 drupal,它会抱怨某些目录不可写。只有当我像这样将 php-fpm 作为服务启动时才会出现这种情况:
#服务 php-fpm 启动
我使用 nginx 作为 Web 服务器,使用 php-fpm,端口为 127.0.0.1:9000。这是我在 /etc/php-fpm.d/www.conf 中的配置:
; Start a new pool named 'www'.
[www]
user = nginx
group = nginx
listen = 127.0.0.1:9000
所有 web - drupal 的文档都属于 nginx:nginx。如果我启动该服务,则
#服务 php-fpm 启动
或者
#systemctl 启动 php-fpm
它会抱怨权限问题,即使 ps 显示这一点(ps aux | grep php-fpm):
root 1591 0.0 0.8 528916 31260 ? Ss 07:49 0:00 php-fpm: master process (/etc/php-fpm.conf)
nginx 1593 0.0 2.2 567252 79768 ? S 07:49 0:03 php-fpm: pool www
nginx 1594 0.0 1.9 565248 72004 ? S 07:49 0:01 php-fpm: pool www
nginx 1595 0.0 2.0 567268 73040 ? S 07:49 0:02 php-fpm: pool www
nginx 1596 0.0 2.0 573440 75320 ? S 07:49 0:01 php-fpm: pool www
nginx 1597 0.0 1.9 568704 71812 ? S 07:49 0:02 php-fpm: pool www
nginx 1600 0.0 2.0 572360 74632 ? S 07:50 0:01 php-fpm: pool www
nginx 1604 0.0 1.8 565264 68584 ? S 07:53 0:01 php-fpm: pool www
看起来用户设置正确了。但是它不起作用。
现在我真正不明白的是,如果我执行这个:
#/usr/sbin/php-fpm --nodaemonize --fpm-config /etc/php-fpm.conf
这是服务中描述的命令(/usr/lib/systemd/system/php-fpm.service) - 那么我没有权限问题。
ps aux | grep php-fpm 的输出相同,其中 nginx 是用户。
我以 root 身份执行所有操作。
这怎么可能?
编辑
这已成为 SElinux 问题。我在审计日志中发现了以下内容:
denied { write } for pid=2755 comm="php-fpm" name="files" dev="xvda1" ino=9167949 scontext=system_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:httpd_sys_content_t:s0 tclass=dir
我希望 php-fpm 写入的目录是名为 vanilladrupal 的目录
# ls -Z .
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 html
drwxr-xr-x. nginx nginx unconfined_u:object_r:httpd_sys_content_t:s0 vanilladrupal
进程 php-fpm 具有以下上下文:
ps Zaux | grep php-fpm
system_u:system_r:httpd_t:s0 root 2749 0.0 0.8 528916 31212 ? Ss 03:03 0:00 php-fpm: master process (/etc/php-fpm.conf)
system_u:system_r:httpd_t:s0 nginx 2751 0.0 0.5 529548 19456 ? S 03:03 0:00 php-fpm: pool www
and the other pool wwww look the same
selinux 配置如下:
SELINUX=enforcing
SELINUXTYPE=targeted
我应该做哪些改变?
(这里,有点认为它的设置方式应该没有权限问题)
(我尝试通过更改用户来更改目录“vanilla drupal”的上下文,使其看起来与 html 相同(我假设如果我将目录放在 html 中,就不会有任何问题)。但我只收到了更多的错误(禁止 {execmem})。
答案1
您将需要更改 Drupal 需要写入的所有文件的 SELinux 上下文httpd_sys_rw_content_t
,如下所示:
semanage fcontext -a -t httpd_sys_rw_content_t'/usr/share/nginx/html/drupal/admin/config/media/file-system(/.*)?'
我不知道您的路径是什么,您需要在Configuration
-> Media
->中的 Drupal 界面中检查Filesystem
更多信息。