如何在 Debian VPS 上通过 virtualenv Python 环境使用 mod_wsgi 和 Apache 运行 Django

介绍

與 Django 應用程式以及一般的 Python 應用程式合作是一個複雜的問題,使用了許多工具,有幾種方法可以達到同一個目標,而且往往沒有任何方法可以做到這一點。

在一个专用服务器上部署 Django 应用程序的最流行的方法之一是使用 Nginx 与 Gunicorn 配对。 这是在 本文中已经详细描述的一种很好的方法。 然而,在使用 Apache 服务的现有网站旁边托管 Django 应用程序是一个非常流行的场景。 我们将试图涵盖快速路径来实现这一特定目标。 请注意,然而,这不是 Django 和 Apache 配对的最终指南,并且这里没有涵盖的配置方面。

本文将提出几个假设:

  • 您已经在 Debian 7.0 或更高版本中设置了您的Dropplet。在不同的Linux发行版之间存在许多差异;因此,为了清晰度,我们将专注于 Debian 服务器
  • 您至少对常见的 Python 工具(如 pip 包管理器和 virtualenv)有点熟悉,用于创建虚拟环境,这些工具在 本文中得到了很好的解释。

前提条件

在安装新包之前,始终是更新系统包和包索引的良好做法。

1apt-get update
2apt-get upgrade

安装Apache

由于本文专注于使用 Apache来服务应用程序,所以服务器本身是必要的。

1apt-get install apache2

安装后不久,Apache已经在运行,您可以通过打开您的Web浏览器并指向服务器IP地址来检查Apache Web服务器是否已正确设置,您应该在屏幕上看到一个简单的 **It works!**页面。

安装 pip 和 virtualenv

要开始在 Web 服务器上使用 Python 和 Django,必须先安装 pipvirtualenvPip 是一个 Python 包管理器,可方便安装 Python 软件包,如 Django 本身,而 virtualenv 允许为 Python 应用程序创建独立的虚拟环境,以便分离不同应用程序所需的库,并避免它们之间的版本冲突。

要做到这一点,执行:

1apt-get install python-pip python-virtualenv

此命令将从 Debian 包库中安装 pipvirtualenv. 您可以通过使用 --version 交换机来验证两种工具的正确安装。

1root@django:~# virtualenv --version
21.7.1.2
3root@django:~# pip --version
4pip 1.1 from /usr/lib/python2.7/dist-packages (python 2.7)
5root@django:~#

使用 virtualenv 创建虚拟环境

Apache安装时,自动创建一个 /var/www 目录,其中设置了默认的 Web 服务器根。

让我们在该目录中创建一个名为sampleapp的新目录,然后输入新的目录:

1cd /var/www
2mkdir sampleapp
3cd sampleapp

然后,让我们使用virtualenv创建一个新的虚拟环境。Python虚拟环境基本上是一个目录,其中Python解释器和pip的本地实例居住。Pip的本地实例在虚拟环境中安装所有包,因此没有安装的包会污染Python的全球安装,而且在运行Django或任何其他库的两个不同的应用程序的假设情况下,没有可能出现包版本冲突。

要创建新的虚拟环境,请输入:

1virtualenv env

其中「env」是虚拟环境的名称 - 它可能是任何其他单词. 该命令的输出应该是这样的:

1root@django:/var/www/sampleapp# virtualenv env
2New python executable in env/bin/python
3Installing distribute.............................................................................................................................................................................................done.
4Installing pip...............done.
5root@django:/var/www/sampleapp#

虚拟环境现在已经准备好了,可以用两种不同的方式使用。

一个方法是直接使用虚拟环境解释器执行命令. 使用这种方法,必须始终记住执行正确的解释器或pip实例,因为有可能运行全系统的。

1root@django:/var/www/sampleapp# env/bin/pip --version
2pip 1.1 from /var/www/sampleapp/env/lib/python2.7/site-packages/pip-1.1-py2.7.egg (python 2.7)
3root@django:/var/www/sampleapp# env/bin/python --version
4Python 2.7.3
5root@django:/var/www/sampleapp#

另一种方法是先 activate 环境,使用

1source env/bin/activate

环境名称将随后作为命令行提前。

1root@django:/var/www/sampleapp# source env/bin/activate
2(env)root@django:/var/www/sampleapp#

所有执行的命令都将使用本地虚拟环境版本。

1(env)root@django:/var/www/sampleapp# pip --version
2pip 1.1 from /var/www/sampleapp/env/lib/python2.7/site-packages/pip-1.1-py2.7.egg (python 2.7)
3(env)root@django:/var/www/sampleapp# python --version
4Python 2.7.3
5(env)root@django:/var/www/sampleapp#

这样工作更容易;但是,在完成工作后,必须使用下面的命令 deactivate 环境。

1deactivate

它会使壳恢复正常。

1(env)root@django:/var/www/sampleapp# deactivate
2root@django:/var/www/sampleapp#

新创建的环境将用于存储所有必要的依赖,包括 Django和相关库。

在虚拟环境中安装 Django

下一个必要步骤是在虚拟环境中安装 Django

1env/bin/pip install django

执行此命令后最后显示的消息应该是这样的

1Successfully installed django
2Cleaning up...

Django现在已安装在虚拟环境中,在整个系统的Python安装中不可用,您可以通过使用两个解释器导入‘django’模块来验证这种行为

1root@django:/var/www/sampleapp# python
2Python 2.7.3 (default, Mar 13 2014, 11:03:55)
3[GCC 4.7.2] on linux2
4Type "help", "copyright", "credits" or "license" for more information.
5>>> import django
6Traceback (most recent call last):
7  File "<stdin>", line 1, in <module>
8ImportError: No module named django
9>>> exit()

使用全系统口译器导入失败,而

1root@django:/var/www/sampleapp# env/bin/python
2Python 2.7.3 (default, Mar 13 2014, 11:03:55)
3[GCC 4.7.2] on linux2
4Type "help", "copyright", "credits" or "license" for more information.
5>>> import django
6>>>

一个在虚拟环境中执行的成功。

创建第一个Django项目

要创建一个简单的,基本的示例项目,我们可以使用‘django-admin.py’脚本如下:

1env/bin/django-admin.py startproject sampleapp .

请注意命令中的后续 . - 没有它,项目将被创建在一个额外的子目录中。执行该命令后,一个新的 sampleapp 目录和 manage.py 脚本将在 /var/www/sampleapp 中创建。

请执行:

1env/bin/python manage.py runserver 0.0.0.0:8000

这将运行连接到端口8000上的所有接口的测试服务器,输出应该是这样的:

1Validating models...
2
30 errors found
4April 08, 2014 - 12:29:31
5Django version 1.6.2, using settings 'sampleapp.settings'
6Starting development server at http://0.0.0.0:8000/
7Quit the server with CONTROL-C.

如果您在浏览器中使用端口 8000 打开您的服务器 IP 地址(该地址应该看起来像 http://<ip address>:8000/),您应该看到 It worked! 示例 Django 页面。

由于 **Django ** 应用程序正常工作,我们可以继续将应用程序与 Apache 配对。

如何为 Apache 安装 mod_wsgi

使用 Apache服务Python应用程序的最简单和推荐的方式是使用 mod_wsgi模块. 它既不安装Python也不安装Apache**,所以我们必须安装一个额外的包。

1apt-get install libapache2-mod-wsgi

下一步将是配置默认 Apache虚拟主机,在文章开始时服务于 **It works!**页面,以服务于我们的 Django应用程序。

在默认虚拟主机中配置 mod_wsgi

在Apache中为任何其他虚拟主机配置 mod_wsgi的想法与这里提出的相同,我们将使用默认的虚拟主机来简化,因为它是已经通过清洁的Apache安装提供的。

nano编辑器中打开默认虚拟主机配置文件

1nano /etc/apache2/sites-enabled/000-default

并在<VirtualHost *:80>下面添加以下三行

1WSGIDaemonProcess sampleapp python-path=/var/www/sampleapp:/var/www/sampleapp/env/lib/python2.7/site-packages
2WSGIProcessGroup sampleapp
3WSGIScriptAlias / /var/www/sampleapp/sampleapp/wsgi.py

第一行引发了一种名为sampleapp的WSGI DAEMON 流程,它将负责服务我们的 Django应用程序。

如果我们使用全球Python安装和全球Django**实例,则不需要python-path指令,但是,使用虚拟环境,就必须指定替代的Python路径,以便 mod_wsgi知道在哪里寻找Python包。

路径必须包含两个目录: Django项目本身的目录 - /var/www/sampleapp - 以及我们虚拟环境中的Python包目录 - /var/www/sampleapp/env/lib/python2.7/site-packages.路径定义中的目录是通过结尾符划分的。

第二行告诉特定的虚拟主机使用先前创建的WSGI大卫,因此,大卫的名称必须匹配这两种。

第三行是最重要的,因为它告诉 Apachemod_wsgi在哪里找到WSGI配置.由 Django提供的 wsgi.py包含用于服务 Django应用程序的WSGI的边缘默认配置,而在这个文件中改变配置并不适用于本文。

这些更改后,需要重新启动 Apache

1service apache2 restart

之后,当您在服务器 IP 地址上打开 Web 浏览器时,没有任何额外的端口,您应该看到相同的 Django页面,而不是我们之前所看到的初始的 **It works!**页面。

这使我们的配置完整。

请注意:使用默认虚拟主机无需额外照顾不是配置生产服务器的建议方式。

进一步阅读

配置 mod_wsgiDjango的主题本身是广阔的. 许多配置方面是应用程序特定的,难以解释或演示,而不使用真实世界的 Django应用程序。

周围最好的资源之一是官方 Django 文档。在DigitalOcean上也有很棒的文章,可以通过使用 Django作为搜索关键字来找到。

Article Submitted by: Mateusz Papiernik
Published At
Categories with 技术
comments powered by Disqus