如何在DebianVPS上运行带有mod wsgi的Django和带有virtualenvPython环境的Apache
介绍
使用 Django 应用程序和一般的 Python 应用程序是一件复杂的事情,需要使用许多工具。 有多种方法可以实现相同的目标,而且通常没有单一的方法可以做事。
在专用服务器上将 Django 应用程序部署到 Web 的最流行方法之一是使用 Nginx 和 Gunicorn。 这篇文章已经深入描述了一个很好的方法。 然而,将 Django 应用程序与使用 Apache 服务的现有网站一起托管是一种非常流行的方案。 我们将尝试涵盖实现该特定目标的快速路线。 但是请注意,这不是 Django 和 Apache 配对的权威指南,这里没有涉及到配置方面。
本文将做出几个假设:
- 您已经使用 Debian 7.0 或更高版本设置了您的 droplet。 不同的 Linux 发行版之间有很多差异; 因此,为了清楚起见,我们将专注于 Debian 服务器。
- 你至少对常用的 Python 工具有些熟悉,例如 pip 包管理器和 virtualenv 用于制作虚拟环境。 这些工具在这篇文章中有精彩的解释。
- 您至少对 Django 项目结构有些熟悉,因为本文不打算介绍 Django 本身的使用和配置。
- 您熟悉基本的 Apache 管理,因为本教程将仅介绍服务器本身的简单安装以及将 Django 与 Apache 配对所需的配置更改。
先决条件
在安装新包之前,最好更新系统包和包索引。 为此,请执行:
apt-get update apt-get upgrade
安装 Apache
由于本文重点介绍使用 Apache 为应用程序提供服务,因此服务器本身是必要的。 要安装必要的软件包,请执行:
apt-get install apache2
安装后,Apache 将立即运行。 您可以通过打开 Web 浏览器并将其指向服务器 IP 地址来检查 Apache Web 服务器是否已正确设置。 您应该会在屏幕上看到一个简单的 It works! 页面。
安装 pip 和 virtualenv
要开始在网络服务器上使用 Python 和 Django,必须首先安装 pip 和 virtualenv。 Pip 是一个 Python 包管理器,可以方便地安装 Python 软件包,例如 Django 本身,而 virtualenv 可以为 Python 应用程序创建单独的虚拟环境以按顺序分离不同应用程序所需的库并避免它们之间的版本冲突。
为此,请执行:
apt-get install python-pip python-virtualenv
此命令将从 Debian 软件包存储库安装 pip 和 virtualenv。 您可以通过使用 --version
开关运行它们来验证这两个工具是否已正确安装。
root@django:~# virtualenv --version 1.7.1.2 root@django:~# pip --version pip 1.1 from /usr/lib/python2.7/dist-packages (python 2.7) root@django:~#
使用 virtualenv 创建虚拟环境
在 Apache 安装时,会自动创建一个 /var/www
目录,其中设置了默认的 Web 服务器根目录。 我们将把新的 Django 应用程序及其所有依赖项放在那里。
让我们在该目录中创建一个名为 sampleapp
的新目录并进入新目录:
cd /var/www mkdir sampleapp cd sampleapp
然后让我们使用 virtualenv
创建一个新的虚拟环境。 Python 虚拟环境基本上是 Python 解释器和 pip
的本地实例所在的目录。 pip
的本地实例将所有包安装在虚拟环境中。 这样,没有安装的包会污染全局 Python 安装,并且在两个应用程序运行两个不同版本的 Django 或任何其他库的假设场景中,也不存在包版本冲突的可能性。
要创建新的虚拟环境,请输入:
virtualenv env
其中 env
是虚拟环境名称 - 它可以是任何其他词。 此命令的输出应如下所示:
root@django:/var/www/sampleapp# virtualenv env New python executable in env/bin/python Installing distribute.............................................................................................................................................................................................done. Installing pip...............done. root@django:/var/www/sampleapp#
虚拟环境现已准备就绪,可以以两种不同的方式使用。
一种方法是直接使用虚拟环境解释器运行命令。 使用这种方法,必须始终记住执行正确的解释器或 pip
实例,因为有可能运行系统范围的解释器。
root@django:/var/www/sampleapp# env/bin/pip --version pip 1.1 from /var/www/sampleapp/env/lib/python2.7/site-packages/pip-1.1-py2.7.egg (python 2.7) root@django:/var/www/sampleapp# env/bin/python --version Python 2.7.3 root@django:/var/www/sampleapp#
另一种方法是首先激活环境,使用
source env/bin/activate
然后环境名称将被添加到命令行之前
root@django:/var/www/sampleapp# source env/bin/activate (env)root@django:/var/www/sampleapp#
并且执行的所有命令都将使用本地虚拟环境版本
(env)root@django:/var/www/sampleapp# pip --version pip 1.1 from /var/www/sampleapp/env/lib/python2.7/site-packages/pip-1.1-py2.7.egg (python 2.7) (env)root@django:/var/www/sampleapp# python --version Python 2.7.3 (env)root@django:/var/www/sampleapp#
这样工作更容易; 但是需要在工作完成后使用以下命令 停用 环境
deactivate
它将使外壳恢复正常
(env)root@django:/var/www/sampleapp# deactivate root@django:/var/www/sampleapp#
新创建的环境将用于存储所有必要的依赖项,包括 Django 和相关库。 稍后 Apache 和 mod_wsgi 也将使用它来使用正确的依赖关系为应用程序提供服务。
在虚拟环境中安装 Django
下一个必要步骤是在虚拟环境中安装 Django。 让我们在不预先激活环境的情况下使用:
env/bin/pip install django
执行此命令后显示的最后一条消息应如下所示
Successfully installed django Cleaning up...
Django 现在安装在虚拟环境中,在系统范围的 Python 安装中不可用。 您可以通过使用两个解释器导入 django
模块来验证该行为
root@django:/var/www/sampleapp# python Python 2.7.3 (default, Mar 13 2014, 11:03:55) [GCC 4.7.2] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import django Traceback (most recent call last): File "<stdin>", line 1, in <module> ImportError: No module named django >>> exit()
使用系统范围的解释器导入失败,而
root@django:/var/www/sampleapp# env/bin/python Python 2.7.3 (default, Mar 13 2014, 11:03:55) [GCC 4.7.2] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import django >>>
在虚拟环境中执行的那个成功了。
创建第一个 Django 项目
要创建一个简单的基本示例项目,我们可以使用 django-admin.py
脚本,如下所示
env/bin/django-admin.py startproject sampleapp .
请注意命令中的尾随 .
- 如果没有它,项目将在附加的子目录中创建。 执行该命令后,将在 /var/www/sampleapp
中创建一个新的 sampleapp
目录和 manage.py
脚本。 manage.py
脚本用于执行此特定项目的 Django 命令。 manage.py
的一种可能用途是运行测试服务器实例以验证一切是否按预期工作。
请执行:
env/bin/python manage.py runserver 0.0.0.0:8000
这将运行一个绑定到端口 8000 上所有接口的测试服务器。 输出应如下所示:
Validating models... 0 errors found April 08, 2014 - 12:29:31 Django version 1.6.2, using settings 'sampleapp.settings' Starting development server at http://0.0.0.0:8000/ Quit the server with CONTROL-C.
如果您在浏览器中使用端口 8000 打开服务器 IP 地址(地址应类似于 http://<ip address>:8000/
),您应该会看到 It works! 示例 Django 页面。 这是我们将努力使用 Apache Web 服务器而不是内置的 Django 开发服务器的结果。
由于 Django 应用程序工作正常,我们可以继续将应用程序与 Apache 配对。
为 Apache 安装 mod_wsgi
使用 Apache 为 Python 应用程序提供服务的最简单也是推荐的方法是使用 mod_wsgi 模块。 Python 和 Apache 都没有默认安装它,所以我们必须安装一个额外的包。
apt-get install libapache2-mod-wsgi
下一步将配置默认的 Apache 虚拟主机,它在文章开头提供了 It works! 页面来服务我们的 Django 应用程序。
在默认虚拟主机中配置 mod_wsgi
为 Apache 中的任何其他虚拟主机配置 mod_wsgi 背后的想法与此处介绍的想法相同。 为简单起见,我们将使用默认虚拟主机,因为它已经由干净的 Apache 安装提供。
在nano
编辑器中打开默认虚拟主机配置文件
nano /etc/apache2/sites-enabled/000-default
并在 <VirtualHost *:80>
正下方添加以下三行
WSGIDaemonProcess sampleapp python-path=/var/www/sampleapp:/var/www/sampleapp/env/lib/python2.7/site-packages WSGIProcessGroup sampleapp WSGIScriptAlias / /var/www/sampleapp/sampleapp/wsgi.py
第一行生成一个名为 sampleapp
的 WSGI 守护进程,它将负责为我们的 Django 应用程序提供服务。 守护进程名称基本上可以是任何名称,但最好在此处使用描述性名称,例如应用程序名称。
如果我们使用全局 Python 安装和全局 Django 实例,则不需要 python-path
指令。 但是,使用虚拟环境必须指定备用 Python 路径,以便 mod_wsgi 知道在哪里查找 Python 包。
该路径必须包含两个目录:Django 项目本身的目录 - /var/www/sampleapp
- 以及该项目的虚拟环境中 Python 包的目录 - /var/www/sampleapp/env/lib/python2.7/site-packages
。 路径定义中的目录使用冒号分隔。
第二行告诉特定虚拟主机使用预先创建的 WSGI 守护程序,因此,守护程序名称必须在这两者之间匹配。 我们在两行中都使用了 sampleapp
。
第三行是最重要的,因为它告诉 Apache 和 mod_wsgi 在哪里可以找到 WSGI 配置。 Django 提供的 wsgi.py
包含 WSGI 的准系统默认配置,用于为 Django 应用程序提供服务,工作正常,更改此文件中的配置超出本文范围.
进行这些更改后,需要重新启动 Apache
service apache2 restart
之后,在您的服务器 IP 地址上打开 Web 浏览器时,没有任何其他端口,您应该会看到与以前相同的 Django 页面,而不是最初的 It works! 页面,我们有之前看到的。
这样我们的配置就完成了。
请注意:不推荐使用默认虚拟主机而不是额外注意配置生产服务器。 它用于演示目的。
进一步阅读
配置 mod_wsgi 和 Django 本身的话题非常广泛。 许多配置方面是特定于应用程序的,如果不使用真实世界的 Django 应用程序,很难解释或演示。 本指南不是使用 Apache 部署 Django 应用程序的完整指南,而是关于如何开始的快速入门指南。
最好的资源之一是官方的 Django 文档。 使用 Django 作为搜索关键字可以找到有关 DigitalOcean 的精彩文章。