阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

利用mod_wsgi部署Django应用

142次阅读
没有评论

共计 5523 个字符,预计需要花费 14 分钟才能阅读完成。

Django 是一个免费、开源、基于 Python 的 Web 开发框架。Django 框架遵循 MVC 架构模式,以快速创建 Web 应用为目标。目前,Django 框架已成为创建 Web 应用的主要选择之一。比如流行的 Instagram 服务、Bitbucket 服务和 Pinterest 服务等都使用了 Django 框架开发。

在开发模式下,Django 自带了一个开发服务器,它仅用于测试目的。一旦完成了 Web 应用的开发,就应该部署到真正的生产服务器上。如果开发者还没部署过真正的 Web 应用,那么可以参考本文。本文提供了利用 mod_wsgi 部署 Django 应用的详细步骤。

一、mod_wsgi

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 的包管理器进行更新。

# sudo apt-get update

Pip 是 Python 语言的包管理器,它可以帮助我们安装、修改、卸载 Python 包。要安装 pip 非常简单,执行命令:

# sudo apt-get install python-pip

apt-get 工具会自带安装 pip 的最新稳定版。但是,如果你想安装指定版本的 pip,可以考虑从源码安装。
参考:https://pip.pypa.io/en/latest/installing.html
还可以使用 easy_install 来替代 pip,它有相似的功能。

3、安装 Django

要从头创建项目,需要先安装 Django 软件包。执行命令:

# sudo pip install Django

要想指定 Django 的安装版本,比如 1.5.5 版,可以这样:

# sudo pip install Django==1.5.5

当然,你仍然可以使用 Ubuntu 的包管理器 apt-get 来安装 Django,但这可能安装的不是最新稳定版的 Django。

4、安装其他依赖

如果要部署一个已有的项目,可以递归运行 pip 来安装项目的依赖。通常,在项目的源码目录存在一个名为 requirements.txt 的配置文件,它包含了运行项目所需的依赖包:

# pip install -r requirements.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 应用程序,你可能想创建或更新配置文件,可以执行命令:

# pip freeze > requirements.txt

pip freeze 命令会打印出当前环境中已经安装了的 Python 包,大于符号“>”会把命令的执行结果输出到指定的 requirements.txt 配置文件中。

5、创建 Hello World 应用程序

要创建名为 helloworld 的 Django 应用,运行命令:

# django-admin.py startproject helloworld

要注意,会创建一个名为 helloworld 的新目录。要运行此项目,可以这样:

# cd helloworld/
# django-admin.py startapp helloapp

在浏览器中可以看到 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 的内容如下:

from django.http import HttpResponse

def home_view(request):
    return HttpResponse('Hello World')

下面,我们可以运行开发服务器了:

# python manage.py runserver

在 GitHub 上有本项目的源码:https://github.com/sdaityari/django-hello-world

三、使用 Apache 和 mod_wsgi 模块运行 Django 应用

Django 项目的目录结构后面有说明,下面需要安装并配置 Apache 服务器。

1、安装 Apache2

使用 apt-get 命令完成 Apache2 的安装。

# sudo apt-get install apache2

2、安装 mod_wsgi 模块

仍然可以使用 apt-get 命令安装 mod_wsgi 模块。

# sudo apt-get install libapache2-mod-wsgi

要注意,如果使用的是 Python3,那么命令应该是这样的:

# sudo apt-get install libapache2-mod-wsgi-py3

详细的安装过程可以参考:
https://www.digitalocean.com/community/tutorials/installing-mod_wsgi-on-ubuntu-12-04

3、修改目录结构

要使得 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

from mysite.settings import *

DEBUG = True
ALLOWED_HOSTS = ['www.mydomain.com', 'mydomain.com']

最后,wsgi.py 文件包含了 WSGI 的设置。假定根目录是 /home/myuser/:

#wsgi.py
import os, sys
# Calculate the path based on the location of the WSGI script.
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)

# Add the path to 3rd party django application and to django itself.
sys.path.append('/home/myuser')
os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.apache.override'
import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()

还需要为 Apache 服务器的默认用户 www-data 分配根目录的所有权,以便于 Apache 服务器有权限访问此目录:

# sudo chown www-data:www-data apache/

5、配置 Apache

要配置 Apache 使用刚才的 WSGI 脚本,需要编辑配置文件:

# sudo vi /etc/apache2/sites-enabled/000-default.conf

添加以下内容:

<VirtualHost *:80>
    WSGIScriptAlias /mypath/ /home/myuser/mysite/apache/wsgi.py
    <Directory "/home/myuser/mysite/apache/">
      Require all granted
    </Directory>
</VirtualHost>

第一行为 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/

<Directory /path/to/mysite.com/static>
Require all granted
</Directory>

<Directory /path/to/mysite.com/media>
Require all granted
</Directory>

最后,保存配置文件并重启 Apache:

# sudo service apache2 restart

注意 Apache 的版本:对于 Apache 2.4 之前的版本,上面的配置略有不同。

Django1.8 返回 json 字符串和接收 post 的 json 字符串内容  http://www.linuxidc.com/Linux/2015-07/120226.htm

如何使用 Docker 组件开发 Django 项目?http://www.linuxidc.com/Linux/2015-07/119961.htm

Ubuntu Server 12.04 安装 Nginx+uWSGI+Django 环境 http://www.linuxidc.com/Linux/2012-05/60639.htm 

Django+Nginx+uWSGI 部署 http://www.linuxidc.com/Linux/2013-02/79862.htm 

Django 实战教程 http://www.linuxidc.com/Linux/2013-09/90277.htm 

Django Python MySQL Linux 开发环境搭建 http://www.linuxidc.com/Linux/2013-09/90638.htm 

Django 的详细介绍:请点这里
Django 的下载地址:请点这里

本文永久更新链接地址:http://www.linuxidc.com/Linux/2015-09/123345.htm

正文完
星哥说事-微信公众号
post-qrcode
 
星锅
版权声明:本站原创文章,由 星锅 2022-01-21发表,共计5523字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中