重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
WSGI,即Web Server Gateway Interface,Web服务器网关接口,是一个Web服务器的Python标准,在PEP 333标准中定义,并被许多框架实现。Python是一门传统的编程语言,所以WSGI提供了一种让Web服务器服务于Python应用程序的方式,使得 Python应用程序可以与Web服务器进行交互。
Apache是最流行的Web服务器之一,mod_wsgi是Apache的模块之一,可用于把Python应用程序托管到Apache服务器上。这种方法是部署Django应用相对简单的方法。
在Ubuntu 14.04版,默认安装中包含了Python。下面开始利用mod_wsgi部署Django应用。
二、创建Django应用程序在本节中,我们要安装所需的软件包,并构建一个Hello World的Django应用程序,并通过mod_wsgi模块提供服务。这里假设你已经登录到新创建的虚拟机。
1、创建一个Ubuntu虚拟机创建一个操作系统为Ubuntu 14.04 x64的Linux虚拟机,物理机也可以。步骤略。
2、安装Python包管理器使用Ubuntu的包管理器apt-get,安装Python包管理器。注意,使用前需先对Ubuntu的包管理器进行更新。
#sudoapt-getupdate
Pip是Python语言的包管理器,它可以帮助我们安装、修改、卸载Python包。要安装pip非常简单,执行命令:
#sudoapt-getinstallpython-pip
apt-get工具会自带安装pip的最新稳定版。但是,如果你想安装指定版本的pip,可以考虑从源码安装。
参考:https://pip.pypa.io/en/latest/installing.html
还可以使用easy_install来替代pip,它有相似的功能。
要从头创建项目,需要先安装Django软件包。执行命令:
#sudopipinstallDjango
要想指定Django的安装版本,比如1.5.5版,可以这样:
#sudopipinstallDjango==1.5.5
当然,你仍然可以使用Ubuntu的包管理器apt-get来安装Django,但这可能安装的不是最新稳定版的Django。
4、安装其他依赖如果要部署一个已有的你大爷项目,可以递归运行pip来安装项目的依赖。通常,在项目的源码目录存在一个名为requirements.txt的配置文件,它包含了运行项目所需的依赖包:
#pipinstall-rrequirements.txt
如果项目还包含了其他的Python项目,那么可能会有不同版本的Python包会造成彼此干扰。解决办法是使用virtualenv,它可以让每个Python项目在自己的虚拟Python环境中运行,彼此间是隔离的。
这里有一个virtualenv的教程:https://www.digitalocean.com/community/tutorials/common-python-tools-using-virtualenv-installing-with-pip-and-managing-packages
如果正在开发Django应用程序,你可能想创建或更新配置文件,可以执行命令:
#pipfreeze>requirements.txt
pip freeze命令会打印出当前环境中已经安装了的Python包,大于符号“>”会把命令的执行结果输出到指定的requirements.txt配置文件中。
5、创建Hello World应用程序要创建名为helloworld的Django应用,运行命令:
#django-admin.pystartprojecthelloworld
要注意,会创建一个名为helloworld的新目录。要运行此项目,可以这样:
#cdhelloworld/ #django-admin.pystartapphelloapp
在浏览器中可以看到Hello World的输出。下面,接着在项目中添加settings.py,找到INSTALLED_APPS处,添加以下内容:
INSTALLED_APPS=( \'django.contrib.auth\', \'django.contrib.contenttypes\', \'django.contrib.sessions\', \'django.contrib.sites\', \'django.contrib.messages\', \'django.contrib.staticfiles\', \'helloapp\' )
接着,在urls.py中添加URL路由模式,内容如下:
urlpatterns=patterns(\'\', #Examples: #url(r\'^$\',\'helloworld.views.home\',name=\'home\'), url(r\'^\',\'helloapp.views.home_view\'), )
它会指示Django在views.py中寻找home_view函数。因此,修改views.py的内容如下:
fromdjango.httpimportHttpResponse defhome_view(request): returnHttpResponse(\'HelloWorld\')
下面,我们可以运行开发服务器了:
#pythonmanage.pyrunserver
在GitHub上有本项目的源码:https://github.com/sdaityari/django-hello-world
三、使用Apache和mod_wsgi模块运行Django应用Django项目的目录结构后面有说明,下面需要安装并配置Apache服务器。
1、安装Apache2使用apt-get命令完成Apache2的安装。
#sudoapt-getinstallapache22、安装mod_wsgi模块
仍然可以使用apt-get命令安装mod_wsgi模块。
#sudoapt-getinstalllibapache2-mod-wsgi
要注意,如果使用的是Python3,那么命令应该是这样的:
#sudoapt-getinstalllibapache2-mod-wsgi-py3
详细的安装过程可以参考:
https://www.digitalocean.com/community/tutorials/installing-mod_wsgi-on-ubuntu-12-04
要使得Django应用程序能通过mod_wsgi模块提供服务,我们还需要编写WSGI脚本,用此脚本来完成Apache服务器和Django应用之间的连接。Django应用的目录结构如下所示:
mysite/ manage.py mysite/ __init__.py settings.py urls.py myapp/ models.py views.py
我们需要做一点修改,让mysite目录包含三个文件:
mysite/ manage.py mysite/ __init__.py settings.py urls.py apache/ __init__.py override.py wsgi.py myapp/ models.py views.py
这样的话,逻辑非比较清晰。
注意,如果使用了如Git之类的源码控制工具,那么可以把apache目录添加到忽略列表。
4、创建WSGI脚本空文件init.py会告诉Python,把此目录当成是包来对待。override.py会导入所有的设置,并覆盖任何用于生产状态的设置。
比如生产状态的数据库设置和Debug设置可能会与开发状态有所不同,要在源码中区别开来,需要这样:
#override.py frommysite.settingsimport* DEBUG=True ALLOWED_HOSTS=[\'www.mydomain.com\',\'mydomain.com\']
最后,wsgi.py文件包含了WSGI的设置。假定根目录是/home/myuser/:
#wsgi.py importos,sys #CalculatethepathbasedonthelocationoftheWSGIscript. apache_configuration=os.path.dirname(__file__) project=os.path.dirname(apache_configuration) workspace=os.path.dirname(project) sys.path.append(workspace) sys.path.append(project) #Addthepathto3rdpartydjangoapplicationandtodjangoitself. sys.path.append(\'/home/myuser\') os.environ[\'DJANGO_SETTINGS_MODULE\']=\'mysite.apache.override\' importdjango.core.handlers.wsgi application=django.core.handlers.wsgi.WSGIHandler()
还需要为Apache服务器的默认用户www-data分配根目录的所有权,以便于Apache服务器有权限访问此目录:
#sudochownwww-data:www-dataapache/5、配置Apache
要配置Apache使用刚才的WSGI脚本,需要编辑配置文件:
#sudovi/etc/apache2/sites-enabled/000-default.conf
添加以下内容:
第一行为Django Web目录添加一个mypath别名, 这样项目就可以通过URL:http://www.mydomain.com/mypath/进行访问。
如果想直接使用域名访问,比如:http://www.mydomain.com/,那么可以直接指向Django应用。代码块表示访问指定的目录有所有权限。
如果想自定义robots.txt和图标,可以添加下面的内容:
Alias/robots.txt/home/myuser/mysite/robots.txt Alias/favicon.ico/home/myuser/mysite/favicon.ico
要提供静态文件和媒体文件服务,还需要分别这样配置:
Alias/media//home/myuser/mysite/media/ Alias/static//home/myuser/mysite/static/
最后,保存配置文件并重启Apache:
#sudoserviceapache2restart
注意Apache的版本:对于Apache 2.4之前的版本,上面的配置略有不同。