另一种方法是说明一个明确的答案:将Python虚拟环境的位置与您服务的数据文件分开是“技术上正确的”吗?
注意:This question differs from the closest,already-asked question I could find,因为虚拟环境包含库,二进制文件,头文件和脚本.
作为一个额外的复杂功能,我倾向于编写支持互联网可访问服务的代码.但是,我并不认为这可以将我的需求与服务的使用者是同一服务器上的其他进程的情况大不相同.我提到这个细节,以防我对评论的回复包括“web dev” – 内容.
作为参考,我使用以下文档作为我对Linux FHS的定义:http://www.pathname.com/fhs/pub/fhs-2.3.html
我不相信流行的virtualenv-wrapper脚本建议正确的操作,因为它默认将虚拟环境存储在用户的主目录中.这违反了目录用于特定于用户的文件的隐含概念,以及“没有程序应该依赖于此位置”的语句.
从文件系统的根级别,我倾向于/usr
(可共享的只读数据)或/srv
(该系统提供的服务的数据),但这是我很难进一步决定的地方.
如果我要与我的反向代理的决定一起,这意味着/usr
.Nginx通常被打包进入/usr/share / Nginx或/usr/local / Nginx,但是,/ usr /应该是mounted read-only according to the FHS.我发现这很奇怪,因为我从未参与过一个项目,在这个项目中,开发发生得如此缓慢以至于“以只读方式卸载为只读/重新安装,以只读方式卸载/重新安装”被认为值得付出努力.
/srv
是另一个可能的位置,但被称为“特定服务的数据文件的位置”,而Python虚拟环境更侧重于提供服务的库和二进制文件(没有这种区别,.so文件也将是在srv).此外,具有相同要求的多个服务可以共享虚拟环境,这违反了描述的“特定”细节.
我认为选择正确位置的部分困难是因为虚拟环境是一个“环境”,它包含二进制文件和库(几乎就像它自己的小层次结构),这让我觉得/ usr下的某个地方更多常规:
virtual-env/ ├── bin ~= /usr/local : "for use by the system administrator when installing software locally" ├── include ~= /usr/include : "Header files included by C programs" ├── lib ~= /usr/lib : "Libraries for programming and packages" └── share ~= /usr/local
根据我的假设和想法:考虑Nginx作为Python应用程序的反向代理的常见场景.在/usr/local / service_name /下放置虚拟环境和源代码(例如application.py)是否正确使用/ srv更频繁更改的文件(例如’静态’资产,图像,css)?
编辑:要明确:我知道为什么以及如何使用virtualenvs.我对项目布局或在开发环境中工作并不感到困惑.
解决方法
As the title asks,what is the technically proper location to store
Python virtual environments on Linux operating systems according to
the Linux FHS?
请记住,Linux FHS不是真正的标准,它是一套指导方针.它只被LSB称为标准 – 这只是一堆使Linux更容易支持的规则.
/ run,/ sys,/ proc和/usr/local都不是LFS的一部分,但你可以在大多数Linux发行版中看到它们.
对我来说,放置虚拟环境的明确选择是/ opt,因为这个位置是reserved for the installation of add-on software packages.
但是,在大多数Linux发行版中,只有root可以写入/ opt,这使得这个选项很糟糕,因为虚拟环境的主要目标之一是避免成为root用户.
因此,我建议使用/usr/local(如果它可由您的普通用户帐户写入) – 但在主目录中安装它没有任何问题.
Stated another way that allows for a clear answer: Is it “technically
correct” to separate the location of a Python virtual environment from
the data files you are serving?
我不确定您所使用的“数据文件”是什么意思,但以下是虚拟环境的规则:
>不要将它们放在源代码管理中.
>维护installed packages的列表,并将其置于版本控制中.请记住,虚拟环境不是完全可移植的.
>将您的虚拟环境与源代码分开.
鉴于上述情况,您应该将虚拟环境与源代码分开.
consider the common scenario of Nginx acting as a reverse proxy to a
Python application. Is it correct to place a virtual environment and
source code (e.g. application.py) under /usr/local/service_name/ while
using /srv for more dynamic files (e.g. ‘static’ assets,images)?
静态资产不是动态文件,我认为你的条款令人困惑.
无论哪种方式,您都应该执行以下操作:
>创建用户帐户以运行该应用程序.
>将应用程序文件放在由该用户和该用户单独控制的目录下.通常这是/ home / username目录,但您可以使用/ services / servicename.将虚拟环境作为此目录的子集,以标准命名格式放置.例如,我使用env.
>将静态资产(例如所有媒体文件,css文件等)放在前端服务器可读的目录中.所以,通常你会创建一个www目录或一个public_html目录.
>确保为此应用程序创建的用户帐户具有对此资产目录的写入权限,以便您能够更新文件.代理服务器不应对此目录具有执行权限.您可以通过将目录组更改为与代理服务器用户的组相同来完成此操作.鉴于此,我将此目录放在/ home / username /或/ services / servicename下.
>使用流程管理器启动应用程序,并确保流程管理器在运行应用程序代码时将用户切换到步骤1中创建的用户.
最后,我不能强调这足以记录您的过程和自动化.