PHP Web 端操作 Nginx 配置

AR414發表於2020-06-17

前言

之前幫客戶整了一套基於GeoIP2的自動化AB站(Nginx Geoip2 處理不同國家 (或城市) 的訪問 ),客戶最近想通過管理端手動控制AB站切換
ar414

不建議使用system,exec等執行shell命令的函式

  • 需要複雜的提權操作
  • 一般專案這些函式是被禁止
  • 作為一名合格的Phper除非特殊情況,否則是嚴禁在專案中啟用一些涉及到安全性的函式

方案思路

  1. Nginx vhost配置檔案中include片段配置
  2. 後端切換AB站時,PHP邏輯中修改第一步中引入片段配置
  3. Nginx Reload
    • 第一種方案:小型專案使用crontab定時執行nginx -s reload(搭配worker_shutdown_timeout使用)
    • 第二種方案(推薦):修改後標記需要reload狀態(File or DB or Cache),定時器通過python指令碼查詢是否需要reload去執行nginx -s reload

方案一

1.建立片段配置檔案

建立獨立片段Nginx配置檔案,例如ar414.conf,然後在nginx vhostinclude

ar414.conf

root /www/wwwroot/ahost;

2.站點配置檔案中include配置檔案ar414.conf

site.conf

server {
        listen       80;
        server_name  0.0.0.0;
        index index.html;
        include /www/wwwroot/abhost/ar414.conf;
    }

3.後臺邏輯中操作ar414.conf

if($data['site_set'] == AbHostSiteEnum::Ahost) 
{
    //開啟A站
    $ahostPath = AbHostSiteEnum::AhostPath;
    file_put_contents('./ar414.conf',"root {$ahostPath};");
}
else 
{
    //開啟B站
    $bhostPath = AbHostSiteEnum::BhostPath;
    file_put_contents('./ar414.conf',"root {$bhostPath};");
}

4.Nginx全域性配置中設定worker_shutdown_timeout

30s內Nginx無法平滑退出,就強行關閉程式

nginx.conf

...
worker_shutdown_timeout  30;

5.定時執行Nginx熱重啟

crontab -e

*/5 * * * * nginx -s reload
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章