6

我成功地使 mod_fastcgi 与 fpm 一起工作,这使我能够设置 user:group 通过 fpm 池定义运行脚本。但是,对于通过 mod_fastcgi 运行的 python 脚本没有类似的替代方案,所以我正在尝试学习如何使用 suexec 通过 mod_fastcgi 和我选择的 user:group 运行任何脚本。

我从这个工作配置开始:

#/etc/apache2/sites-available/test1
<VirtualHost *:80>
    ServerName test1.slothcompany.net
    DocumentRoot /var/www/test1

    LogLevel Debug
    ErrorLog /var/www/test1/error.log

    <Directory /var/www/test1/>
        Options Indexes Includes FollowSymLinks ExecCGI
        AllowOverride All
        DirectoryIndex index.php
        AddHandler php5-fastcgi .php
        Action php5-fastcgi /php5.fcgi
        Order allow,deny
        Allow from all
    </Directory>
</VirtualHost>

#/var/www/test1/php5.fcgi
#!/bin/bash
PHPRC="/var/www/test1/php.ini"
PHP_FCGI_CHILDREN=5
export PHPRC
export PHP_FCGI_CHILDREN
exec /usr/bin/php5-cgi

我放了一个phpInfo()inside /var/www/test1/index.php,它显示了正确的php.ini路径。

现在,要激活suexeci:

  • 安装apache2-suexecsudo apt-get install apache2-suexec
  • 激活mod_suexecsudo a2enmod suexec
  • 更改文件的权限:sudo chown -R michele:michele /var/www/test1
  • 将此行添加到 vhost 配置中:SuexecUserGroup michele michele
  • 重新激活站点并重新启动 apache:sudo a2dissite test1 && sudo a2ensite test1 && sudo service apache2 restart

用户:组michele:michele存在于系统中。运行时,test1.slothcompany.net我看到的phpInfo()输出与以前完全相同,并echo exec('whoami');打印www-data而不是michele.

sudo /usr/lib/apache2/suexec -V告诉我日志文件应该在/var/log/apache2/suexec.log,但不存在这样的文件。然后,我知道 apache 应该在 error.log 文件中记录 suexec 包装器的激活,作为通知,但是在 error.log 中也没有找到这样的通知。所以,我怀疑由于某种原因 suexec 根本没有开始。

在这里阅读了 suexec 确定调用是否成功的检查列表,但我不知道如何检查这些检查的结果是什么......它说它们应该写在 suexec 日志文件中,但是这个文件似乎从未被创造出来。

那么,我做错了什么?

非常感谢大家。

4

1 回答 1

5

在这篇文章的帮助下,我终于设法让它工作了。我的第一个配置有两个大问题:第一个是我没有启用 suexec 来使用 fastcgi(这需要编辑 fastcgi.conf 配置文件);第二个是在我的第一个虚拟主机中我根本没有使用 fastcgi!当我意识到禁用 fastcgi 后系统工作相同时,我得到了这个。

但是,这些是对我有用的最后步骤(我在为此创建的 Debian 虚拟机中尝试了它们):

  1. 安装包(添加non-free/etc/apt/sources.listfor之后libapache2-mod-fastcgi):

    sudo apt-get install apache2 libapache2-mod-fastcgi apache2-suexec php5-cgi
    
  2. 添加全局 fastcgi 配置:

    sudo nano /etc/apache2/conf.d/fastcgi
    
    # /etc/apache2/conf.d/fastcgi
    FastCGIConfig -killInterval 60 -maxClassProcesses 1 -maxProcesses 50 -minProcesses 0 -startDelay 5
    
  3. 在 fastcgi 配置中启用 suexec(#FastCgiWrapper行中删除):

    sudo a2dismod fastcgi
    sudo nano /etc/apache2/mods-available/fastcgi.conf
    
    # /etc/apache2/mods-available/fastcgi.conf
    <IfModule mod_fastcgi.c>
        AddHandler fastcgi-script .fcgi
        FastCgiWrapper /usr/lib/apache2/suexec
        FastCgiIpcDir /var/lib/apache2/fastcgi
    </IfModule>
    
  4. 启用 apache 模块:

    sudo a2enmod fastcgi suexec actions
    
  5. 创建测试站点文件:

    sudo mkdir -p /var/www/vhosts/test
    cd /var/www/vhosts/test
    sudo mkdir cgi-bin etc httpdocs logs
    sudo nano httpdocs/index.php
    
    # /var/www/vhosts/test/httpdocs/index.php
    <?php
    echo exec('whoami');
    phpInfo();
    
    sudo nano cgi-bin/php5.fcgi
    
    # /var/www/vhosts/test/cgi-bin/php5.fcgi
    #!/bin/bash
    export PHPRC=/var/www/vhosts/test/etc
    export PHP_FCGI_CHILDREN=5
    exec /usr/bin/php5-cgi
    
    sudo chmod +x cgi-bin/php5.fcgi
    sudo cp /etc/php5/cgi/php.ini etc/
    sudo chown -R michele:michele .
    
  6. 创建apache虚拟主机:

    sudo nano /etc/apache2/sites-available/test
    
    # /etc/apache2/sites-available/test
    <VirtualHost *:80>
        ServerAdmin webmaster@slothcompany.net
        ServerName test.slothcompany.net
    
        LogLevel notice
        ErrorLog /var/www/vhosts/test/logs/error.log
        CustomLog /var/www/vhosts/test/logs/access.log combined
    
        ScriptAlias /php5.fcgi /var/www/vhosts/test/cgi-bin/php5.fcgi
        FastCgiServer /var/www/vhosts/test/cgi-bin/php5.fcgi -processes 1 -user michele -group michele -idle-timeout 310 -flush
        SuexecUserGroup michele michele
    
        DocumentRoot /var/www/vhosts/test/httpdocs
        <Directory /var/www/vhosts/test/httpdocs/>
            Options FollowSymLinks ExecCGI
            AllowOverride All
            Action php5.fcgi /php5.fcgi
            AddHandler php5.fcgi .php
            Order allow,deny
            Allow from all
        </Directory>
    </VirtualHost>
    
    sudo a2ensite test
    
  7. 重启阿帕奇

    sudo service apache2 restart
    
于 2013-11-14T21:20:48.220 回答