共计 1074 个字符,预计需要花费 3 分钟才能阅读完成。
PHP Web 端安全操作 Nginx 配置及热重启
前言
之前帮客户整了一套基于 GeoIP2 的自动化 AB 站([Nginx Geoip2 处理不同国家 (或城市) 的访问
](https://learnku.com/articles/…),客户最近想通过管理端手动控制 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
正文完