通过 PHP 脚本重启 Nginx
Restart Nginx through a PHP Script
我目前正在努力使我的 WordPress 插件与 nginx 兼容。此插件需要访问 wp-content/uploads
目录中的 .conf
文件,以便它可以添加所需的规则。当前,它会更新同一目录中的 .htaccess
文件,更改会立即生效,无需干预。因为 nginx 需要 service nginx reload
才能使配置更改生效,所以我正在寻找一种在我的脚本中执行此操作的方法。我不确定甚至 exec()
是否适用于此,因为 service nginx reload
需要 运行 作为 root 或使用 sudo。我在 StackExchange、Google 和我所知道的其他任何地方都进行了广泛的搜索,但我什至找不到起点。
安全方面,给用户 运行 网络服务器 sudo/root 访问权限是一件非常糟糕的事情。相反,您可以使用信号量文件并由根执行 运行 的 cron 作业 运行 每 5 分钟(或更高频率,如果需要)查找此文件的存在。如果存在,它会发出 service nginx reload
命令并删除文件。
您必须为用于在 Linux 网络服务器上执行命令的帐户 www-data 添加正确的权限。您可以使用 <?php echo exec("whoami"); ?>
查看哪个帐户正在使用 PHP 执行脚本
我的建议
总的来说,我认为最好的解决方案是让您的插件为用户创建特定的指令以手动编辑任何 Nginx 配置,然后自己重新加载 Nginx。
我相信这是因为让 PHP 能够 运行 一个通常需要 sudo 的命令需要打开一个大的安全漏洞。
最重要的是,用户为了允许 PHP 到 运行 service nginx reload
命令必须执行的方法不是您可以在 PHP 单独,并且可能与让他们更新 Nginx 配置并重新加载自己一样复杂,如果不是更复杂的话。无论如何,用户都需要做额外的工作!
如果您真的想要这样做:
如果您仍然选择继续执行此操作,我建议让插件的用户编辑服务器的 /etc/sudoers
文件,这可以允许用户 www-data
(或任何其他用户) 运行 使用 sudo 的特定命令不需要密码。这也意味着用户(可能是 www-data)将无权 运行 任何其他命令,这至少更安全一些。
Use the sudo visudo
command to edit the /etc/sudoers
file. Don't edit it directly.
这是为用户 www-data
添加到该文件的行:
www-data ALL=(ALL:ALL) NOPASSWD:/usr/sbin/service nginx reload
Here's an example of allowing a user (group) to run similar commands, with some more explanation. Here's more on Sudoers and how /etc/sudoers 有效。
最后,请注意用户 www-data
专门用于在 Debian/Ubuntu Linux 发行版上安装 Nginx。其他非常常见的发行版(centos、redhat、fedora、arch 等等)可能不会 运行ning Nginx/PHP-FPM 作为用户 www-data
除非系统管理员手动创建这些用户。
简短回答: 坏主意。别这样。
长答案: 您尝试做的事情无法与编辑 .htaccess
文件相提并论,因为它的工作方式不同。 .htaccess
文件可以即时编辑和重新加载,几乎可以在 public 目录中的每个目录中创建和访问。
Nginx 配置并非如此。配置文件可以在 Nginx 启动时加载,也可以在需要时手动加载。它们的位置与管理员定义的配置有关。
即使您知道文件的位置,也可能无法更新它或写入该特定目录。
不仅如此,您还必须弄清楚哪些用户可以写入和读取配置文件所在的位置。
说到底,会出错的地方太多了。以我愚见,这个想法真的很糟糕。
大多数插件所做的是显示应该包含的 Nginx 配置,以便网站管理员可以复制和粘贴它。或者,他们创建一个 .conf
文件,网站管理员必须在重新启动 Nginx 之前将其复制到某处。
您尝试实现的目标是可行的。它可以被编码。不要误会我的意思。 但是 您的插件将处理现有的每个 Nginx 配置的每个细节。你真的不想要那个。
由于您不知道所有配置(老实说,您不想知道),我建议您专注于开发一个很棒的插件并通过插件提供正确的 Nginx 配置。最后一部分(网站管理员将其复制到正确的位置并重新加载配置)是他的工作。
我在该问题中读到的其他答案建议 "trying" 实现您所要求的方法。我认为他们制造的问题多于他们提供的帮助。通过更改权限和 运行ning crons,它可能会起作用。但是您也会打开通往安全漏洞的大门,因为您的 www-data
用户或网站用户所有者现在将被视为 root
,并且可能 运行 不应该 运行 的事情.我不建议你那样做。
我目前正在努力使我的 WordPress 插件与 nginx 兼容。此插件需要访问 wp-content/uploads
目录中的 .conf
文件,以便它可以添加所需的规则。当前,它会更新同一目录中的 .htaccess
文件,更改会立即生效,无需干预。因为 nginx 需要 service nginx reload
才能使配置更改生效,所以我正在寻找一种在我的脚本中执行此操作的方法。我不确定甚至 exec()
是否适用于此,因为 service nginx reload
需要 运行 作为 root 或使用 sudo。我在 StackExchange、Google 和我所知道的其他任何地方都进行了广泛的搜索,但我什至找不到起点。
安全方面,给用户 运行 网络服务器 sudo/root 访问权限是一件非常糟糕的事情。相反,您可以使用信号量文件并由根执行 运行 的 cron 作业 运行 每 5 分钟(或更高频率,如果需要)查找此文件的存在。如果存在,它会发出 service nginx reload
命令并删除文件。
您必须为用于在 Linux 网络服务器上执行命令的帐户 www-data 添加正确的权限。您可以使用 <?php echo exec("whoami"); ?>
我的建议
总的来说,我认为最好的解决方案是让您的插件为用户创建特定的指令以手动编辑任何 Nginx 配置,然后自己重新加载 Nginx。
我相信这是因为让 PHP 能够 运行 一个通常需要 sudo 的命令需要打开一个大的安全漏洞。
最重要的是,用户为了允许 PHP 到 运行 service nginx reload
命令必须执行的方法不是您可以在 PHP 单独,并且可能与让他们更新 Nginx 配置并重新加载自己一样复杂,如果不是更复杂的话。无论如何,用户都需要做额外的工作!
如果您真的想要这样做:
如果您仍然选择继续执行此操作,我建议让插件的用户编辑服务器的 /etc/sudoers
文件,这可以允许用户 www-data
(或任何其他用户) 运行 使用 sudo 的特定命令不需要密码。这也意味着用户(可能是 www-data)将无权 运行 任何其他命令,这至少更安全一些。
Use the
sudo visudo
command to edit the/etc/sudoers
file. Don't edit it directly.
这是为用户 www-data
添加到该文件的行:
www-data ALL=(ALL:ALL) NOPASSWD:/usr/sbin/service nginx reload
Here's an example of allowing a user (group) to run similar commands, with some more explanation. Here's more on Sudoers and how /etc/sudoers 有效。
最后,请注意用户 www-data
专门用于在 Debian/Ubuntu Linux 发行版上安装 Nginx。其他非常常见的发行版(centos、redhat、fedora、arch 等等)可能不会 运行ning Nginx/PHP-FPM 作为用户 www-data
除非系统管理员手动创建这些用户。
简短回答: 坏主意。别这样。
长答案: 您尝试做的事情无法与编辑 .htaccess
文件相提并论,因为它的工作方式不同。 .htaccess
文件可以即时编辑和重新加载,几乎可以在 public 目录中的每个目录中创建和访问。
Nginx 配置并非如此。配置文件可以在 Nginx 启动时加载,也可以在需要时手动加载。它们的位置与管理员定义的配置有关。
即使您知道文件的位置,也可能无法更新它或写入该特定目录。
不仅如此,您还必须弄清楚哪些用户可以写入和读取配置文件所在的位置。
说到底,会出错的地方太多了。以我愚见,这个想法真的很糟糕。
大多数插件所做的是显示应该包含的 Nginx 配置,以便网站管理员可以复制和粘贴它。或者,他们创建一个 .conf
文件,网站管理员必须在重新启动 Nginx 之前将其复制到某处。
您尝试实现的目标是可行的。它可以被编码。不要误会我的意思。 但是 您的插件将处理现有的每个 Nginx 配置的每个细节。你真的不想要那个。
由于您不知道所有配置(老实说,您不想知道),我建议您专注于开发一个很棒的插件并通过插件提供正确的 Nginx 配置。最后一部分(网站管理员将其复制到正确的位置并重新加载配置)是他的工作。
我在该问题中读到的其他答案建议 "trying" 实现您所要求的方法。我认为他们制造的问题多于他们提供的帮助。通过更改权限和 运行ning crons,它可能会起作用。但是您也会打开通往安全漏洞的大门,因为您的 www-data
用户或网站用户所有者现在将被视为 root
,并且可能 运行 不应该 运行 的事情.我不建议你那样做。