Nginx. 如何配置两个 vhost 以具有相同或几乎相同的服务器块?

Nginx. 如何配置两个 vhost 以具有相同或几乎相同的服务器块?

用例:我的团队有 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 有效,但从长远来看效果并不好,因为配置被拆分,并且必须检查多个文件(尽管它可以节省冗余)。您还有其他可行的方法来实现目标吗?

相关内容