我们在 nginx 后面运行我们的 python 应用程序。首先我们使用 uWSGI,因为它快速、可靠且易于部署。接下来,随着同时客户端数量(使用服务器发送事件/事件流)的增加,我们已将应用程序部分切换到 gunicorn+gevent。
目前,该应用程序的运行方式如下:
- 静态由 nginx 直接处理;
- 短请求(REST API)由 uWSGI 处理(nginx<->uwsgi 通过 unix 套接字连接)
- 长请求(服务器发送的事件)由 gunicorn+gevent 处理(nginx 充当 rev 代理)
我们应该保留这种设置吗?或者有什么理由从 uWSGI 切换到 gunicorn?
答案1
这实际上取决于 uWSGI 功能在多大程度上构成了您的基础架构。WSGI 的目的之一是允许轻松地从一个适配器移动到另一个适配器。如果您只将 uWSGI 用于“WSGI”部分,则可以毫无问题地移动到 gunicorn。
话虽如此,你应该考虑到 uWSGI gevent 支持非常强大并且与 uWSGI api 高度集成(一旦你加载了 gevent 插件,服务器的所有阻塞内部都会与 gevent 原语挂钩),所以也许你可以考虑它(除此之外,uWSGI 卸载允许你将请求从一个实例移动到另一个实例而不会阻塞前端工作者,因此你的 rest api 可以用作“具有更多逻辑的代理”)