Flask App Dispatching:多个uWSGI实例或分派到单个实例。

时间:2014-01-27 17:03:32

标签: python nginx flask uwsgi

我正在开发一个Flask应用程序,我们将拥有多个客户端(10-20),每个客户端都有自己的配置(对于数据库,客户端特定设置等)。每个客户端都有一个子域,如www。 client1.myapp.com,www.cleint2.myapp.com。我使用uWSGI作为中间件,使用nginx作为代理服务器。

我想有两种方法可以部署这个,一种是使用application dispatching,另一种是使用uwsgi。另一种方法是为每个客户端运行一个单独的uwsgi实例,并使用基于子域的nginx将流量转发到正确的应用程序。有谁知道每种情况的利弊?只是好奇,像Jira这样的应用程序如何处理这个?

1 个答案:

答案 0 :(得分:2)

我建议有多个实例,由nginx转发。我正在使用PHP应用程序做类似的事情,而且效果非常好。

这样做的原因和好处是,您可以将所有内容完全分开,如果一个客户端的设置变得棘手,您可以重新实例化,对任何人都没有问题其他。此外,没有用户,即使他们设法破坏应用程序级别的安全性,也可以访问任何其他用户的数据。

我将所有客户端保留在他们自己的数据库(一个mysql实例,多个dbs)上,所以我可以做一个完整的sqldump(如果使用mysql等)或另一个使用sqlite而不是mysql的应用程序:复制.sqlite数据库完全用于备份。

这样做意味着你也可以轻松设置一个“测试”。客户网站的版本,以及现场版本。然后你可以通过改变你的nginx设置来交换哪一个实际存在。比如进行升级,你可以升级测试版,检查一下,然后交换。 (此外,对于某些应用程序,客户可能喜欢拥有他们自己的测试版本,他们可以打破他们的内容,并知道他们(或您)可以在短时间内重新安装它,而不会损害他们的&# #39;真实的数据)。

继续进行应用程序调度,你不能轻易地让nginx服务于单独的客户端上传目录,而不是每个客户端都有一个单独的nginx配置(如果你这样做,那么为什么不去寻找单独的uWSGI实例)。同样,对于单个SSL证书(如果您需要...)。

每个子域(或完全针对某些域的单独域)都有自己的日志记录,因此如果某个客户端是DOS,或者是其他黑客,则很容易看到哪个。

您可以为每个用户设置文件系统级别大小配额,这样,如果一个客户端开始上传gB视频,那么您的服务器也不会被填满。

我工作的方式是使用ansible来配置和设置服务器的方式,将客户端特定的详细信息保存在单独的host_var文件中。所以我的库存是:

[servers]
myapp.com #or whatever...

[application_clients]
apples
pears
elephants

[application_clients:vars]
ansible_address=myapp.com

然后host_vars/apples

url=apples.myapp.com
db_user=apples
db_pass=secret
然后在配置中,我设置了两个新用户&每个客户一组。例如:applesweb.apples作为两个用户,而组只是apples(两者都在)。

这样,所有应用程序代码都归apples用户所有,但PHP-FPM实例(或您的案例中的uWSGI实例)由web.apples运行。所有代码的权限都是rwXr-X---,以及上传和版权的权限。静态目录是rwXrwXr-X。 Nginx以其自己的用户身份运行,因此它只能访问上传/静态目录,它可以作为直接文件。您希望由uWSGI应用程序提供的任何私有文件都可以轻松设置。 web用户可以读取代码并执行它,但无法对其进行编辑。实际用户本身可以读取和写入代码,但通常不会使用,除了更新,安装插件等。

如果他们想要在应用程序界面之外上传,我可以将SFTP用户发送到客户端,该客户端是chroot到他们的上传目录。

使用ansible或其他配置系统意味着创建新的客户端设置所需的工作非常少,如果客户端(无论出于何种原因)想要转移到他们自己的服务器上,那么它就是“#”。只需要更改配置详细信息的几行,然后重新运行脚本。这也意味着我可以使用与主服务器完全相同的配置来安装开发服务器,并且我可以将备用亚马逊实例保持在待机状态,如果我需要,它可以接管。

我意识到这并没有完全回答你关于各方利弊的问题,但无论如何它可能会有所帮助。 uWSGI或任何其他WSGI服务器的多个实例(主要是我使用服务员,但有很多好的服务器)设置非常简单,如果在逻辑上完成,配置良好的配置系统,易于管理。