用例:我的团队有 STAGE 和 PROD 环境。当然,我们希望 STAGE 尽可能接近 PROD,理想情况下,我们希望对两个环境使用相同的配置,这样如果其中出现错误,希望它们会在 STAGE 中显示,而不是仅在 PROD 中显示。
无论如何,这两个环境并不完全相同,并且需要在指令上存在一些差异。
例如
server {
server_name prod.domain.tld;
<block of directives, say block A>
}
server {
server_name stage.domain.tld;
<block of directives, say block A>
<a couple more directives that are required for stage, very minimal>
}
我尝试过的:
方法 1(无效)
以下操作无效,因为某些指令无法放在if
server {
server_name prod.domain.tld stage.domain.tld; #notice that everything is one block
<block of directives, say block A>
if ( $host = "stage.domain.tld" ) {
<a couple more directives that are required for stage, very minimal>
}
}
方法 2(无效)
对于第二种方法,我想用默认值设置变量,用于 PROD,并且只有在主机为 STAGE 的情况下,配置才会将值更改为其他值。但这也不可能,因为某些指令不能简单地通过特殊值关闭(例如add_header
),或者其他指令不接受变量(allow
例如)。
server {
server_name prod.domain.tld stage.domain.tld;
<block of directives, say block A>
<block of variables like: set $var1 default_value_for_prod>
if ( $host = "stage.domain.tld" ) {
<block of variables like: set $var1 value_for_stage>
}
<block of extra directives with the structure: directive $varN; >
}
方法 3 (有效,但是会造成分裂)
我发现有效的方法是使用包含,缺点是配置分散在文件中。
server {
server_name prod.domain.tld;
include /etc/nginx/conf.d/common_configuration_stage_live;
}
server {
server_name stage.domain.tld;
include /etc/nginx/conf.d/common_configuration_stage_live;
<a couple more directives that are required for stage, very minimal>
}
最后一个问题
虽然方法 3 有效,但从长远来看效果并不好,因为配置被拆分,并且必须检查多个文件(尽管它可以节省冗余)。您还有其他可行的方法来实现目标吗?