php动态平滑加载nginx配置文件探索

最近团队的一个项目遇到的一个场景,需要用nginx动态做方向代理。查找了很多资料没有相关的介绍,于是自己研究了一下。形成此文希望对有需求的朋友有所帮助。

首先nginx做静态的反向代理应该是很容易实现的。这个运维工程师应该是非常熟悉的。我贴一下nginx的部分关键配置文件一看便知。

稍微解释一下方便理解。server_name*.a.org;做域名的泛解析。然后通过if正则匹配二级域名,如果匹配到就做跳转(进入到截)。继续做域名匹配匹配到指定二级域名然后代理到内网的指定ip。

这里需要强调的一点是,nginx配置文件的语法需要有空格,否则会报错。

if($host~*"(.*?)\.a\.org$"){}这种写法是错误的。if($host~*"(.*?)\.a\.org$"){}这种写法才是正确的。

上面的配置文件是静态的,写死的。我们要做的是通过PHP动态修改这个配置文件,而且不能重新启动服务器,否则每次重启用户都将访问不到web页面。

通过php动态的逻辑控制修改default.conf这个文件应该不会有什么困难,其实就是一个PHP读写文件的操作。每次吧需要添加的动态代理加进去或者删除掉然后覆盖原来的配置文件就可以了。

重点是怎么让nginx加载配置文件,而且服务器又不重启。

刚开始查了资料很开心,因为发现nginx-sreload就可以平滑重启。而且PHP提供system()之类的函数可以直接调用系统命令。这样的话其实实现起来并不难。可是实际一侧却遇到很多坑。

我通过PHP的system()函数去执行了linux的很多命令都可以执行成功。但是唯独执行和nginx相关的命令一直不成功。后来直接sodu执行,还是不成功。如下图:

反回了int(1)说明没有执行成功。

最后通过查阅资料发现可以修改/ect/sudoers文件来添加权限。修改以后的截图如下:

执行结果如下:

返回int(0)说明执行成功。

不过这个地方依旧有坑需要强调一下,我就是在这个地方花了很多时间。

在sudoers文件中只有root才可以以rootALL=(ALL)ALL的方式配置,表示root用户在任何地方执行任何命令。我刚开始吧nginx也这么配置NginxALL=(ALL)ALL结果死活不起作用。后来改成上图中的配置以后才起作用。

以上就通过PHP动态加载nginx配置文件的过程。希望对大家有用。

如果觉嘚可用,希望能







































白殿危害
初期白癜风能不能治好



转载请注明:http://www.guyukameng.com/aspnet/2018-05-05/9049.html

  • 上一篇文章:
  •   
  • 下一篇文章: