使用 nginx 作为 API 服务的集中反向代理

日期:

2017-12-02 00:00

标签:

nginx, 负载均衡, wsgi, API

在上一周期中,大多数 OpenStack API 服务提供了一个 WSGI 应用程序,并通过 uWSGI 提供服务。本规范的目的是概述一个计划,以利用 uWSGI 提供的更大灵活性,并使用 nginx 作为集中的反向代理。

https://blueprints.launchpad.net/openstack-ansible/+spec/centralized-nginx

问题描述

在大多数角色中,OpenStack API 服务现在被部署并通过 uWSGI 提供服务。然而,有些也包括在前面安装一个 Web 服务器代理。目前假设 Web 服务器安装在主机上并由安装角色进行管理。这会导致收敛安装出现问题,例如全裸金属场景。由于这种单个服务部署之间不一致性,服务请求的 SSL 加密也目前比较困难。在 OpenStack-Ansible 部署中,SSL 终止大多预计在负载均衡器处处理,但部署者可能需要对加密流量的处理进行额外的控制。

提议的变更

从任何包含它的 OpenStack 角色中删除 nginx 的安装,并将其作为共享反向代理单独部署,为每个 OpenStack API 服务配置单独的站点。OpenStack 角色只需要提供现有 nginx 安装的站点配置。

为了管理 nginx 将要代理的 uWSGI 后端,在 nginx 旁边安装一个 uWSGI FastRouter。FastRouter 将创建一个共享套接字,nginx 可以连接到它,以及一个订阅服务器,应用程序可以订阅它并自动提供负载均衡。

备选方案

nginx 可以与每个 OpenStack 服务一起部署,但由于主机上运行的其他进程,这可能会影响性能,并且无法解决多个角色尝试管理同一主机或容器上的相同 Web 服务器时造成的任务重复和冲突。

负载均衡器后端可以直接使用 uWSGI http/https,但大多数项目推荐使用专用的 Web 服务器。通过提议的更改,http 请求的处理和 Python 代码的运行之间存在清晰的分离。由于所有 OpenStack API 后端将使用相同的 nginx 主机,因此负载均衡器配置也可以简化,而无需了解单个容器。对于扩展目的,新的或替换的 API 服务安装只需要订阅 FastRouter 即可包含在池中。

Playbook/Role 影响

需要创建一个新的 playbook 来安装 nginx 和 uWSGI FastRouter。 优先选择来自 galaxy 的现有 nginx 角色,但如果不存在支持 OpenStack-Ansible 所有相同操作系统或不提供满足我们需求的足够配置选项的角色,则可能需要创建或贡献一个。

每个部署 Web 服务器的现有 OpenStack 角色都需要删除这些任务,并替换为委托给任何运行 nginx 的主机的任务,以配置和启用 nginx 站点。这些角色中的 uWSGI 配置也需要更新为包含订阅现有 FastRouter 的选项。

HAProxy 服务器角色可能需要更大的灵活性,例如允许 SSL 直通和服务的即时配置以及后端配置。

升级影响

由于负载均衡器后端可能会发生变化,负载均衡器最初需要包含现有的后端和集中的 nginx 后端,以限制升级期间的停机时间。

安全影响

由于它将允许部署者对 SSL 终止的位置拥有更大的灵活性,包括防止流量在解密后离开主机,因此提议的更改应提高 OpenStack-Ansible 的安全性。

性能影响

nginx 是一个高性能的 Web 服务器和反向代理。单个控制器主机上运行的 Web 服务器较少,可能会提高主机性能。通过删除在多个角色中安装和配置 Web 服务器的重复任务,部署时间也可能得到改善。

最终用户影响

N/A

部署者影响

部署者需要了解此更改包含的部署架构更改。将为部署者提供额外的选项来配置共享 nginx 实例、uWSGI FastRouter 以及 SSL 证书的分配。部署者还必须了解此更改可能对升级产生的影响。

开发人员影响

未来的 OpenStack 角色需要包含此更改建立的模式。测试需要额外的 Ansible 角色、playbook 和变量。

依赖项

HAProxy 服务器角色可能需要进行一些更改并提高配置灵活性。

keystone 角色当前在用作身份提供程序或外部身份提供程序的服务提供程序时,有条件地安装 Apache。需要进一步调查,以确保 nginx 可以为这些角色提供相同的支持级别,包括门控测试场景。

horizon 角色当前也安装 Apache 并使用它来提供静态内容。在容器上运行时,该静态内容可能需要移动到挂载点才能保持对外部 Web 服务器的可访问性。

实现

负责人

主要负责人

jimmy-mccrory (jmccrory)

其他贡献者

<launchpad-id 或 None>

工作项

  • 评估 galaxy 中现有的 nginx 角色

  • 如有必要,开发新的 nginx 角色

  • 开发用于部署 nginx 和 uWSGI FastRouter 的 playbook

  • 调整 HAProxy 角色

  • 评估 Web 服务器静态提供文件的文件绑定挂载

  • 更新 OpenStack 角色以创建 nginx 站点配置并订阅 API 服务的 FastRouter

测试

各个角色和集成仓库将在实施过程中测试所涉及的更改。

文档影响

部署架构的更改以及配置 nginx、uWSGI FastRouter、HAProxy 和 SSL 的任何其他选项都需要记录。

升级的影响以及最大限度地减少(并希望避免)API 停机的步骤也需要记录。

参考资料

https://uwsgi-docs.readthedocs.io/en/latest/Fastrouter.html