将nginx置于某些IP的维护模式

因为if语句工作在nginx(没有嵌套,没有多个条件)的方式,我想不出一种方法来结合这两个function:

  • 使用nginx Geo模块我有一个允许的ips列表
  • 在我的文件系统上,如果我在特定的目录中touch appname ,应用程序会自动进入503维护模式。

这是我想要做的,但在nginx中不允许:

 location / { if (-f /var/www/maintmode/appname && $allowed_ip = no) { return 503; } try_files $uri; } 

如果在nginx中可以实现上述function,那么来自Geo模块的allowed_ip列表中的任何人都将绕过503,并照常使用该站点。 然后,在validation应用程序正在从maint目录工作rm appname和503维护模式结束。

这种方法的好处是可以touch单个文件来启用/禁用maint模式,而无需修改conf并重新加载nginx。

任何想法,我怎么能得到这样的东西工作?

如果你已经在使用地理,你应该有这样的东西:

 geo $client { default not_allowed; 10.0.0.0/8 allowed; } 

所以,而不是使用/var/www/maintmode/appname你可以使用:

 location / { if (-f /var/www/maintmode/$client) { return 503; } try_files $uri $uri/; } 

如果存在/var/www/maintmode/not_allowed文件,页面将进入维护模式,但允许列表中的IP地址除外。

所以多亏了HD的技巧,我才解决了这个问题:

充分利用了Geo docs这个事实forms: 当没有指定default时,默认值将是一个空string。

 geo $allowed_client { 10.0.0.0/8 allowed; } server { ... set $appname app1; location / { $maintmode "${appname}${allowed_client}" if (-f /var/www/maintmode/$maintmode) { return 503; } try_files $uri $uri/; } } 

所以我仍然可以在maint目录中touch app1来closures特定的应用程序,因为如果我们有一个有效的IP $maintmode = app1allowed ,它将跳过503.所有其他IP将有$maintmode = app1这将落入503.感谢HD!