通过PHP脚本重新启动Nginx

时间:2015-04-08 16:43:35

标签: php wordpress nginx

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

4 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分: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。除非sysadmin手动创建这些用户,否则其他非常常见的发行版(centos,redhat,fedora,arch等等)可能无法以用户www-data运行Nginx / PHP-FPM。

答案 2 :(得分:1)

简短回答:糟糕的主意。不要这样做。

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

Nginx配置不是这种情况。配置文件在Nginx启动时加载或在需要时手动加载。它们的位置与管理员定义的配置有关。

即使您知道文件的位置,也可能无法更新或写入该特定目录。

除此之外,您还必须弄清楚用户可以写哪些内容并阅读配置文件所在的位置。

最后,有很多事情可能会出错。以我的拙见,这个想法非常糟糕。

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

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

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

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

答案 3 :(得分:0)

您必须为帐户www-data添加正确的权限,该数据用于在Linux Web服务器上执行命令。您可以使用<?php echo exec("whoami"); ?>

查看哪个帐户正在使用PHP执行脚本