推荐的 Django 项目在 Linux 上存储的位置

28

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

对于PHP或ASP项目,所有内容都放在/var/www中,那么将我的Django项目添加到/var/www文件夹中是否可行?


你将如何运行Django?使用WSGI?Gunicorn等? - Rickard Zachrisson
我将使用WSGI插件来提供服务。 - Prometheus
1
当我在Debian系统上时,我使用/srv/wsgi/site或/var/wsgi/site。 - Rickard Zachrisson
我只是使用/sites/foo//sites/bar/(每个都是virtualenv)。 - Timmy O'Mahony
3
这个问题没有固定的答案。Linux可以被安装到你需要的任何地方。我把我的放在了 /var/django 目录下,你可以根据最合理、最安全的方式选择任意位置。 - D.A
你需要为包含 Django 文件的目录设置哪些权限才能使服务器可以访问它? - Sanket_Diwale
2个回答

37
Django教程中,它指出:

这些代码应该放在哪里?
如果你的背景是PHP,你可能习惯于将代码放在Web服务器的文档根目录下(例如/var/www)。但是在Django中,你不需要这样做。把Python代码放在Web服务器文档根目录之外的某个目录中,比如/home/mycode,这是个好主意。因为这样可以避免别人通过Web查看你的代码而导致安全隐患。


通常,/home/中的所有文件夹都是用户的主文件夹。那么我应该创建一个名为“mycode”的用户,还是他们只是在谈论创建一个文件夹? - Mads Skjern
1
@MadsSkjern 他们正在谈论在服务器上创建一个目录(文件夹),位于服务器运行的用户的主目录中。(位于主目录意味着内容(代码)不会公开给世界。) - Andy Hayden
1
我注意到默认的Apache DocumentRoot(Ubuntu 14.04)现在是/var/www/html。这是否意味着现在可以安全地在/var/www下创建Django项目? - user3817250
@user3817250 不!重点是你希望将其放在用户的主目录中,因为这对 Web 不可见。http://httpd.apache.org/docs/current/mod/core.html#documentroot - Andy Hayden
2
如果全局Apache DocumentRoot是/var/www/html,那么/var/www/djangoproject除非你明确将其定义为VirtualHost的DocumentRoot,否则不应该对Web可见。我不喜欢在多个目录中分散网站的想法。我更愿意能够将我的php站点与我的django站点放在一起。 - user3817250
1
我已经将一个Django项目放在我的主目录~/mysite下,并在其中放置了一个socket ~/mysite/mysite/mysite.sock,但现在nginx无法写入该socket。现在我看到一个建议:“您可能还需要将您的用户添加到nginx的组(可能是www-data),或者反之亦然,以便nginx可以正确地读写您的socket。”但是这肯定也会有负面的安全影响。 - Craig Hicks

5

文件层次结构

安迪·海登(Andy Hayden)明确指出不应该将代码放置在哪里。 文件层次结构(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时,静态文件将被部署到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。虽然我想不到这样做的实际理由...但因人而异。

媒体

媒体,通常由网站用户提供,会放置在MEDIA_ROOT中。在这种情况下,将/var/opt/PATH映射到/opt/PATH/media似乎是明智的选择。

虚拟环境

/opt/PATH/env似乎是最合适的位置。/var/env/PATH也很合理,但最好作为符号链接到/opt/PATH/env

由于虚拟环境既不是应用程序也不是库,因此/opt/bin/opt/libs这些位置对它来说并不适用。使用/env//pyvenv/也不符合FHS规范。

Whiskey

如果您正在使用Apache的mod_wsgi,那么类似于python manage.py runmodwsgi --server-root /etc/opt/PATH --setup-only的调用可能更可取,因为它将Apache控制命令放置在符合FHS规范的位置,尽管在这种情况下调用起来可能更繁琐。

主目录

据我所知,当PHP开发人员在同一服务器上托管多个站点时,通常会使用/home。如果您正在使用Django,则可能是从专用机器上提供站点服务,在这种情况下,此结构的用途会有所减少...因人而异。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接