2014-12-04 81 views
1

因此,目前我管理的是由以前的開發人員(不同)開發的兩個CherryPy網絡應用程序。運行多個不同Python版本的CherryPy網絡應用程序

一個是用python2.7和其他python3.0編寫的。 目前他們都使用cherrypy webserver並啓動自己的實例,因爲它們是具有不同目的和不同數據庫的獨立應用程序。

我的任務是開發第三個應用程序,也許會運行在同一臺服務器上。

爲我們開發的每個應用程序在不同的端口上實例化一個新的Web服務器被認爲是低效的,所以我們正在尋找解決方案。

我發現的第一件事是Apache的mod_wsgi,但我很快發現這隻能夠處理一個python版本。

因此,到目前爲止,這種設置有什麼解決方案?

這些都是低流量的內部應用程序,但我們不希望運行6個不同的服務器,每個服務器都在自己的端口上運行。

回答

1

您可以使用nginx(可能與gunicorn)。我相當肯定用apache可以做同樣的事情,但我沒有使用Apache設置WSGI的經驗。

主要的一點是,你確實需要運行幾個不同的內部網絡服務器,爲每個應用,你就可以用nginx

我要團結他們在同一端口上m不知道CherryPy是否支持聆聽文件套接字而不是端口,因此如果可以 - 您可以省略gunicorn並直接配置nginx與CherryPy服務器。

下面是nginx的配置示例。 可以在nginx.conf創建不同的子或subURLs,即:

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套接字,例如/var/run/user/app1.sock

這將導致對兩個子域有兩個不同的應用程序。這些應用程序甚至可以用不同的語言編寫。

如果您導航到http://*****.yourdomain.com,您的請求將被髮送到相應的gunicorn實例,因此適當的應用程序將處理它。

我想你會希望在任何情況下gunicorn:它可以讓你綁定應用程序文件插座等衆多實用功能,例如運行同一個應用的多個工作人員。

+0

謝謝!我今天會試一試。最初的閱讀看起來很有希望。 – ashrles 2014-12-04 15:24:38

1

事實上,你試圖避免幾乎看起來像一個microservice architecture(馬丁福勒文章)。基本上它提出了最小化的自包含服務,它被多路複用以作爲一個整體,而不是一個單一的應用程序。它有其優點和缺點,但今天它被認爲更好。至少在大規模。

因此,設計應用程序的一種方式是微服務架構,並且運行多個內部服務器不成問題。請注意,這種方法的一些複雜性轉移到基礎設施。也就是說你需要高質量的部署,監控等。

Andew的答案是正確的。但具體來說CherryPy是一個全功能的HTTP服務器。您通常不需要另一箇中間點失敗點,gunicorn左右,您可以完全避免WSGI。只需使用HTTP即nginx作爲CherryPy內部HTTP服務器的反向HTTP代理。

以最簡單的方式,它看起來像以下內容。

蟒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) 

蟒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; 
    } 

} 

對於盛放的CherryP y部署看看this answer

+0

我喜歡這樣如何最大限度地減少開銷和失敗點。這是否會減少微服務體系結構消耗的資源量?因爲它看起來像gunicorn將會把所有的應用程序放在同一個傘下,這是否會做類似的事情?它看起來像我仍然需要啓動應用程序作爲自己的過程,不會快速啓動實例化一個「新」服務器? – ashrles 2014-12-09 17:45:48

+0

首先,我的答案建議使用* CherryPy <= HTTP => Nginx *,而不是* CherryPy <= WSGI => gunicorn <= HTTP => Nginx *,併爲您提供證明多應用程序體系結構合理性的理由。其次,中介機構少,消耗的資源少。第三,是的,你仍然需要將每個應用程序作爲一個獨立的進程啓動,再加上nginx來複用它們。上面的示例僅演示爲'quickstart()'不是部署CherryPy的方式。對於真實世界的部署,請遵循鏈接。 – saaj 2014-12-09 19:39:45

相關問題