如何使用 php 重启或重新加载 nginx
Posted
技术标签:
【中文标题】如何使用 php 重启或重新加载 nginx【英文标题】:how restart or reload nginx using php 【发布时间】:2016-05-22 05:21:21 【问题描述】:我用 php 更改 nginx conf 文件 接下来我要重新启动nginx。 但无法重启nginx
<?php
if(exec("service nginx restart"))
echo "ok shd";
else
echo "error";
?>
<hr>
<?php
if(exec("/etc/init.d/nginx reload"))
echo "ok shd";
else
echo "error";
?>
<hr>
<?php
if(exec("/usr/sbin/nginx -s reload"))
echo "ok shd";
else
echo "error";
?>
输出是:
error<hr>
error<hr>
error
要做exec("service nginx restart")
我需要以root 身份访问php-fpm,所以我去/usr/local/etc/php-fpm.conf
user = nobody
group = nobody
并将其更改为:
user = root
group = root
然后输入service php-fpm restart
输出:
Starting php-fpm [11-Feb-2016 05:14:33] ERROR: [pool www] please specify user and group other than root
[11-Feb-2016 05:14:33] ERROR: FPM initialization failed
failed
这意味着它不能以 root 身份运行。
那么?
【问题讨论】:
当您shell_exec()
或exec()
时,您的用户是nginx
,而不是root
。
@phabarest:不,不是。这是关于 PHP,它不作为 nginx 进程组的一部分运行,更不用说它的 uid。
所以你removed你所有的代码都来自你的问题?
【参考方案1】:
我需要以 root 身份访问 php-fpm
天哪
PHP-FPM 不能以 root 身份运行有一个很好的理由 - 因为它真的是真的很糟糕的事情。
如果您确实必须通过网络服务器公开此功能,请通过sudo 进行。同样,任何对系统配置的更改都应该通过 sudo。
顺便说一句:你的脚本中缺少的一件至关重要的事情是 ignore_user_abort()。当(如果) nginx 由 PHP 重新启动时,与浏览器的连接将丢失。默认情况下,PHP 将在此时终止。
【讨论】:
【参考方案2】:大多数人会告诉您永远不要将 php
运行为 root
,但是,如果您有多个 php-fpm.sock
文件,这样做是相当安全的,并且您有多个级别的安全性来确保您能够做到以root
权限执行php
。请记住,php 应仅以所需的最低权限执行。
注意
我使用的是 Centos,所以我使用的一些文件名、路径和命令对你来说可能会略有不同。
安全
-
创建一个单独的
login portal
,只有您可以访问。您可以通过打开一个端口并使用您的防火墙和/或 nginx 规则来只允许您的 IP 地址(理想情况下是您可以通过 *** 访问的专用 IP 地址)来做到这一点。我还建议为您的安全门户设置谷歌身份验证器。
在您的 nginx
配置中,您现在可以在不同的服务器配置下定义 2 个不同的 sock 文件。
创建php-fpm.conf
的副本。该文件应包含在/etc/php-fpm.conf
中。
重新启动php-fpm
,然后查看其状态以确保其正常工作。如果遇到nginx
的权限错误,您可能需要手动更改/var/run/php-fpm/
的权限和组及其内容。
让 php 以 root 身份运行
-
将
user
和 group
更改为 root
(就像您已经完成的那样)。
打开php-fpm.service
。我通过 ssh 控制台输入了nano /lib/systemd/system/php-fpm.service
。
将ExecStart=/usr/sbin/php-fpm --nodaemonize
更改为ExecStart=/usr/sbin/php-fpm --nodaemonize -R
。 -R
允许 php-fpm 以 root 身份运行。
重启daemon
。如果您使用的是centos
,请输入systemctl daemon-reload
。
编辑
如果您想让php
执行为root
的唯一原因是重新启动nginx,那么您最好通过设置一个cron 作业来执行此操作。请参阅:this question 或手动通过 ssh
。
【讨论】:
以上是关于如何使用 php 重启或重新加载 nginx的主要内容,如果未能解决你的问题,请参考以下文章