【问题标题】:Getting Plone running on dotcloud (not using uwsgi)让 Plone 在 dotcloud 上运行(不使用 uwsgi)
【发布时间】:2012-11-11 23:38:37
【问题描述】:

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 应用程序的唯一选择。

Plan B - 在由网络服务器代理的端口上克隆

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

【问题讨论】:

    标签: plone wsgi dotcloud


    【解决方案1】:

    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 对其工作实例进行更改,我的自定义脚本下载的预编译包是否会继续工作。

    【讨论】:

    • 真的很好,感谢您提供此食谱!我认为预编译的包应该可以工作,直到我们将基本图像更新为例如Ubuntu LTS 12;但你应该安全一段时间。 (...“著名的遗言”:-))
    • 基础镜像更新时有警告吗?收到警报会很棒(如果没有,我需要使用兼容脚本来扩展系统,该脚本可以检测基本系统并在它发生变化时发出警告)。
    【解决方案2】:

    几个问题/cmets。

    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 版本后的样子。

    dotcloud.yml

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

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

    【讨论】:

    • 感谢 Ken,这有助于我更多地了解 dotcloud 平台。我现在以更“点云”的方式实现了我的配置的新变体。它现在使用 python v2.7 并且我已将 zc.buildout 添加到 requirements.txt 文件中。它构建得很漂亮,感觉更干净,如果我登录并使用 paste 启动它,它就可以工作,但否则我仍然会遇到相同的 uwsgi 错误。
    【解决方案3】:

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

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

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

    【讨论】:

    • 根据您的建议,我应该探索一种解决方案,在独立端口上以更标准的方式运行 Plone,并在其前面使用 nginx 作为反向代理。我正在查看 nginx.conf 文件信息,看看这是否是最佳路线。我仍然不知道如何启动 python worker,但我会开始深入研究文档以便弄清楚。
    • 如果我想在 /etc/nginx/sites-enabled/default 配置中使用我自己的设置(不是 uwsgi)启动自定义版本的 nginx 怎么办?我想覆盖目前假定为 uwsgi 的默认位置/指令。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-27
    • 1970-01-01
    相关资源
    最近更新 更多