我已经安装了一个新的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脚本的所有者可以将文件上传到与脚本所有者相同的所有者拥有的文件夹中?
此致 耶尔
答案 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.owner
和listen.group
时,我将它们设置为testsite
。如果我没有将/run/php/php7.0-fpm.testsite.sock
设置为listen.mode
,那么我就无法访问套接字文件0666
。在我(以及许多其他人)的意见中,这是一种安全风险。相反,我将listen.owner
,listen.group
和listen.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的形式运行,这正是我想要的,文件可以毫无问题地上传。