如何使用 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 身份运行

    usergroup 更改为 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的主要内容,如果未能解决你的问题,请参考以下文章

什么时候重启而不重新加载 Nginx?

如何优雅地重启 django 在 nginx 后面运行 fcgi?

如何让 NGINX 从 cron 作业重新启动/重新加载?

如何自动重新加载我的 gunicorn 服务器?

如何使用 php 验证选择字段?

linux下如何重启nginx