我应该如何修改文件权限以适应 Wordpress

我应该如何修改文件权限以适应 Wordpress

我已经成功使用了这里描述的方法:由单个用户维护对我来说效果很好。这是我所有网站的脚本:

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 池,这里有一个简短的示例配置。有几个教程详细解释了这些步骤。

  1. 安装 PHP-FPM。

  2. /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参数应根据您的需要进行调整。

  3. 启用 Apache 模块mpm_eventproxy& proxy_fcgi

  4. <VirtualHost>将处理程序添加到站点的Apache2块:

    <FilesMatch "\.php$">
        SetHandler "proxy:unix:/run/php/example-com.sock|fcgi://localhost"
    </FilesMatch>
    <Proxy "fcgi://localhost/">
    </Proxy>
    
  5. 重新加载或重新启动 Apache2 和 PHP-FPM 服务。

相关内容