Varnish 是否进行单独的身份验证检查,还是先进行身份验证检查,然后再进行 Varnish?

Varnish 是否进行单独的身份验证检查,还是先进行身份验证检查,然后再进行 Varnish?

我不太确定我想要建立的架构是否有一个术语,但我会尝试解释。

我有一个 API 和使用会话 ID 调用它的客户端。会话 ID 与存储在 Memcache 中的 PHP 会话中的本地会话信息相关联(如果已过期,则从 MySQL 数据库中提取)。根据会话信息,用户可能会或可能不会访问该 API(因此,访问该 API 不仅需要有效的登录名,还需要与该特定客户端相关联的许可证)。

我希望缓存请求,以便两个具有相同参数(但来自不同客户端/具有不同会话ID)的请求被缓存为一个请求,但保持会话信息检查。

在前一种情况下(Varnish 具有单独的身份验证检查):

 ________                _____________       _________        ________
|        |  Request w.  |     SSL     |     |         |      | Apache | 
| Client |--------------| termination |-----| Varnish |------| + PHP  |
|        |     SID      |             |     |         |      |  API   |
 ‾‾‾‾‾‾‾‾                ‾‾‾‾‾‾‾‾‾‾‾‾‾       ‾‾‾‾|‾‾‾‾        ‾‾‾‾‾‾‾‾
                                                 | SID
                                             ____|_____
                                            | Validate |
                                            |   SID    |
                                            |          |
                                             ‾‾‾‾‾‾‾‾‾‾

换句话说:

  1. 客户端发送带有 SID 的请求。
  2. SSL 因 Varnish 而终止。
  3. Varnish 将 SID 从请求中分离出来,并将其转发到一个后端的验证。
  4. 如果有效,Varnish 会分离参数并将其转发到 API 后端(如果无效,Varnish 会返回验证后端的错误响应)。
  5. Varnish 返回(并缓存)不带 SID 的 API 响应。

或者后一种情况(身份验证检查后的 Varnish):

 ________                __________                     _________        ________
|        |  Request w.  | Validate |  Request without  |         |      | Apache | 
| Client |--------------|   SID    |-------------------| Varnish |------| + PHP  |
|        |     SID      |          |        SID        |         |      |  API   |
 ‾‾‾‾‾‾‾‾                ‾‾‾‾‾‾‾‾‾‾                     ‾‾‾‾‾‾‾‾‾        ‾‾‾‾‾‾‾‾

换句话说:

  1. 客户端发送带有 SID 的请求。
  2. 一个单独的进程(我目前正在考虑 Node.js)验证 SID。
  3. 如果有效,请求参数将被分离并转发到 Varnish 和 API 后端(如果无效,则返回错误响应)。
  4. 返回 Varnish 的响应。

我可以毫无问题地实施后一种解决方案,但我有点担心使用 Node.js 作为反向代理(某些请求针对的是 200-500 MB 的文件),并且我也想避免实施 Node.js 会话验证,我已经在 Apache/PHP 中实现了该验证(由于 API 接收的并发请求量,在后一种解决方案中使用该验证不是一个选择)。

我确信前一种选择也被认为是“更好”的选择,但我发现的所有帖子似乎都声称响应是根据每个用户缓存的,这不是我想要的。

如果您能提供任何关于采取哪种解决方案以及如何实施前者的意见,我们将不胜感激。

答案1

你想要实现的目标是可以实现的。

文章描述你为什么想要这个,并暗示你需要什么。这幻灯片将为您提供更实用的想法。

正如我所说,这是可行的,但除非你知道自己在做什么,否则这绝不是一件轻而易举的事。

希望这有帮助!

相关内容