【问题标题】:Restart Nginx through a PHP Script通过 PHP 脚本重启 Nginx
【发布时间】:2015-04-09 22:27:01
【问题描述】:

我目前正在努力使我的 WordPress 插件与 nginx 兼容。此插件需要访问wp-content/uploads 目录中的.conf 文件,以便它可以添加所需的规则。目前,它更新了同一目录下的一个.htaccess文件,并且更改立即生效,无需干预。因为 nginx 需要service nginx reload 才能使配置更改生效,所以我正在寻找一种在我的脚本中执行此操作的方法。我不确定即使exec() 也能解决这个问题,因为service nginx reload 需要以root 身份运行或使用sudo。我在 StackExchange、Google 以及我所知道的所有其他地方进行了广泛搜索,但我什至找不到起点。

【问题讨论】:

  • 安全灾难就在那里。不要这样做。即使您设法安全地允许 PHP 应用程序重新启动 Nginx(通过编辑 sudoers 文件并只允许一个重新启动命令),它仍然会打开一个 DoS 漏洞,因为任何恶意 PHP 脚本现在都能够通过不断地对服务器进行 DoS Nginx 重新加载。
  • @AndréDaniel,当然,我不同意你的观点;我不希望任何与 Web 服务器相关的用户能够以 sudo 的身份执行命令。但是,我的目标是找到一种“好”的方法来实现这一点,它不会带来巨大的安全漏洞(比如exec(),允许www-data 用户拥有sudo 访问权限等)。我要提到的一点是,即使exec() 该命令也无法使用,因为它需要以 sudo/root 身份运行。

标签: php wordpress nginx


【解决方案1】:

安全方面,给运行 Web 服务器的用户 sudo/root 访问权限是一件非常糟糕的事情。相反,您可以使用一个信号量文件并让一个由 root 运行的 cron 作业,该作业每 5 分钟运行一次(如果需要,可以使用更高的频率)来查找该文件的存在。如果存在,它会发出service nginx reload 命令并删除该文件。

【讨论】:

  • 是的,完全同意给www-data 用户提供sudo 访问权限是非常愚蠢的。这是一个好的开始。我认为这会发生的问题与分布式服务器环境有关。如果用户使用相同的wp-content/uploads 文件夹源运行多台服务器,则只会重新加载一台服务器。也许有更好的方法来观察文件更新,然后触发service nginx reload
【解决方案2】:

我的建议

总的来说,我认为最好的解决方案是让您的插件为用户创建特定说明,以手动编辑任何 Nginx 配置,然后自行重新加载 Nginx。

我相信这是因为让 PHP 能够运行通常需要 sudo 的命令需要打开一个大的安全漏洞。

最重要的是,用户为了让 PHP 运行 service nginx reload 命令而必须执行的方法不是您可以单独在 PHP 中完成的,并且可能与让他们更新 Nginx 配置并重新加载自己。用户无论如何都需要做额外的工作!

如果你真的想要这样做:

如果您仍然选择继续执行此操作,我建议让插件用户编辑服务器的 /etc/sudoers 文件,这可以允许用户 www-data(或任何其他用户)使用以下命令运行该特定命令sudo 不需要密码。这也意味着用户(可能是 www-data)将无权运行任何其他命令,这至少更安全一些。

使用sudo visudo 命令编辑/etc/sudoers 文件。不要直接编辑它。

这是为用户 www-data 添加到该文件的行:

www-data ALL=(ALL:ALL) NOPASSWD:/usr/sbin/service nginx reload

Here's an example of allowing a user (group) 运行类似的命令,并提供更多解释。这是more on Sudoers and how /etc/sudoers 的作品。

最后,请注意用户 www-data 专门用于在 Debian/Ubuntu Linux 发行版上安装 Nginx。除非系统管理员手动创建这些用户,否则其他非常常见的发行版(centos、redhat、fedora、arch 等)可能不会以用户 www-data 的身份运行 Nginx/PHP-FPM。

【讨论】:

  • 是的,我不希望任何与 Web 服务器相关的用户能够以 sudo 的身份执行命令。我认为可以合并用户通知,以及下面@dbinns66的解决方案,也就是说,您可以在每次进行更改时自己重新加载这个,或者您可以使用这个程序、脚本等来监控文件并在 nginx 发生变化时重新启动它。
  • 我真的不同意“如果你真的想做这部分”。我同意这个建议。 :-)
【解决方案3】:

简答: 坏主意。不要这样做。

长答案: 您尝试做的事情无法与编辑 .htaccess 文件相比,因为它的工作方式不同。 .htaccess 文件可以即时编辑和重新加载,几乎可以在公共目录中的每个目录中创建和访问。

Nginx 配置并非如此。配置文件在 Nginx 启动时加载或在需要时手动加载。它们的位置与管理员定义的配置有关。

即使您知道文件在哪里,您也可能无法更新它或写入该特定目录。

不仅如此,您还必须弄清楚用户可以写入和读取配置文件所在的位置。

最后,有很多事情会出错。在我看来,这个想法真的很糟糕。

大多数插件所做的是显示应包含的 Nginx 配置,以便网站管理员可以复制和粘贴它。或者,他们创建了一个.conf 文件,网站管理员必须在重新启动 Nginx 之前将其复制到某个地方。

您尝试实现的目标是可行的。它可以编码。不要误会我的意思。 但是你的插件将成为处理每个 Nginx 配置的每一个细节。你真的不想要那个。

由于您不了解所有配置(老实说,您不想知道),我建议您专注于开发出色的插件并通过插件提供正确的 Nginx 配置。最后一部分(网站管理员将其复制到正确的位置并重新加载配置)是他的工作。

我在该问题中读到的其他答案建议了“尝试”实现您所要求的方法。我认为他们会制造比他们提供帮助更多的问题。通过更改权限和运行 crons,它可能会起作用。但是您也会打开安全漏洞的大门,因为您的www-data 用户或网站用户所有者现在将被视为root 并且可以运行不应运行的东西。我不建议你这样做。

【讨论】:

    【解决方案4】:

    您必须为帐户 www-data 添加正确的权限,该帐户用于在 Linux 网络服务器上执行命令。您可以使用<?php echo exec("whoami"); ?>查看哪个帐户正在使用 PHP 执行脚本

    【讨论】:

    • 向帐户添加正确的权限会有什么不同?我知道 PHP-FPM 以 www-data 用户身份执行文件并具有运行我的应用程序所需的适当权限,但这并不能真正解决我如何让服务器重新加载 nginx 配置的问题。
    • chown -R www-data:www-data /var/www/example.com chmod 775 /var/www 如果我记得的话。我对“youtube-dl”有类似的问题,您应该找到它用来重新启动它的网络服务器文件并为它们修改这些命令的变量。应该有二进制文件或其他文件。 superuser.com/questions/646062/… 或为它创建一个批处理文件并运行它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-05
    • 2018-03-29
    • 1970-01-01
    • 2014-02-01
    • 1970-01-01
    • 2015-08-30
    • 1970-01-01
    相关资源
    最近更新 更多