Suexec/Apache 用户不是 php-fpm“用户”。
在我的 php-fpm 池中:
[cdnmin]
user = cdnmin
group = cdnmin
listen = /run/php/php7.0-fpm.cdnmin.sock
listen.owner = cdnmin
listen.group = cdnmin
listen.mode = 0666
pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
我创建了“index.php”用于测试:
<?php
file_put_contents('test.txt','Test');
echo exec('whoami');
echo '<hr>Current script owner: ' . get_current_user();
phpinfo();
?>
php-fpm 可以工作,但是权限错误,正如我的 error.log 所显示的那样
AH01071: Got error 'PHP message: PHP Warning: file_put_contents(test.txt):
failed to open stream: Permission denied ...'
php 'get_current_user()' 返回 'cdnmin',即 php-fpm 池用户。但 'whoami' 返回 www-data (apache2)
在 /run/php 内部:
srw-rw-rw- 1 cdnmin cdnmin 0 Jan 15 15:18 php7.2-fpm.cdnmin.sock
工作目录(/var/www/cdn)归 cdnmin:cdnmin 所有,并且为 755。
SuexecUserGroup cdnmin cdnmin
在虚拟主机(apache)的指令上。
我可以找出为什么“whoami”和get_current_user()不一样。
我遗漏了什么?
答案1
我使用的是 ubuntu 18.04,它不支持 fastcgi。Bionic 使用 proxy_fcgi。我没有看到任何来自 fastcgi 的错误,因为我使用,所以它总是将请求发送到默认值 (www.conf),这就是它变成“www-data”的原因。
问题就解决了。
以下是一些片段
我的虚拟主机.conf:
<VirtualHost *:80>
DocumentRoot /var/www/cdn
ServerName cdn.wx.dz.co
ServerAdmin webmaster
ErrorLog /var/www/cdn/.log/error.log
CustomLog /var/www/cdn/.log/access.log combined
SuexecUserGroup cdnmin cdnmin
<Directory /var/www/cdn>
Options +ExecCGI
IncludeOptional /dbc/vhost/common-set.conf
</Directory>
<Directory /var/www/cdn/.log>
deny from all
</Directory>
<FilesMatch ".+\.ph(p[345]?|t|tml)$">
SetHandler "proxy:unix:/run/php/php7.2-fpm.cdnmin.sock|fcgi://localhost/"
</FilesMatch>
</VirtualHost>
在 fpm/pool.d 中:
[cdnmin]
user = cdnmin
group = cdnmin
listen = /run/php/php7.2-fpm.cdnmin.sock
listen.owner = www-data
listen.group = www-data
listen.mode = 0666
pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
注意:
listen.owner = www-data
listen.group = www-data
listen.mode = 0666