生产环境下Ubuntu 16用户目录中Django 2.0虚拟环境的正确文件权限
刚好在Ubuntu 16上部署过Django 2.0的生产环境,来给你详细说下权限设置和虚拟环境位置的问题:
一、用户主目录下虚拟环境的正确权限配置
针对你放在~/myvenv/(应该是笔误?通常命名为myvenv)的虚拟环境,权限设置要兼顾安全性和运行需求:
虚拟环境根目录权限:
推荐设置为750,这个权限意味着:- 所有者(你的用户账号)拥有读、写、执行权限,能正常管理虚拟环境(安装依赖、更新包等)
- 所属组用户拥有读和执行权限(如果你的Django是用web服务器用户比如
www-data运行,把www-data加入你的用户组,或者把虚拟环境的组设为www-data,就能让服务正常访问虚拟环境) - 其他系统用户无任何权限,避免敏感文件被访问
执行命令:
chmod 750 ~/myvenv/ # 如果需要把组设为www-data chgrp -R www-data ~/myvenv/如果你独自维护项目、追求极致安全,也可以设为
700,完全禁止其他用户访问:chmod 700 ~/myvenv/虚拟环境内的文件权限:
bin/目录下的脚本(比如python、pip):需要执行权限,设为750即可,命令:chmod 750 ~/myvenv/bin/*lib/、include/等目录下的依赖文件:默认的640权限就足够(所有者读写、组只读),不需要额外修改,除非遇到权限报错。
二、为什么不推荐把虚拟环境装在/var/www目录
你说的没错,这确实不是生产环境的最佳实践,原因主要有这几点:
- 安全风险:
/var/www是web服务器的默认根目录,默认权限相对开放,容易把虚拟环境里的敏感文件(比如依赖源码、配置信息)暴露给外部,或者被其他系统用户误操作。 - 权限混乱:
/var/www下的文件通常属于www-data用户,而你开发维护时用自己的账号,安装依赖可能需要sudo,导致文件所有者变成root,后续Django服务运行时会出现权限不足的问题,排查起来很麻烦。 - 隔离性差:
/var/www通常用来存放多个web项目的静态文件,把虚拟环境放在这里容易和其他项目的依赖、配置互相干扰,不利于项目隔离管理。
额外的生产环境小提示
- 记得在项目的
.gitignore里加入myvenv/,不要把虚拟环境提交到版本控制。 - 生产环境的静态文件(static)和媒体文件(media)建议单独放在
/var/www/static/、/var/www/media/目录,权限设为755,让web服务器能正常访问,不要放在虚拟环境目录里。 - 如果用systemd管理Django服务(比如uWSGI或Gunicorn),一定要在服务配置文件里指定正确的
User和Group,确保服务进程能访问虚拟环境。
内容的提问来源于stack exchange,提问作者gregb
相关产品推荐
相关产品推荐

