最近因工作需要,需要在远程服务器上创建网站。
前期很顺利,由于服务器是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连接到这台服务器执行重启命令。
更自由,更方便,还不需要对目标服务器进行配置。
回头有空会说一下这个的。