在Red Hat OpenShift平台部署Django应用

 Jan. 26, 2012, 2:01 a.m.   6 comments    Django OPENSHIFT Red Hat 开源 云计算

OpenShift云服务是Red Hat公司推出的一个面向开源开发者的PaaS(Platform-as-a-Service,平台即服务),2011年的“软件自由日”时,Red Hat公司曾在北邮做过OpenShift Express(OpenShift的免费版本)的校园宣讲,使我对这个产品产生了很大兴趣,于是打算在OpenShift平台上搭建一个应用试试。

OpenShift有很大的灵活性,可以支持Java,Ruby,PHP,Python的多种开发框架,因为我目前只会使用Python,所以我选择在OpenShift上搭建一个Django应用。

注册&登入OpenShift

首先,需要到OpenShift网站注册一个帐号https://openshift.redhat.com/

然后登入OpenShift,选择Express版本

安装rhc client tools

在Linux上,需要git,ruby 1.8以上版本,以及rubygems

然后执行命令: su -c 'gem install rhc'

其他平台上的安装方法详见https://openshift.redhat.com/app/express#quickstart

创建一个域名

直接执行命令:

rhc-create-domain -n mydomain -l rhlogin

其中mydomain是你想要创建的域名,以后你所创建的每一个应用将会有这样的URL http://appname-mydomain.rhcloud.comrhlogin则是你的OpenShift登入邮箱

创建一个应用

这里有两种方法可以创建一个应用

一是命令行的方法,执行命令:

rhc-create-app -a appname -t apptype

appname是你创建的应用名称,apptype是你创建的应用类型,我这里想要创建的是Django应用,但是OpenShift并不直接提供Django应用的支持,因此我选择通过wsgi运行我的Django应用,所以我执行的命令就是:

rhc-create-app -a appname -t wsgi-3.2

UPDATE:OpenShift现在创建django应用的类型不再是wsgi-3.2,而是python-2.6,其他仍然保持不变,即:

rhc-create-app -a appname -t python-2.6

然后可以看到在当前目录下生成了一个以appname命名的应用目录,说明应用创建成功。

另一种方法,在OpenShift的控制板直接创建应用,然后根据提供的git地址使用git clone在本地创建应用目录。

应用的提交

OpenShift使用git提交和管理应用,因此提交应用非常方便,只需执行命令:

git commit -a -m "Some commit message"

git push

即可

Django应用的部署

关于Django应用的部署可以参照github上的示例django-example

两种方法:

如果直接使用示例程序开始构建,执行命令:

git remote add upstream -m master git://github.com/openshift/django-example.git

git pull -s recursive -X theirs upstream master

修改成自己的应用,然后提交:

git push

如果你想要将已有的Django应用部署到OpenShift上,只需将整个Django应用放在wsgi目录下,然后编辑wsgi目录下的application文件:

#!/usr/bin/env python

import os
import sys

os.environ['DJANGO_SETTINGS_MODULE'] = 'openshift.settings';
sys.path.append(os.path.join(os.environ['OPENSHIFT_REPO_DIR'], 'wsgi', 'openshift'))
virtenv = os.environ['APPDIR'] + '/virtenv/'
os.environ['PYTHON_EGG_CACHE'] = os.path.join(virtenv, 'lib/python2.6/site-packages')
virtualenv = os.path.join(virtenv, 'bin/activate_this.py')
try:
    execfile(virtualenv, dict(__file__=virtualenv))
except:
    pass

import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()

其中的'openshift'是需要修改成你的Django应用的名称的 同时,需要在你的Django应用的settings.py文件前加入以下内容:

# Django settings for openshift project.
import os

# a setting to determine whether we are running on OpenShift
ON_OPENSHIFT = False
if os.environ.has_key('OPENSHIFT_REPO_DIR'):
    ON_OPENSHIFT = True

PROJECT_DIR = os.path.dirname(os.path.realpath(__file__))

此外,整个OpenShift应用的setup.py也需要修改,将 install_requires=['Django>=1.3'], 这一行取消注释,然后提交。

这时你的Django应用已经可以通过http://appname-mydomain.rhcloud.com/访问了

Django应用中静态文件的问题

在我们的应用中经常会使用到静态文件,比如CSS、图片等等,一般Django应用的静态文件的目录是在settings.py中配置的,但是OpenShift使用了不一样的方式,所有的静态文件都将被放置在wsgi/static目录下,然后通过编辑wsgi/.htaccess文件定义url rewrite规则:

RewriteEngine On  
RewriteRule ^application/(.+)$ /static/$1 [L]

这样就可以通过诸如http://appname-mydomain.rhcloud.com/static/style.css的方式引用wsgi/static目录下的静态文件了

更多OpenShift相关文档


Qiulin

Qiulin Feb. 20, 2012, 10:11 p.m. Reply

在openshift上,django创建app的方法是一样的吗?怎么使用mysql?初学者,不太明白,谢谢了

Chon

Chon Feb. 20, 2012, 10:16 p.m. Reply

目前创建django app只有这一种方式,不过最近openshift把wsgi名称改成了python-2.6,其他仍然不变
至于mysql...我是在settings.py里定义的外部服务器,没有用openshift自己提供的mysql,就不太了解了,可以查一下openshift的文档


菜鸟

菜鸟 Feb. 28, 2012, 12:42 p.m. Reply

你好,请教个问题:openshift如何绑定域名?


Wizmann

Wizmann June 10, 2012, 8:45 a.m. Reply

I just come to ask how can I use the pyCrypto lib in my Django app. Or there is a different way for me to call the MD5 function in Django?

hon

hon June 10, 2012, 10:16 a.m. Reply

Just put pyCrypto files in your django directory, then import them.


yobyzal

yobyzal July 5, 2012, 2:43 p.m. Reply

最后的RewriteRule写法有问题,应该把其中的"application"换成"/static"

RewriteRule ^/static/(.+)$ /static/$1 [L]