推荐一个 Django 项目在 Linux 上运行的地方

Posted

技术标签:

【中文标题】推荐一个 Django 项目在 Linux 上运行的地方【英文标题】:Recommended place for a Django project to live on Linux 【发布时间】:2012-11-29 02:33:19 【问题描述】:

我正在将我的第一个 Django 项目上传到 Linux 服务器,我应该将我的项目放在文件系统中吗?

对于 php 或 ASP 项目,所有内容都进入 /var/www,是否可以这样做并将我的 Django 项目添加到 /var/www 文件夹中?

【问题讨论】:

你将如何为 django 服务? wsgi? gunicorn 等? 我将使用 wsgi 插件为它提供服务。 我在 debian 系统上使用 /srv/wsgi/site 或 /var/wsgi/site。 我只使用/sites/foo//sites/bar/(每个都是virtualenv 这个问题没有答案。它是 linux,它可以去你需要去的地方。我把我的放在 /var/django 中。把它放在最有意义/最安全的地方。 【参考方案1】:

在Django tutorial 中声明:

这段代码应该放在哪里? 如果您的背景是 PHP,您可能习惯于将代码放在 Web 服务器的文档根目录下(在 /var/www 之类的地方)。使用 Django,您不会那样做。将任何这些 Python 代码放在 Web 服务器的文档根目录中并不是一个好主意,因为它有可能使人们能够通过 Web 查看您的代码。这不利于安全。

将您的代码放在文档根目录之外的某个目录中,例如 /home/mycode

【讨论】:

通常 /home/ 中的所有文件夹都是用户的主文件夹。那么我应该创建一个名为“mycode”的用户,还是他们在谈论只是创建一个文件夹。 @MadsSkjern 他们正在谈论在服务器上创建一个目录(文件夹),在服务器运行的用户的家中。 (在主文件夹中意味着内容(代码)不会向全世界公开。) 我注意到默认的 Apache DocumentRoot (Ubuntu 14.04) 现在是 /var/www/html。这是否意味着现在可以安全地在/var/www 下创建 Django 项目? @AndyHayden 如果全局 Apache DocumentRoot 是 /var/www/html 那么 /var/www/djangoproject 不应该对网络可见,除非您明确将其定义为 VirtualHost 的 DocumentRoot?我不喜欢将网站分散在多个目录中的想法。我更希望能够将我的 php 网站与我的 django 网站放在一起。 我已经在我的主目录 ~/mysite 下放置了一个带有套接字的 django 项目 ~/mysite/mysite/mysite.sock ,但现在 nginx 无法写入该套接字。现在我看到一个建议“您可能还必须将您的用户添加到 nginx 的组(可能是 www-data),反之亦然,以便 nginx 可以正确读取和写入您的套接字。”但这肯定也会对安全产生负面影响。【参考方案2】:

文件层次系统

@Andy Hayden 确实说明了不放置代码的位置。 File Hierarchy System (FHS) 包含以下结构; PATH映射到PACKAGEPROVIDER(建议提供多个包的方使用PROVIDER/PACKAGE):

/etc/opt/PATH  # FHS location for /opt configuration files
/opt/PATH      # FHS location for PROVIDER or PACKAGE name
/var/opt/PATH  # FHS location for /opt variable storage 

FHS 期望 /opt/PATH 包含成功执行软件包所需的所有材料,因此设置以下符号链接似乎是谨慎的做法

/etc/opt/PATH/opt/PATH/etc /var/opt/PATH/opt/PATH/var

这提供了一个很好的基础,但是 Django 项目有额外的要求,上面的结构不能完全满足。

静态文件

静态文件在运行python manage.py collectstaticSTATIC_ROOT 时部署,该STATIC_ROOT 应该指向用于静态传递的Web 服务器根目录,通常是/var/www/PATH

可以将/var/www/PATH 符号链接到/opt/PATH/static 但这通常是个坏主意;考虑一下您的服务器配置错误并且用户转到www.domain.tld/../ 并复制您的工作的情况。

设置

如果您使用django-admin create-project WEBSITE 创建项目,您通常会在WEBSITE 文件夹下拥有一个setup.py 文件。

PROJECT/
    WEBSITE/
         setup.py
         ...

如果您将此设置模块转换为一个包,或者您在 django-admin 周围使用了一些包装器,例如django-cms-create

PROJECT/
    WEBSITE/
         settings/
             __init__.py  # from .settings import *
             settings.py
         ...

您可以将/etc/opt/PATH 符号链接到/opt/PATH/WEBSITE/settings,而不是如上所述的/opt/PATH/etc。不过,我想不出这样做的实际原因……YMMV。

媒体

通常由网站用户提供的媒体被放入MEDIA_ROOT。在这种情况下,将/var/opt/PATH 映射到/opt/PATH/media 似乎是谨慎的做法。

虚拟环境

/opt/PATH/env 似乎是最合乎逻辑的位置。 /var/env/PATH 似乎也很合理,但可能更适合作为/opt/PATH/env 的符号链接。

由于虚拟环境既不是应用程序也不是库,因此位置 /opt/bin/opt/libs 不会这样做。 /env//pyvenv/ 不符合 FHS。

威士忌

如果您将 mod_wsgi 与 Apache 一起使用,则类似于 python manage.py runmodwsgi --server-root /etc/opt/PATH --setup-only 的调用可能更可取,因为它将 Apache 控制命令置于符合 FHS 的位置,但在这种情况下调用它们更麻烦。

首页

据我了解,/home 传统上由 PHP 开发人员在同一台服务器上托管多个站点时使用。如果您使用的是 Django,那么您可能正在从专用机器上为您的网站提供服务,而这种结构在这种情况下失去了一些优势……YMMV。

【讨论】:

以上是关于推荐一个 Django 项目在 Linux 上运行的地方的主要内容,如果未能解决你的问题,请参考以下文章

在Linux环境中运行python 项目

在 Django 1.7 迁移之前运行 South 迁移的推荐方法是啥?

django的练手实战项目都有哪些值得推荐

如何为在 64 位 Amazon Linux 2 上运行的 Elastic Beanstalk Python 3.7 项目安装节点包?

我有个linux的虚拟主机,我想运行django网站,怎么办?

ubuntu上运行linux项目