nginx使用if实现多重判断case一例

场景

  • 根据请求URI的某个参数,判断后分发到不同backend。具体来说会判断是否存在code=OVERSEA…,有则upstream到指定backend
  • 根据来源IP区分production环境和preview环境

问题

  • 上面提到的参数可能重复出现
  • if不支持复杂的逻辑运算
  • if is evil

nginx根据后端返回状态进行upstream

需求

某系统,因为某些众所周知的原因。
需在国外建立完全独立的一套业务。且国内已有用户还需继续维护。
由于带宽、响应时间等原因,全球同步数据存在一系列问题。

问题

  • 放在前端的nginx不能判断用户归属国家,判断逻辑太重,nginx不适合做这个
  • nginx后端的backend有自己的逻辑判断用户归属,用返回的status code来标识

解决方案

  • nginx + lua + subrequest
  • 要在content阶段完成
  • 需在rewrite阶段做一点处理
  • GET和POST要区分对待
  • POST的body和GET的args、cookie等处理
  • nginx根据后端的不同返回status code,进行逻辑判断,是直接返回给client还是重新proxy到其他国家