【问题标题】:Running mutliple CherryPy web apps with different python versions使用不同的 python 版本运行多个 CherryPy Web 应用程序
【发布时间】:2015-02-02 12:24:58
【问题描述】:

所以目前我管理着两个由以前的开发者开发的 CherryPy 网络应用程序(不同)。

一个是python2.7,一个是python3.0。 目前它们都使用cherrypy webserver并启动自己的实例,因为它们是具有不同用途和不同数据库的独立应用程序。

我的任务是开发第三个甚至更多可以在同一台服务器上运行的应用程序。

对于我们开发的每个应用,在不同的端口上实例化一个新的网络服务器被认为是低效的,因此我们正在寻找解决方案。

我发现的第一件事是 mod_wsgi for apache,但我很快发现它只能处理一个 python 版本。

那么到目前为止,这样的设置有什么解决方案?

这些都是低流量的内部应用程序,但我们不希望运行 6 个不同的服务器,每个服务器都在自己的端口上。

【问题讨论】:

    标签: python apache mod-wsgi cherrypy


    【解决方案1】:

    您可以使用nginx(可能使用gunicorn)。我很确定用 apache 也可以做同样的事情,但我没有使用 Apache 设置 WSGI 的经验。

    主要的一点是你实际上需要运行几个不同的内部网络服务器,每个应用一个,你将能够将它们与nginx结合在同一个端口上

    我不确定 CherryPy 是否支持侦听 file socket 而不是 port,所以如果可以 - 你可以省略 gunicorn 并直接配置 nginx使用 CherryPy 服务器。

    这是nginx 的示例配置。 您可以在nginx.conf 中创建不同的子域或子URL,即:

    upstream app1 {
        server unix:/var/run/user/app1.sock fail_timeout=0;
    }
    upstream app2 {
        server unix:/var/run/user/app2.sock fail_timeout=0;
    }
    

    ...

    server {
        listen 0.0.0.0:80;
        server_name app1.yourdomain.com;
        location / {
            proxy_pass http://app1;
        }
    }
    server {
        listen 0.0.0.0:80;
        server_name app2.yourdomain.com;
        location / {
            proxy_pass http://app2;
        }
    }
    

    ...并且在每个应用程序的 gunicorn 配置中(顺便说一句,您将有两个 gunicorns - gunicorn-2.7gunicorn-3.2)您必须绑定应用程序以不监听 端口,而是在 unix socket 上,例如/var/run/user/app1.sock

    这将导致两个子域有两个不同的应用程序。这些应用程序甚至可以用不同的语言编写。

    如果您导航到 http://*****.yourdomain.com,您的请求将被发送到相应的 gunicorn 实例,因此适当的应用程序将处理它。

    我认为您无论如何都会想要 gunicorn:它可以让您将应用程序绑定到 file socket 和许多其他有用的功能,例如运行同一应用的多个工作人员。

    【讨论】:

    • 谢谢!我今天会试一试。初步阅读看起来很有希望。
    【解决方案2】:

    事实上,你试图避免的几乎看起来像microservice architecture(Martin Fowler 文章)。基本上,它提出了最小的独立服务,这些服务被多路复用以作为一个整体,而不是一个单一的应用程序。它有其优点和缺点,但今天它被认为是更好的。至少在大规模上。

    因此,设计应用程序的一种方式是微服务架构,运行多个内部服务器不是问题。请注意,这种方法中的一些复杂性转移到了基础设施上。也就是说你需要高质量的部署、监控等。

    Andew 的答案的想法是正确的。但具体来说,CherryPy 是一个功能齐全的 HTTP 服务器。您通常不需要另一个中间故障点,gunicorn 左右,您可以完全避免使用 WSGI。只需使用 HTTP,即 nginx 充当 CherryPy 内部 HTTP 服务器的反向 HTTP 代理。

    最简单的方式如下所示。

    python 2 应用程序

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    
    
    import cherrypy
    
    
    
    config = {
      'global' : {
        'server.socket_host' : '127.0.0.1',
        'server.socket_port' : 8080,
        'server.thread_pool' : 8
      },
      '/' : {
        'tools.proxy.on' : True 
      }  
    }
    
    
    class App:
    
      @cherrypy.expose
      def index(self):
        return type({}.keys()).__name__
    
    
    if __name__ == '__main__':
      cherrypy.quickstart(App(), '/app1', config)
    

    python 3 应用程序

    #!/usr/bin/env python3
    
    
    import cherrypy
    
    
    config = {
      'global' : {
        'server.socket_host' : '127.0.0.1',
        'server.socket_port' : 8081,
        'server.thread_pool' : 8
      },
      '/' : {
        'tools.proxy.on' : True 
      }
    }
    
    
    class App:
    
      @cherrypy.expose
      def index(self):
        return type({}.keys()).__name__
    
    
    if __name__ == '__main__':
      cherrypy.quickstart(App(), '/app2', config)
    

    nginx 配置

    server {
      listen  80;
    
      server_name ngx-test;
    
      root /var/www/ngx-test/www;
    
      location /app1 {
        proxy_pass         http://127.0.0.1:8080;
        proxy_set_header   Host             $host;
        proxy_set_header   X-Real-IP        $remote_addr;
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
      }
    
      location /app2 {
        proxy_pass         http://127.0.0.1:8081;
        proxy_set_header   Host             $host;
        proxy_set_header   X-Real-IP        $remote_addr;
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
      }
    
    }
    

    对于成熟的 CherryPy 部署,请查看 this answer

    【讨论】:

    • 我喜欢这样可以最大限度地减少开销和故障点。这是否会减少微服务架构消耗的资源量?因为看起来 gunicorn 会将所有应用程序放在同一个保护伞下,这会做类似的事情吗?看起来我仍然需要将应用程序作为自己的进程启动,quickstart 不会实例化一个“新”服务器吗?
    • 首先,我的回答建议使用 CherryPy Nginx,而不是 CherryPy gunicorn Nginx i>,并让您有理由证明多应用架构的合理性。二是中介机构少,资源消耗少。第三,是的,你仍然需要将每个应用程序作为一个单独的进程启动,加上 nginx 来对它们进行多路复用。上面的示例只是演示,因为quickstart() 不是部署 CherryPy 的方式。对于实际部署,请点击链接。
    猜你喜欢
    • 2011-01-04
    • 2017-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 2017-03-02
    • 2012-03-29
    • 1970-01-01
    相关资源
    最近更新 更多