Где правильно размещать виртуальные среды Python в соответствии со стандартом иерархии файловой системы Linux?

Как следует из названия, какое технически правильное место для хранения виртуальных сред Python в операционных системах Linux в соответствии с Linux FHS?

Сформулировал еще один способ, который позволяет получить четкий ответ: «технически правильно» отделять местоположение виртуальной среды Python от файлов данных, которые вы обслуживаете?

Примечание. Этот вопрос отличается от самый близкий, уже заданный вопрос, который я мог найти, поскольку виртуальные среды содержат библиотеки, двоичные файлы, заголовочные файлы и сценарии.

В качестве дополнительной сложности я обычно пишу код, поддерживающий службы, доступные через Интернет. Однако я не вижу в этом существенного отличия моих потребностей от сценариев, в которых потребителями службы являются другие процессы на том же сервере. Я упоминаю эту деталь на тот случай, если мои ответы на комментарии будут содержать контент в стиле «веб-разработчик».

Для справки, я использую следующую документацию в качестве определения 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/ должен быть монтируется только для чтения в соответствии с 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. Правильно ли размещать виртуальную среду и исходный код (например, application.py) под /usr/local/service_name/ при использовании /srv для файлов, которые изменяются чаще (например, «статические» активы, изображения, css)?

редактировать: Чтобы было ясно: я знаю, почему и как использовать virtualenvs. Меня ни в коем случае не смущают макеты проектов или работа в средах разработки.


person Community    schedule 22.06.2014    source источник


Ответы (1)


Как следует из названия, какое технически правильное место для хранения виртуальных сред Python в операционных системах Linux в соответствии с Linux FHS?

Имейте в виду, что Linux FHS на самом деле не является стандартом, это набор рекомендаций. LSB называет его стандартом, а это всего лишь набор правил, упрощающих поддержку Linux.

/run, /sys, /proc и /usr/local не являются частью LFS, но вы видите их в большинстве дистрибутивов Linux.

Для меня очевидным выбором для размещения виртуальных сред является /opt, потому что это расположение зарезервировано для установка дополнительных программных пакетов.

Однако в большинстве дистрибутивов Linux только root может записывать в /opt, что делает этот выбор плохим, поскольку одна из основных целей виртуальных сред — не быть root.

Итак, я бы порекомендовал /usr/local (если он доступен для записи вашей обычной учетной записи пользователя), но нет ничего плохого в том, чтобы установить его в свой домашний каталог.

Сформулировал еще один способ, который позволяет получить четкий ответ: «технически правильно» отделять местоположение виртуальной среды Python от файлов данных, которые вы обслуживаете?

Я не уверен, что вы подразумеваете под «файлами данных, которые вы обслуживаете», но вот правила для виртуальных сред:

  1. Не помещайте их в систему контроля версий.
  2. Ведите список установленных пакетов и поместите этот в системе контроля версий. Помните, что виртуальные среды не совсем переносимы.
  3. Держите виртуальную среду отдельно от исходного кода.

Учитывая вышеизложенное, вы должны хранить свою виртуальную среду отдельно от исходного кода.

рассмотрим распространенный сценарий, когда Nginx выступает в качестве обратного прокси-сервера для приложения Python. Правильно ли размещать виртуальную среду и исходный код (например, application.py) в каталоге /usr/local/service_name/ при использовании /srv для более динамичных файлов (например, «статических» ресурсов, изображений)?

Статические ресурсы не являются динамическими файлами, я думаю, вы путаете термины.

В любом случае, вы должны сделать следующее:

  1. Создайте учетную запись пользователя для запуска этого приложения.
  2. Поместите файлы приложения в каталог, который контролируется этим пользователем и только этим пользователем. Обычно это каталог /home/username, но вы можете сделать его /services/servicename. Поместите виртуальную среду как подмножество этого каталога в стандартном формате именования. Например, я использую env.
  3. Поместите свои статические ресурсы, такие как все медиафайлы, файлы css и т. д., в каталог, доступный для чтения на внешнем сервере. Итак, обычно вы создаете каталог www или каталог public_html.
  4. Убедитесь, что учетная запись пользователя, которую вы создаете для этого приложения, имеет права на запись в этот каталог ресурсов, чтобы вы могли обновлять файлы. Прокси-сервер не должен иметь права на выполнение в этом каталоге. Этого можно добиться, изменив группу каталога на группу пользователя прокси-сервера. Учитывая это, я бы поместил этот каталог под /home/username/ или /services/servicename.
  5. Запустите приложение с помощью диспетчера процессов и убедитесь, что ваш диспетчер процессов переключает пользователя на пользователя, созданного на шаге 1, при запуске кода приложения.

Наконец, я не могу не подчеркнуть, что ДОКУМЕНТИРУЙТЕ СВОИ ПРОЦЕССЫ и АВТОМАТИЗИРУЙТЕ ЕГО.

person Burhan Khalid    schedule 22.06.2014
comment
Ваш комментарий по поводу opt как раз в духе того, почему я поднял этот вопрос. Статические активы не являются динамическими файлами, я думаю, вы путаете термины — я понимаю, почему вы так думаете, но я думаю, вы согласитесь, что файлы css меняются относительно часто, хотя технически они не являются динамическими файлами. - person ; 22.06.2014
comment
И к вашему пункту № 2, /home/username - это объективно неправильный способ ведения дел, поскольку пользователь развертывания может быть системным пользователем без домашнего каталога (и вы не хотите привязывать группу развертывания к одному пользователю). Учитывая эти два комментария, ваше заявление о том, что конвенция FHS выдается за стандарт, является полезным напоминанием. - person ; 22.06.2014
comment
Вы не запускаете свои приложения от имени того же пользователя, под которым развертываете свое приложение (я предполагаю, что под развертыванием вы подразумеваете установку на производственных серверах), потому что для этого потребуются повышенные привилегии. Вам не нужен домашний каталог, вам нужно стандартное местоположение, и это может быть все, что вы выбрали для своей организации. Файлы CSS редко изменяются — не так часто, как, скажем, изображения, загруженные пользователями. Однако когда дело доходит до веб-разработки, статические файлы включают файлы CSS. - person Burhan Khalid; 22.06.2014
comment
Не вижу ничего особенно ужасного в привязке пользователя deploy к непривилегированному порту. Весь этот вопрос вращается вокруг правильного выбора стандартного местоположения. И да, CSS — это статические файлы, но я имел в виду частоту изменений — по моему опыту (по крайней мере), ресурсы CSS, JavaScript и изображений меняются с определенной регулярностью. - person ; 22.06.2014