![如何通过 HTTP 请求重新加载 nginx.conf?](https://linux22.com/image/591219/%E5%A6%82%E4%BD%95%E9%80%9A%E8%BF%87%20HTTP%20%E8%AF%B7%E6%B1%82%E9%87%8D%E6%96%B0%E5%8A%A0%E8%BD%BD%20nginx.conf%EF%BC%9F.png)
我想生成一个 nginx 应该阻止的 IP 列表。此列表应通过在 Web 服务器上执行的操作进行更新。例如添加新 IP 或删除 IP。这意味着它为 nginx 创建“firewall.conf”。
问题:nginx 不监控 .conf 文件中的更改,因此我需要运行“nginx reload”。因为我们的托管公司不允许执行(),我无法执行它。
所以我的问题是:是否可以通过 HTTP 请求重新加载 nginx .conf 文件?
其想法是调用“http://example.org/?secret=key”并触发“nginx reload”。
答案1
这当然不可能立即实现。以下是一些关于如何实现的想法:
- 如果你能够向 nginx 进程发送信号,你可以尝试发送 HUP 信号:
posix_kill($pid_of_nginx, SIGHUP)
。当然,这需要 PHP 中的 POSIX 函数。 - 编写一个程序,监听
reload
命名管道上的命令并通过重新加载 nginx 做出反应。使用 PHP,您只需将必要的命令写入命名管道即可。 - 与 2 相同。使用一个程序定期检查给定位置的特定文件 (例如
/tmp/reload-nginx
)。然后在 PHP 中创建该文件,然后 nginx 将重新加载。
编辑:“管道问题”并不是那么困难:
#!/bin/bash
pipe=/tmp/mypipe
trap "rm -f $pipe" EXIT
if [ ! -p "$pipe" ]; then
mkfifo $pipe
fi
while true; do
if read line <$pipe; then
if [ "$line" == "reload" ]; then
...do the reload here...
fi
fi
done
现在,echo reload >/tmp/mypipe
将唤醒该脚本并让您做您想做的事情。