利用mod_wsgi部署Django应用

利用mod_wsgi部署Django应用

作者:chszs,版权所有,未经同意,不得转载。博主主页:http://blog.csdn.net/chszs

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之前的版本,上面的配置略有不同。

版权声明:本文为博主chszs的原创文章,未经博主允许不得转载。

时间: 2025-01-05 18:24:11

利用mod_wsgi部署Django应用的相关文章

apache mod_wsgi 部署django项目后连接不上mysql

问题描述 做好的django项目,使用python manage.py runserver 可以正常work. 然而当将项目使用mod_wsgi部署到apache上之后却不能连接mysql.一直报错:"Internal Server Error",查看日志信息,除了"Can't connect mysql"还是连不上mysql. 追踪问题 django测试 分别在debug模式以及debug off模式下运行项目,无任何异常,足以证明项目自身配置没任何错误. Pyt

Ubuntu上用mod_wsgi部署Django出现的一些问题

1 编码问题 直接运行Django没问题,但通过Apache+mod_wsgi上传中文字符的文件时出错: UnicodeEncodeError: 'ascii' codec can't encode characters in position... 解决办法:修改 /etc/apache2/envvars ,然后重启Apache即可 export LANG='zh_CH.UTF-8' export LANG_ALL='zh_CH.UTF-8' 2 权限问题 PermissionError: [

通过Nginx部署Django(基于ubuntu)

Django的部署可以有很多方式,采用nginx+uwsgi的方式是其中比较常见的一种方式. 在这种方式中,我们的通常做法是,将nginx作为服务器最前端,它将接收WEB的所有请求,统一管理请求.nginx把所有静态请求自己来处理(这是NGINX的强项).然后,NGINX将所有非静态请求通过uwsgi传递给Django,由Django来进行处理,从而完成一次WEB请求. 可见,uwsgi的作用就类似一个桥接器.起到桥梁的作用. Linux的强项是用来做服务器,所以,下面的整个部署过程我们选择在U

centos7下采用Nginx+uwsgi来部署django

之前写过采用Apache和mod_wsgi部署django,因为项目需要,并且想比较一下Nginx和Apache的性能,尝试采用Nginx+uwsgi的模式来部署django. 1.安装uwsgi以及Nginx 1 pip install uwsgi --目前的版本为2.0.15 2 yum install epel-release 3 yum install nginx* --目前的版本为1.10.2 2.测试 1 # test.py 2 def application(env, start_

Python 关于在ubuntu部署Django项目

Django的部署可以有很多方式,采用nginx+uwsgi的方式是其中比较常见的一种方式. 在这种方式中,我们的通常做法是,将nginx作为服务器最前端,它将接收WEB的所有请求,统一管理请求.nginx把所有静态请求自己来处理(这是NGINX的强项).然后,NGINX将所有非静态请求通过uwsgi传递给Django,由Django来进行处理,从而完成一次WEB请求. 可见,uwsgi的作用就类似一个桥接器.起到桥梁的作用. Linux的强项是用来做服务器,所以,下面的整个部署过程我们选择在U

linux中部署django项目

通过Nginx部署Django(基于ubuntu) Django的部署可以有很多方式,采用nginx+uwsgi的方式是其中比较常见的一种方式. 在这种方式中,我们的通常做法是,将nginx作为服务器最前端,它将接收WEB的所有请求,统一管理请求.nginx把所有静态请求自己来处理(这是NGINX的强项).然后,NGINX将所有非静态请求通过uwsgi传递给Django,由Django来进行处理,从而完成一次WEB请求. 可见,uwsgi的作用就类似一个桥接器.起到桥梁的作用. Linux的强项

Nginx+Gunicorn+virtualenv+supervisord+Postgresql部署Django应用

关于Django应用部署 Django是一个高效.多功能和动态地进化的Web应用开发框架.目前比较流行的部署.运行Django应用方式是基于Apache的mod_wsgi模块,但更加高效.弹性,同时又更加复杂的方式是使用以下工具来部署实施:Nginx.Gunicorn.virtualenv.supervisord.Postgresql.以下详细介绍如何结合这些工具来部署Django应用到Linux上. 准备工作 需要有一台拥有root权限的Linux服务器,这是部署应用的平台.本文采用CentO

Apache2.4部署django出现403 Forbidden错误解决办法

前言:Apache部署django出现403 Forbidden错误最好要结合apache中的错误日志来观察出现何种错误导致出现403错误 下午百度了一下午没找到解决办法,试了n种方法,简直坑爹! 比如网页出现最多的解决办法是: <Directory E:/wamp/Apache24/www(你的工程路径)>           Order allow,deny           Allow from all       </Directory> 可惜这样改了后还是报403,最后

Apache部署django

1.环境:windows7 2.版本:Python 2.7.8 Django 1.6.5 Apache 2.2     http://httpd.apache.org/(download-binaries-win32下) mod_wsgi.so   http://www.lfd.uci.edu/~gohlke/pythonlibs/#mod_wsgi 3.下载并安装python,Django,Apache 注意事项:1.请全部安装32位的,因为Apache官方没有64位版本,你也别想找民间的64