将一个应用程序用于多个uwsgi实例

时间:2016-05-31 06:45:34

标签: python nginx uwsgi multi-tenant saas

我找到了很多例子来解释我们如何使用uwsgi和emperor模式来实现多个应用程序部署。这对我来说意味着:几个app文件夹,每个应用程序有一个附庸(ini,socket,application.py)。

我还无法找到只有一个包含多个附庸的app文件夹的配置示例。这应该允许我提供多租户应用程序(每个客户都有自己的数据库)。我用两个实例测试了这个。这个"似乎"工作得很好

  1. 这是一个很好的做法还是你有类似的设置?
  2. 这是否提供了vassals实例之间的完全隔离?
  3. 这是我的设置。我正在使用nginx / uwsgi / python堆栈(我使用emperor_pg module)。此设置允许uwsgi为每个客户A和B生成一个附庸。客户正在使用url:customerN.mydomain.com/fe1/web

    Nginx配置:

    # This virtual host catches all incoming traffic from port 80 (security should be considered if not talking on local
    # network)
    server {
            listen 80;
            # We capture here the subdomain. It is used to designate a customer entity.
            server_name ~^(?<subdomain>.+)\.mydomain\.fr$;
    
    
            # We use a pattern for creating sockets name and path.
            # This allows to spawn vassals automatically by detecting changes in the vassals pg table (emperor_pg)
            # Pattern used is : /tmp/$subdomain$appname.sock
    
    
            location ~favicon\.ico$ {
                root /opt/app-current/web/;
            }
    
            location ~^\/(?<app_name>.+)\/web\/ {
    
                root /opt/web-content/$subdomain/;
            }
    
            location ~^\/(?<app_name>.+)\/ {
    
                # Routing to socket designated by standard pattern
                include uwsgi_params;
                uwsgi_pass unix://tmp/$subdomain$app_name.sock;
    
            }
    
            # When calling root of entity's subdomain, we launch the default app by routing traffic to index.socket
            location / {
                include uwsgi_params;
                uwsgi_pass unix://tmp/$subdomain.sock;
            }
    }
    
    使用emperor_pg

    皇帝新贵剧本

    # Emperor configuration upstart script in `/etc/init/uwsgi.conf` :
    # uWSGI - Manage uWSGI Application Server
    
    description "uWSGI Emperor Mode"
    
    start on (filesystem and net-device-up IFACE=lo)
    stop on runlevel [!2345]
    
    respawn
    
    
    # We use pg mode. This allows to scan a postgresql database.
    # requires sudo apt-get install uwsgi-plugin-emperor-pg
    
    exec /usr/bin/uwsgi --uid www-data --gid www-data --plugin emperor_pg --emperor "pg://host=dbserver.com.com user=saasautomator dbname=saasautomator;SELECT name,config,ts,uid,gid,socket FROM vassals" --logto /var/log/uwsgi.log
    

    数据库中的vassals 配置文件的示例。他们使用相同的应用程序文件夹:

    saasautomator=> SELECT * FROM vassals;
     idvassals |              name               |                             config                             |         ts          |  uid  |  gid  |                socket                 
    -----------+---------------------------------+----------------------------------------------------------------+---------------------+-------+-------+---------------------------------------
             3 | customerAfe1.ini  | [uwsgi]                                                       +| 2004-10-19 10:23:54 | uwsgi | uwsgi | /tmp/customerAfe1.sock
               |                                 |  master = true                                                +|                     |       |       | 
               |                                 |  vaccum = true                                                +|                     |       |       | 
               |                                 |  chdir = /opt/app/                       +|                     |       |       | 
               |                                 |  plugins = python                                             +|                     |       |       | 
               |                                 |  wsgi-file = /opt/app/fe1/application.py +|                     |       |       | 
               |                                 |  processes = 4                                                +|                     |       |       | 
               |                                 |  threads = 2                                                  +|                     |       |       | 
               |                                 |  stats = 127.0.0.1:9191                                        |                     |       |       | 
             4 | customerBfe1.ini | [uwsgi]                                                       +| 2004-10-19 10:23:55 | uwsgi | uwsgi | /tmp/customerBfe1.sock
               |                                 |  master = true                                                +|                     |       |       | 
               |                                 |  vaccum = true                                                +|                     |       |       | 
               |                                 |  chdir = /opt/app/                       +|                     |       |       | 
               |                                 |  plugins = python                                             +|                     |       |       | 
               |                                 |  wsgi-file = /opt/app/fe1/application.py +|                     |       |       | 
               |                                 |  processes = 4                                                +|                     |       |       | 
               |                                 |  threads = 2                                                  +|                     |       |       | 
               |                                 |  stats = 127.0.0.1:9192                                        |                     |       |       | 
    (2 rows)
    

    谢谢!

1 个答案:

答案 0 :(得分:1)

&#34;这是一个很好的做法还是你有类似的设置?&#34;

我确实有类似的设置。如果这是一个好的做法,我不会回答,因为它是基于意见的,但是这和每个客户的复制代码库之间存在细微差别。主要区别在于:如果有人闯入一个应用程序并且他将能够修改它的代码,它将影响所有应用程序...但是如果应用程序的配置没有差异,将允许以这种方式打破一个,但不是其他 - 它不重要。如果有人闯入其中,他可以在其他人身上重现......

使用共享代码库,修复黑客攻击应用后所做的更改也会更容易。

我无法看到其他重要的差异......

&#34;这是否提供了vassals实例之间的完全隔离?&#34;

如前所述,不完整,但其他任何事情都可以被隔离。这就像在系统中的应用程序之间共享一个库,这种情况一直在发生。通过适当的配置,您还可以分离数据库和其他资源。

如果正确应用了文件系统权限,则可以限制自行更改应用程序代码的能力,因此会限制某些黑客更改代码的能力。