通过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在其他场景中的标准部署方法。
答案 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)
几个问题/评论。
在你的getplone.sh脚本中,你正在创建一个新的virtualenv?你为什么做这个?在〜/ env下已经为你创建了一个virtualenv(/ home / dotcloud / env是完整路径)。
如果你想在其中安装东西,你可以使用〜/ env / bin / pip,甚至可以更好地将你的需求放在requirements.txt
文件中,我发现你现在已经空了。
有关dotCloud上代码依赖关系的更多信息,请参阅以下链接:http://docs.dotcloud.com/0.9/services/python/#code-dependencies
如果你想要python 2.7,你应该在dotcloud.yml
中进行设置。有关更多信息,请参阅此链接。 http://docs.dotcloud.com/0.9/services/python/#python-versions
这是添加python版本后你的dotcloud.yml的样子。
<强> 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安装,这可能是一件好事!