首先,在 NGINX 中使用上游定义应该很常见!这是首选的方法。
不幸的是,NGINX 开源并没有一个简单的解决方案。但是为什么不尝试构建不需要重新加载任何配置的东西呢。
所以我们有两个上面提到的上游定义
upstream blue{
server primary.local.net:80;
server backup.local.net:80 backup;
}
upstream green{
server primary.local.net:80;
server backup.local.net:80 backup;
}
蓝色是primary,green 是次要的。如果你说你准备了一些东西,你认为有可能在你的后端有一些东西告诉 NGINX 哪些部署当前处于活动状态。蓝色还是绿色?
另一种选择可能是保存该信息的 NGINX 实例上的文件。 njs 将能够从该文件中读取并根据提供的信息定义要使用的上游。
https://nginx.org/en/docs/njs/reference.html#njs_api_fs
快速 POC:
upstream.conf
upstream blue {
server 127.1:9000;
server 127.1:9100 backup;
}
upstream green {
server 127.1:9000 backup;
server 127.1:9100;
}
js_import upstream from conf.d/upstream.js;
js_set $upstream upstream.set;
server {
listen 80;
location / {
proxy_pass http://$upstream/;
}
}
upstream.js
export default { set }
function set(r) {
var fs = require('fs');
try {
var c = fs.readFileSync("/etc/nginx/conf.d/active.txt");
} catch (e) {
r.error("Error while reading upstrem file.");
// maybe set c to somehting default then.
}
return c;
}
active.txt
blue
注意:确保创建的文件末尾没有换行符,例如 echo -n "blue" > active.txt。
您现在可以在运行时更改active.txt 的内容,并且上游将被动态配置。使用此解决方案,您甚至可以检查请求标头,如果您想在上游测试inactive,这也可以。不过相当灵活。