在NGINX

时间:2017-07-18 00:44:03

标签: nginx

我想做以下事情:

location ~ ^/(?<upstream>[^/]+)/ {
  rewrite /$upstream/(.*) /api/public/$1  break;

  if ($upstream = "auth") {
    proxy_pass ${AUTH_SERVICE};
  }
  if ($upstream = "todos") {
    proxy_pass ${TODO_SERVICE};
  }
  if ($upstream = "analysis") {
    proxy_pass ${ANALYSIS_SERVICE};
  }
  if ($upstream = "stuff") {
    proxy_pass ${STUFF_SERVICE};
  }
  if ($upstream = "users") {
    proxy_pass ${USERS_SERVICE};
  }
  return 404;
}

使用proxy_pass构建envsubst值。

例如,public-api.com/auth/*的请求将映射到auth-service.com/api/public/*

当我发出请求curl http://localhost:8000/auth/ping时,我会收到404,但我可以直接点击auth-service.com/api/public/deep_ping

有人能发现实施中的错误吗?这样的事情是否可取?

2 个答案:

答案 0 :(得分:0)

我认为问题是if语句。如果if匹配,则不会应用重写规则。

至少这是我在阅读If Is Evil文章后的理解。

处理非平凡逻辑的另一种方法是在Nginx中使用嵌入式脚本。例如,embedded perl或Lua(OpenResty的一部分)。设置它有一些开销,但是当你使用普通的编程语言时,实现复杂的逻辑会更容易,因为没有意外。

答案 1 :(得分:0)

感谢Philipp的链接。通过阅读,我能够理解这是如何工作的(并且是安全的):

location ~ /(?<api>[^/]+)/ {
  set $backend 0;

  if ($api = "auth") {
    set $backend ${AUTH_SERVICE};
  }
  if ($api = "todos") {
    set $backend ${TODO_SERVICE};
  }
  if ($api = "analysis") {
    set $backend ${ANALYSIS_SERVICE};
  }
  if ($api = "stuff") {
    set $backend ${STUFF_SERVICE};
  }
  if ($api = "users") {
    set $backend ${USERS_SERVICE};
  }

  if ($backend = 0) {
    return 404;
  }

  rewrite /([^/]+)/(.*) /$2 break;
  proxy_pass $backend;
}