0

我正在尝试用 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

我究竟做错了什么?

4

2 回答 2

1

您可以将 suPHP 替换为 FastCGI+PHP-FPM,但您需要为每个用户设置一个 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,您可以获得每个用户的 php.ini,您可以在不重新启动 Web 服务器的情况下对其进行编辑,使用 PHP-FPM,所有池共享相同的 php.ini,您需要重新启动 FPM 守护程序以重新加载它。

于 2014-10-12T19:26:27.323 回答
0

whoami只是向您显示当前脚本正在运行的当前用户。

在通过 fastcgi 的 ubuntu 中,您以www-data用户身份运行脚本,而不是以拥有该文件的用户身份。这是设计使然,它可以帮助您限制 Web 脚本访问他们不允许访问的文件。如果你需要改变这种行为,你需要改变用户 apache 在配置文件的某个地方运行。

在我的系统上,这是/etc/apacyhe2/envvars通过设置这两个环境变量来指定的:

export APACHE_RUN_USER=www-data
export APACHE_RUN_GROUP=www-data
于 2014-09-05T08:43:42.633 回答