使用Apache& amp;上传文件PHP-FPM

时间:2017-11-04 08:45:07

标签: php apache file-upload

我已经安装了一个新的Ubuntu 16.04服务器并使用this指南启用了PHP-FPM。我还启用了userdir模块(以便我可以从/ home / $ user下的public_html文件夹运行虚拟站点)和mod_ruid2

根据第一个指南必须完成的一件事是将这三行添加到000-default.conf:

<FilesMatch "\.php$">
  SetHandler "proxy:fcgi://127.0.0.1:9000/"
</FilesMatch>

添加了树线后,我的conf文件如下所示:

<VirtualHost *:80>
        ServerName jrrtest
        RMode stat
        ServerAdmin webmaster@localhost
        DocumentRoot /home/jrr/public_html
        ErrorLog ${APACHE_LOG_DIR}/jrrtest-error.log
        CustomLog ${APACHE_LOG_DIR}/jrrtest-access.log combined
        <FilesMatch "\.php$">
                SetHandler "proxy:fcgi://127.0.0.1:9000/"
        </FilesMatch>
</VirtualHost>

PHP正在按预期执行,但当我尝试使用this页面上的示例上传文件时,它无法正常工作。如果我尝试上传文件,我会在Apache error_log中收到此错误:

PHP Warning:  move_uploaded_file(uploads/jorara.png): failed to open stream: Permission denied in /home/jrr/public_html/upload.php on line 38\nPHP message: PHP Warning:  move_uploaded_file(): Unable to move '/tmp/phpAJsos1' to 'uploads/jorara.png' in /home/jrr/public_html/upload.php on line 38

如果我从000-default.conf中删除了FilesMatch行,那么上传功能正在起作用,但是php不再像我想要的那样使用FastCGI执行。

如果我重新启用FilesMatch行并将uploads文件夹中的所有者更改为www-data:www-data,我还可以使上传功能正常工作。

如何配置PHP-FPM以便php脚本的所有者可以将文件上传到与脚本所有者相同的所有者拥有的文件夹中?

此致 耶尔

1 个答案:

答案 0 :(得分:0)

经过几个小时的搜索,我终于找到了一个似乎有效的解决方案。

我最终做的就是这个。

使用LAMP安装标准Ubuntu。

安装了这些额外的包:

apt-get install libapache2-mod-fastcgi php7.0-fpm

启用这些Apache模块:

a2enmod actions fastcgi

创建了几个目录:

/var/www/testsite/htdocs
/var/www/testsite/phpsessions
/var/www/testsite/logs

在文件/etc/php/7.0/fpm/pool.d/testsite.conf中创建了一个新的php-fpm池:

[testsite]
    user = testsite
    group = testsite
    listen = /run/php/php7.0-fpm.testsite.sock
    listen.owner = www-data
    listen.group = www-data
    listen.mode = 0660

    pm = dynamic
    pm.max_children = 5
    pm.start_servers = 2
    pm.min_spare_servers = 1
    pm.max_spare_servers = 3

    php_admin_value[session.save_path] = /var/www/testsite/phpsessions
    php_admin_value[session.save_handler] = files
    php_admin_value[display_errors] = Off
    php_admin_value[log_errors] = On
    php_admin_value[error_log] = "/var/www/testsite/logs/php_error.log"
    php_admin_value[open_basedir] = "/var/www/testsite/htdocs:/usr/share/php:/tmp:/var/www/testsite/phpsessions"

在我第一次尝试使用listen.ownerlisten.group时,我将它们设置为testsite。如果我没有将/run/php/php7.0-fpm.testsite.sock设置为listen.mode,那么我就无法访问套接字文件0666。在我(以及许多其他人)的意见中,这是一种安全风险。相反,我将listen.ownerlisten.grouplisten.mode设置为上面显示的值,这似乎是推荐的解决方案。

使用以下内容在/etc/apache2/sites-available/testsite.conf文件中创建了一个网站定义:

<IfModule mod_fastcgi.c>
    AddHandler php7-fcgi-testsite .php
    Action php7-fcgi-testsite /php7-fcgi-testsite
    Alias /php7-fcgi-testsite /usr/lib/cgi-bin/php7-fcgi-testsite
    FastCgiExternalServer /usr/lib/cgi-bin/php7-fcgi-testsite -socket /run/php/php7.0-fpm.testsite.sock -pass-header Authorization

    <Directory "/usr/lib/cgi-bin">
        Require all granted
    </Directory>
</IfModule>

<VirtualHost *:80>
    ServerName testsite

    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/testsite/htdocs

    ErrorLog ${APACHE_LOG_DIR}/testsite-error.log
    CustomLog ${APACHE_LOG_DIR}/testsite-access.log combined

    <Directory /var/www/testsite/htdocs>
        Options -Indexes
    </Directory>

    <IfModule mod_fastcgi.c>
        <FilesMatch ".+\.ph(p[345]?|t|tml)$">
            SetHandler php7-fcgi-testsite
        </FilesMatch>
    </IfModule>
</VirtualHost>

启用新网站:

a2ensite testsite

禁用Apache中的默认php模块:

a2dismod php7.0

Restartet Apache和PHP-FPM:

systemctl restart php7.0-fpm apache2

使用此命令可以看到php-fpm(包括新池)的状态:

systemctl status php7.0-fpm

使用以下内容在/ var / www / testsite / htdocs中创建文件info.php:

<?php
    phpinfo();
?>

在浏览器中访问testsite / info.php现在显示php正在以FastCGI的形式运行,这正是我想要的,文件可以毫无问题地上传。 PHP as FPM/FastCGI