我需要在充当代理的 nginx 中执行一些条件操作。基本上,这一切都归结为能够从外部源设置一些 nginx 变量。它可以是 bash 脚本或由 url 生成的结果或类似的东西。
例如:
set $var = [result of http request]
或者
set $var = [result of bash command]
有没有可靠的解决方案?模块?如果使用 nginx 不是一个好主意,那么有什么替代方案吗?
答案1
解决方案是使用lua 模块执行简单的 lua 脚本来完成必要的处理。简单的例子:
location / {
# Get device type from lua script.
# Note: do not use content_by_lua as it's executed in separate context.
set_by_lua_file $device_type 'device-detect.lua';
# Do what needs to be done...
}
lua 脚本返回的任何内容都位于$device_type
变量内。
要记住的重要一点是,在大多数 Linux 发行版中,lua 模块是 nginx-extras 包的一部分,必须安装该包而不是标准 nginx-core。
答案2
Nginx 有很多内置变量[1],你可以使用如下变量:
#Default to EN
set $vislang "EN";
#Discriminate language
if ($http_accept_language ~* "^fr") {
set $vislang "FR";
}
基于 bash 的解决方案可能是“sed -i nginx_conf_file && service nginx reload”,但我认为它不是很干净。
[1]http://nginx.org/en/docs/http/ngx_http_core_module.html#variables