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