让Plone在dotcloud上运行(不使用uwsgi)

时间:2012-11-11 23:38:38

标签: plone wsgi dotcloud

通过uwsgi计划A - Plone

我正在尝试通过dotcloud上的wsgi部署plone。

到目前为止,我已经安装了dotcloud工具并创建了一个git存储库,可以成功地将所有部分部署到dotcloud。我使用github存储所有相关配置。如果你想尝试一下,这些是我目前用来部署的命令:

git clone github@github.com/pigeonflight/stack-python-plone
cd stack-python-plone
dotcloud create plone
dotcloud push

部署之后,我能够确认(在“sshing”到我的dotcloud实例之后)我能够使用paster使用以下命令启动堆栈:

cd current
bin/paster serve production.ini

但是当我尝试在其url访问应用程序时,我收到一个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

我现在对Plan B开放,它将Plone用作在端口上运行的worker,然后使用proxy_pass来为该站点提供服务。另外一个好处是,“在网络服务器代理的端口上的Plone”将更接近Plone在其他场景中的标准部署方法。

3 个答案:

答案 0 :(得分:2)

Ken Cochrane和jpetazzo的答案都有助于指导我找到解决方案。我决定放弃wsgi。该解决方案需要深入挖掘dotcloud python服务和随附的nginx webserver。我找到了一种方法将指令传递给nginx,它将配置一个proxy_pass。

生成的堆栈现在托管在:https://github.com/pigeonflight/stack-python-plone

当我意识到我可以通过创建 plone-uwsgi.conf 文件将命令传递给nginx时,关键的突破来了,为了我的目的,我正在“劫持”一个打算通过的文件添加wsgi配置并将其用于不同的东西。 nginx服务器配置为在nginx.conf文件中的其他关键指令(例如location / {}指令)之后读取* uwsgi.conf文件。这为我提供了一种覆盖(不需要的)wsgi代码的理想方式。 case我使用该文件“注入”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

可能出现的问题: 我不知道如果dotcloud对其工作实例进行了更改,我的自定义脚本下载的预编译包是否会继续工作。

答案 1 :(得分:0)

几个问题/评论。

  1. 在你的getplone.sh脚本中,你正在创建一个新的virtualenv?你为什么做这个?在〜/ env下已经为你创建了一个virtualenv(/ home / dotcloud / env是完整路径)。

    如果你想在其中安装东西,你可以使用〜/ 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

    这是添加python版本后你的dotcloud.yml的样子。

  3. <强> dotcloud.yml

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

    总而言之,我认为它不适合你的原因是,wsgi设置为使用〜/ env virtualenv,因为你正在创建自己的virtualenv,并将你的代码放在那里, uWSGI无法找到您的申请。因此,如果您更改为使用默认的virtualenv,它应该按计划工作。尝试我建议的更改,看看它们是否适合你。

答案 2 :(得分:0)

我还没试过运行Plone一段时间。上次我做了(〜1年前),可以用&#34; pip install Plone&#34;安装它。但它花了很长时间(因为IIRC直到编译Zope和其他东西)并且没有工作(因为项目的鸡蛋化没有100%完成)。

假设事情仍然处于该状态,我将在暴露HTTP端口的python-worker服务中使用Plone默认配方(当时使用buildout)。与普通python服务的主要区别在于python-worker + HTTP解决方案没有附带uwsgi,因此,您可以运行paster或Plone统一安装程序部署的任何内容

最终结果将更接近标准的Plone安装,这可能是一件好事!