Django 的文件权限:Gunicorn、Nginx 和静态文件

mh0*_*00h 3 linux django nginx

我有一台标准的 ubuntu 14.04 机器。我每天在用户下使用它mh00h。我有兴趣使用这台机器作为生产服务器。如何管理 Django 和 Nginx 的文件权限?

Nginx 当前配置为在www-data:www-data. 这最大限度地降低了机器其余部分受到损害的风险。Django/gunicorn 同样应该在mh00h. 但是gunicorn实际上应该在什么用户下运行?nobody, 正确的?

下一步:我将所有的 Web 开发文件存储在/home/mh00h/development. 归mh00h. /home/mh00h/development/project1 (plus all dir/files but /media and /static)? 归mh00h. 我遵循 django two-scoops 最佳实践来创建一个包含静态文件的项目目录。当然,Nginx 现在无法访问,/home/mh00h/development/project1/project1/static因为所有这些父目录都归 拥有mh00h,而不是www-data(./static归 拥有www-data)。

更复杂的是,virtualenvwrapper 在/home/mh00h/.virtualenvs/.

我很犹豫要不要从两个 scoop 的最佳实践中/static分离出来并分别存储在/var/www. 另外,如果我将自己与两勺的做法进行比较,这会让我感到混乱。

  1. 我的静态文件应该存储在哪里?
  2. django 特定文件应该存储在哪里?
  3. 哪些用户/组应该能够访问 1 和 2 中的哪一个?
  4. virtualenvwrapper 环境应该存储在哪里?
  5. 这些位置应该有什么权限?

谢谢你。

knb*_*nbk 5

我们生产环境中的所有文件和目录都拥有root:root755/644 文件权限,除非另有要求。某些私有文件(例如私钥等)只能由需要它们的用户/进程读取,而仍然只能由root.

至于项目结构:我们所有的项目在/srv/www/vhosts.d/. 虚拟环境存储在/srv/www/virtualenvs. 完全可以将它们存储在您的主文件夹中,但我觉得这种中心方法更符合生产服务器的想法。通过正确的设置,所有用户也可以访问所有虚拟环境。

我们的主项目目录包含几个脚本(manage.py 和几个部署/更新脚本),并进一步拆分为子目录:即web包含公共文件,src包含源代码,并frontend包含模板文件夹和 sass 文件夹。整个项目目录包含在一个 git 存储库中,但特定于部署的文件(用户上传的文件、搜索索引、加密密钥)都在 .git 目录中.git-ignore

我们的 nginx 进程作为www-data. 一般来说,每个 Django 项目都有自己的用户,gunicorn 进程以这个用户身份运行。