1

计划 A - 通过 uwsgi 进行克隆

我正在尝试通过 wsgi 在 dotcloud 上部署 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 - 在网络服务器代理的端口上克隆

我现在对 B 计划持开放态度,该计划将使用 Plone 作为在端口上运行的工作人员,然后使用 proxy_pass 为站点提供服务。作为一个额外的好处,“由网络服务器代理的端口上的 Plone”将更接近 Plone 在其他场景中的标准部署方法。

4

3 回答 3

2

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

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

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

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

于 2012-11-14T04:51:18.943 回答
0

我有一段时间没有尝试运行 Plone。上次我这样做(大约 1 年前),可以用“pip install Plone”安装它,但它花了很长时间(因为 IIRC 它已经编译了 Zope 和其他东西)并且没有工作(因为鸡蛋- 项目化不是 100% 完成)。

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

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

于 2012-11-12T21:19:47.507 回答
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

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

点云.yml

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

所以总而言之,我认为它对你不起作用的原因是 wsgi 设置为使用 ~/env virtualenv,并且由于你正在创建自己的 virtualenv,并将代码放在那里,uWSGI 不能找到您的应用程序。因此,如果您更改为使用默认的 virtualenv,它应该可以按计划工作。试试我建议的改变,看看它们是否适合你。

于 2012-11-12T14:29:56.633 回答