2012-11-11 32 views
1

A計劃 - 通過Plone的uwsgi獲取的Plone上dotcloud運行(不使用uwsgi)

我試圖通過WSGI上dotcloud部署Plone的。

到目前爲止,我已經安裝了dotcloud工具並創建了一個成功部署所有作品到dotcloud的git存儲庫。我使用github來存儲所有相關的配置。如果您想嘗試一下這些是我目前使用部署的命令:

git clone [email protected]/pigeonflight/stack-python-plone 
cd stack-python-plone 
dotcloud create plone 
dotcloud push 

部署我能夠證實後,我能(在我的dotcloud實例「ssh方式連接」後)使用貼紙用下面的命令來啓動堆棧:

cd current 
bin/paster serve production.ini 

但是,當我試圖訪問其網址的應用程序,我得到一個uwsgi錯誤,Python應用程序未找到。

我wsgi.py文件看起來像這樣:

import os 
from paste.deploy import loadapp 
current_dir = os.getcwd() 
application = loadapp('config:production.ini', relative_to=current_dir) 

更新

A計劃是不是爲我工作了。我最初開始時假設uwsgi是dotcloud上Python應用程序的唯一選項。

B計劃 - 由Plone的Web服務器

我現在開B計劃它將使用Plone的一個端口上運行的工作人員,然後利用一個proxy_pass的服務網站代理端口。另外一個好處是,在其他情況下,「由網絡服務器代理的端口上的Plone」將更接近Plone的標準部署方法。

回答

2

Ken Cochrane和jpetazzo的回答都有助於指導我解決問題。我決定暫時放棄wsgi。該解決方案需要深入挖掘dotcloud python服務和nginx web服務器。我找到了一種方法將指令傳遞給nginx,它將配置一個proxy_pass。

產生的堆棧現在託管在:https://github.com/pigeonflight/stack-python-plone

時,我意識到,我可以通過命令創建一個的Plone-uwsgi.conf文件nginx的,我的目的,我是「最關鍵的突破是劫持「一個文件,該文件旨在傳遞另外的wsgi配置並將其用於不同的事情。 nginx服務器配置爲讀取nginx.conf文件中的其他關鍵指令(例如位置/ {}指令)之後的* uwsgi.conf文件。這爲我提供了一種理想的方式來覆蓋(不需要的)wsgi代碼。情況下,我使用的文件「注入」一proxy_pass指令

下面是我的plone-uwsgi.conf文件如下:

# This configuration file overrides the default file and allows you to run 
    # your zope instance at the root of your dotcloud instance 
    location ^~/{ 
    rewrite ^(.*)$ /VirtualHostBase/http/$http_host:80/VirtualHostRoot$1 break; 
    proxy_pass http://127.0.0.1:8080; 
    include /home/dotcloud/current/proxy.conf; 
    } 

我也存儲在一個名爲proxy.conf我包含在其他配置plone-uwsgi.conf文件。

這是我的proxy.conf文件:

client_max_body_size   0; 
client_body_buffer_size 128k; 
client_body_temp_path  /home/dotcloud/current/var/client_body_temp; 

proxy_connect_timeout  90; 
proxy_send_timeout   90; 
proxy_read_timeout   90; 
proxy_buffer_size   4k; 
proxy_buffers    4 32k; 
proxy_busy_buffers_size 64k; 
proxy_temp_file_write_size 64k; 
proxy_temp_path   /home/dotcloud/current/var/proxy_temp; 
proxy_redirect     off; 
proxy_set_header    Host $host; 
proxy_set_header    X-Real-IP $remote_addr; 
proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for; 

總之,應該可以使用下面的命令在dotcloud沙盒推出一個新的Plone站點:

instance=instancename 
git clone git://github.com/pigeonflight/stack-python-plone.git $instance 
cd $instance 
dotcloud create $instance 

其次:

dotcloud push 

可能的問題: 我不知道預編譯軟件包是否t由我的自定義腳本下載將繼續工作,如果dotcloud更改其工作者實例。

+0

真的很好,謝謝你提供這個配方!我認爲預編譯的軟件包應該可以工作,直到我們將基礎圖像更新爲例如Ubuntu LTS 12;但你應該安全一段時間。 (...「Famous Last Words」:-)) – jpetazzo

+0

基本圖像更新時是否有警告?如果得到警報(如果不是這樣,我需要使用檢測基本系統的兼容性腳本來擴展系統,並在系統發生變化時發出警告)。 –

0

一些問題/評論。

  1. 在你的getplone.sh腳本中,你正在創建一個新的virtualenv?你爲什麼做這個? 〜/ env(/ home/dotcloud/env是完整路徑)已經爲您創建了virtualenv。

    如果你想安裝東西,你可以使用〜/ env/bin/pip,或者甚至更好,你可以把你的需求放在requirements.txt文件中,我注意到你現在已經空了。

    有關在dotCloud代碼依賴更多信息,請點擊此鏈接:http://docs.dotcloud.com/0.9/services/python/#code-dependencies

  2. 如果你想要的Python 2.7,你應該設置在你的dotcloud.yml。請參閱此鏈接瞭解更多信息。 http://docs.dotcloud.com/0.9/services/python/#python-versions

    這是你的dotcloud.yml會是什麼樣加入Python版本之後。

dotcloud。陽明海運

www: 
    type: python 
    postinstall: ./getplone.sh 
    config: 
     python_version: v2.7 
db: 
    type: postgresql 

所以在最後,我想,爲什麼不爲你工作的原因,就是WSGI是安裝程序使用〜/ ENV的virtualenv,因爲你正在創建自己的virtualenv,並把你的代碼在那裏,uWSGI找不到你的應用程序。所以如果你改變使用默認的virtualenv,它應該按照計劃工作。嘗試我建議的更改,看看它們是否適合你。

+0

感謝肯,這有助於我更多地理解dotcloud平臺。我現在已經以更「快速的」方式實現了我的配置的新變體。它現在使用python v2.7,並且已經將zc.buildout添加到requirements.txt文件中。它構建得很漂亮,感覺更乾淨,如果我用paster登錄並啓動它,它仍然有效,但是我仍然會得到相同的uwsgi錯誤。 –

0

我還沒試過一段時間運行Plone。上次我做了(〜1年前),可以用「pip安裝Plone」來安裝它,但它花費了很長時間(因爲IIRC就編譯了Zope和其他東西)並且沒有工作(因爲蛋該項目的化驗不是100%完成)。

假設事情仍然處於這種狀態,我只會在暴露HTTP端口的python-worker服務中使用Plone默認配方(到那時使用buildout)。與普通python服務的主要區別在於python-worker + HTTP解決方案不隨uwsgi提供,因此,您可以運行paster或由Plone統一安裝程序部署的任何內容。

最終的結果將更接近標準的Plone安裝,這很可能是一件好事!

+0

根據您的建議,我應該探索一種解決方案,以更標準的方式在獨立端口上運行Plone,並在其前面使用nginx作爲反向代理。我正在查看nginx.conf文件信息,以查看這是否是最佳路線。 我仍然不知道如何啓動Python工作,但我會開始通過文檔進行更多的挖掘,以便弄清楚。 –

+0

如果我想在/ etc/nginx/sites-enabled/default配置中使用我自己的設置(不是uwsgi)啓動nginx的自定義版本,該怎麼辦?我想覆蓋目前假設uwsgi的默認位置/指令。 –