前言
之前幫客戶整了一套基於GeoIP2的自動化AB站(Nginx Geoip2 處理不同國家 (或城市) 的訪問
),客戶最近想通過管理端手動控制AB站切換
不建議使用system,exec等執行shell命令的函式
- 需要複雜的提權操作
- 一般專案這些函式是被禁止
- 作為一名合格的Phper除非特殊情況,否則是嚴禁在專案中啟用一些涉及到安全性的函式
方案思路
- Nginx vhost配置檔案中
include
片段配置 - 後端切換AB站時,PHP邏輯中修改第一步中引入片段配置
- 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 vhost
中include
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 協議》,轉載必須註明作者和本文連結