推荐一个 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
映射到PACKAGE
或PROVIDER
(建议提供多个包的方使用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 collectstatic
到STATIC_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 上运行的地方的主要内容,如果未能解决你的问题,请参考以下文章
在 Django 1.7 迁移之前运行 South 迁移的推荐方法是啥?
如何为在 64 位 Amazon Linux 2 上运行的 Elastic Beanstalk Python 3.7 项目安装节点包?