我正在尝试用FastCGI替换SuPHP。 早些时候,我有不同的所有者和群组的文件夹。每个小组也都有www-data作为成员。 当使用浏览器运行任何php文件时,它作为文件的所有者运行。 因此,如果文件由用户A(组A - www-data和A作为成员)拥有,则它作为用户A执行
shell_exec('whoami') => return A
现在,我安装了fastcgi并将其配置为运行PHP文件。
这是我的php5-fpm.conf文件
<IfModule mod_fastcgi.c>
AddHandler php5-fcgi .php
Action php5-fcgi /php5-fcgi
Alias /php5-fcgi /usr/lib/cgi-bin/php5-fcgi
FastCgiExternalServer /usr/lib/cgi-bin/php5-fcgi -socket /var/run/php5-fpm.sock -pass-header Authorization
</IfModule>
我的问题是,现在当我运行A所拥有的同一个文件时,
shell_exec('whoami') => return www-data
我做错了什么?
答案 0 :(得分:1)
您可以使用FastCGI + PHP-FPM替换suPHP,但是您需要为每个用户设置一个FPM池,并为每个用户设置一个虚拟主机(因为每个用户/池需要单独的FastCgiExternalServer指令,这些指令只有效每个虚拟主机)。
例如,在给定的虚拟根目录中:
<FilesMatch "\.php$">
SetHandler php5-fcgi
</FilesMatch>
Action php5-fcgi /php5-fcgi-username
Alias /php5-fcgi-username /usr/lib/cgi-bin/php5-fcgi-username
FastCgiExternalServer /usr/lib/cgi-bin/php5-fcgi-username -socket /var/run/php5-fpm-username.sock -pass-header Authorization
然后在FPM池配置中,您可以使用以下内容:
listen = /var/run/php5-fpm-username.sock
listen.owner = www-data
listen.group = www-data
listen.mode=0660
user = ownerusername
group = ownerusergroup
pm = ondemand
pm.max_children = 30
pm.process_idle_timeout = 120s
pm.max_requests = 50000
catch_workers_output = yes
listen.owner和listen.group FPM池参数是Web服务器的用户/组(该用户是唯一允许连接到PHP-FPM套接字的用户/组)。
用户和组FPM池参数是用于运行PHP脚本的用户和组。
如果您有10个用户,则需要10个FPM池。
使用FastCGI + PHP-FPM时,性能要好得多,但有很多命中但配置调整更难。对于每秒点击次数不多的站点/应用程序,我真的不打扰FastCGI和PHP-FPM。此外,使用suPHP,您可以在不重新启动Web服务器的情况下编辑每个用户的php.ini,PHP-FPM所有池共享相同的php.ini,您需要重新启动FPM守护程序以重新加载它。
答案 1 :(得分:0)
whoami
只显示当前用户,当前脚本正在运行。
在ubuntu中通过fastcgi运行脚本为www-data
用户,而不是拥有该文件的用户。这是设计使用,它可以帮助您限制Web脚本访问他们不允许访问的文件。如果需要更改此行为,则需要更改用户apache正在配置文件中的某个位置运行。
在我的系统上,这是通过设置这两个环境变量在/etc/apacyhe2/envvars
中指定的:
export APACHE_RUN_USER=www-data
export APACHE_RUN_GROUP=www-data