我已经成功使用了这里描述的方法:由单个用户维护对我来说效果很好。这是我所有网站的脚本:
sudo chown -R WebAdmin /var/www/example.com/
sudo chgrp -R www-data /var/www/example.com/
sudo chmod -R 750 /var/www/example.com/
sudo chmod g+s /var/www/example.com/
sudo chown www-data:www-data /var/www/example.com/Uploads/
sudo chmod -R 755 /var/www/example.com/Uploads/
我维护该服务器上的所有站点,并且 WebAdmin 是我用于 FTP 和 SSH 的一般用户。
但是,我最近将一些 Wordpress 网站从托管公司移至我的服务器,上述方法不起作用。更新 Wordpress 或其主题/插件时出现错误:
要执行请求的操作,WordPress 需要访问您的 Web 服务器。请输入您的 FTP 凭据以继续。如果您不记得您的凭据,请联系您的 Web 主机。
有几个“修复”方法,例如这个这些更像是权宜之计,可能不安全。所以我使用了最安全的方法(据我所知),将 www-data 设为 WordPress 网站的所有者,同时将非 WordPress 网站保留为原样。换句话说,我只需运行
sudo chown -R www-data /var/www/wp_example.com/
在 WordPress 网站上。这当然有效,但就手动维护网站而言,这变得很麻烦,因为我必须以 root 身份登录才能执行此操作。我也无法将网站分配给其他人进行维护。请注意,我的一些网站是混合的(部分是 WordPress,部分是自定义页面)。
因此,我想知道是否有更好的解决方案,更优雅、更通用,即它可以适用于 WordPress 和非 WordPress 网站。
一种可能性是我将用户 WebAdmin 添加到 www-data 组。或者将 www-data 添加到 WebAdmin 用户组?哪个更有意义,哪个更安全?
答案1
如果用户WebAdmin
直接和www-data
组用户都www-data
需要写入这些目录,则这750
还不够。修复当前设计的方法是:
sudo chmod -R 770 /var/www/example.com/
安全注意事项
但是,一般来说,这意味着每个 PHP 站点都由同一个用户运行,经过此修改后,每个站点都可以读取和写入任何其他站点的文件。这意味着对任何一个站点的攻击都会危及所有站点。
为每个站点使用单独的用户和 PHP-FPM 池可以将站点划分为独立的部分,从而降低这种风险。您可以使用运行站点的同一用户来管理站点:
/var/www$ ls -l
drwxr-x--- 2 example-com www-data 4096 Aug 30 7:00 example.com
drwxr-x--- 2 example-net www-data 4096 Aug 30 7:00 example.net
drwxr-x--- 2 example-org www-data 4096 Aug 30 7:00 example.org
如果您确实需要用户WebAdmin
管理所有内容,您可以将用户添加到组www-data
并授予该组写权限,但我不建议这样做。
/var/www$ ls -l
drwxrwx--- 2 example-com www-data 4096 Aug 30 7:00 example.com
drwxrwx--- 2 example-net www-data 4096 Aug 30 7:00 example.net
drwxrwx--- 2 example-org www-data 4096 Aug 30 7:00 example.org
PHP-FPM 池
正如我提到的 PHP FPM 池,这里有一个简短的示例配置。有几个教程详细解释了这些步骤。
安装 PHP-FPM。
/etc/php/8.2/fpm/pool.d/example-com.conf
:[example-com] user = example-com group = example-com listen = /run/php/example-com.sock chdir = /var/www/example.com listen.owner = www-data listen.group = www-data pm = dynamic pm.max_children = 5 pm.start_servers = 2 pm.min_spare_servers = 1 pm.max_spare_servers = 3 php_admin_value[disable_functions] = exec,passthru,shell_exec php_admin_flag[allow_url_fopen] = off php_admin_value[cgi.fix_pathinfo] = 1 security.limit_extensions =
最后一行是降低安全性以允许 WordPress 处理 SEO URL,其他行是提高安全性。这些
pm
参数应根据您的需要进行调整。启用 Apache 模块
mpm_event
,proxy
&proxy_fcgi
。<VirtualHost>
将处理程序添加到站点的Apache2块:<FilesMatch "\.php$"> SetHandler "proxy:unix:/run/php/example-com.sock|fcgi://localhost" </FilesMatch> <Proxy "fcgi://localhost/"> </Proxy>
重新加载或重新启动 Apache2 和 PHP-FPM 服务。