【问题标题】:how restart or reload nginx using php如何使用 php 重启或重新加载 nginx
【发布时间】: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 身份运行。

那么如何使用 php 重启或重新加载 nginx?

【问题讨论】:

  • 当您shell_exec()exec() 时,您的用户是nginx,而不是root
  • @phabarest:不,不是。这是关于 PHP,它不作为 nginx 进程组的一部分运行,更不用说它的 uid。
  • 所以你removed你所有的代码都来自你的问题?

标签: php nginx centos


【解决方案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,所以我使用的一些文件名、路径和命令对你来说可能会略有不同。

    安全

    1. 创建一个单独的login portal,只有您可以访问。您可以通过打开一个端口并使用您的防火墙和/或 nginx 规则来只允许您的 IP 地址(理想情况下是您可以通过 VPN 访问的专用 IP 地址)来做到这一点。我还建议为您的安全门户设置谷歌身份验证器。
    2. 在您的 nginx 配置中,您现在可以在不同的服务器配置下定义 2 个不同的 sock 文件。
    3. 创建php-fpm.conf 的副本。该文件应包含在/etc/php-fpm.conf 中。
    4. 重新启动php-fpm,然后查看其状态以确保其正常工作。如果遇到nginx 的权限错误,您可能需要手动更改/var/run/php-fpm/ 的权限和组及其内容。

    让 php 以 root 身份运行

    1. usergroup 更改为 root(就像您已经完成的那样)。
    2. 打开php-fpm.service。我通过 ssh 控制台输入了nano /lib/systemd/system/php-fpm.service
    3. ExecStart=/usr/sbin/php-fpm --nodaemonize 更改为ExecStart=/usr/sbin/php-fpm --nodaemonize -R-R 允许 php-fpm 以 root 身份运行。
    4. 重启daemon。如果您使用的是centos,请输入systemctl daemon-reload

    编辑

    如果您想让php 执行为root 的唯一原因是重新启动nginx,那么您最好通过设置一个cron 作业来执行此操作。请参阅:this question 或手动通过 ssh

    【讨论】:

      猜你喜欢
      • 2014-11-15
      • 2017-04-12
      • 2012-11-11
      • 1970-01-01
      • 1970-01-01
      • 2020-10-07
      • 2020-03-18
      • 2022-11-18
      • 2012-08-05
      相关资源
      最近更新 更多