首页 > 心得分享 > PHP在CentOS等Linux系统中以Root权限执行命令行或重启Nginx服务

PHP在CentOS等Linux系统中以Root权限执行命令行或重启Nginx服务

最近因工作需要,需要在远程服务器上创建网站。

前期很顺利,由于服务器是LNMP环境的,只需要给予php修改 .../nginx/conf/vhost/目录 和 /data/wwwroot/ 目录的读写权限.

就可以实现远程添加Nginx配置文件和创建网站根目录与解压网站程序的功能了.

但是,有一个问题却不好解决,就是添加Nginx配置文件以后需要重启Nginx才能生效.

实现方法理论上也很简单,使用PHP执行 "/nginx/sbin/nginx -s reload" 命令即可重启Ningx了.

说起来简单,PHP执行命令行的方法可以用 exec 等命令.

于是 测试代码 就出来了.

<?php
$ret = exec("/etc/init.d/nginx reload");
var_dump($ret);

但是,却提示不存在exec方法.

大概是lnmp考虑安全因素,屏蔽这个命令了吧.

既然知道问题就好解决.

修改 /php/etc/php.ini 文件
搜索 dafe_mode 并将其设置为 off (找不到则可以尝试跳过)
搜索 disable_functions 将 exec 从列表中去掉。
重启 php-fpm

再次运行代码,咦,成功了.
但是检查了一下,并没有成功.

想了下,应该是 php 是以www用户运行的,而nginx是以root身份运行的.

是权限问题导致重启失败的.

那就简单了,加上 sudo 再执行命令嘛.

然后现实是残酷的,加上sudo直接返回空.

因为还是权限问题 可能 是 需要输入密码的原因.

网上找了一圈,终于找到了办法.

给予php以root身份运行命令行不需要密码的权限.

编辑 /etc/sudoers
搜索 Defaults requiretty 并注释掉这一行(使用#进行注释)
添加 下面内容到 文件末尾(另起一行)

允许 www 用户免密码使用 root 身份执行 /etc/init.d/nginx 命令

www ALL=(root) NOPASSWD:/etc/init.d/nginx

修改后,保存,然后再次执行 php

<?php
$ret = exec("/usr/bin/sudo /etc/init.d/nginx reload");
var_dump($ret);

显示执行成功,检查nginx,重启成功了.
至此,问题完美解决.

如果考虑安全问题,不想用php来直接执行命令.
或者以上方法执行失败.并不能成功,则可以尝试一下方法.

在 外部创建一个 shell 脚本,然后使用php 以root身份调用脚本来实现(理论上性质一样)

shell 脚本内容 保存到 /opt/nginx_reload.sh 最好

#!/bin/bash
# 重启Nginx
/usr/bin/sudo /etc/init.d/nginx reload

然后赋予脚本读取和执行权限( chmod +xr /opt/nginx_reload.sh )

PHP脚本代码改为

<?php
$ret = exec("/usr/bin/sudo /opt/nginx_reload.sh");
var_dump($ret);

至此,PHP重启Nginx搞定。

并且,由于是平滑重启,访问php的过程并不会因为nginx的重启而中断。


但是,上面的方法重启Ngixn有很大的局限性,而且会有安全因素风险。

更好的解决方案应该是在远程服务器上使用ssh连接到这台服务器执行重启命令。

更自由,更方便,还不需要对目标服务器进行配置。

回头有空会说一下这个的。

上一篇: [PHP]使用正则表达式遍历匹配指定目录及子目录下的所有文件

下一篇: 【全网唯一可用】CSDN免积分下载器v4.0 网页版

最近回复