Как настроить Python с помощью virtualenv локально и на реальном сервере Linode (или аналогичном)?
Используя PyCharm в Windows, я хотел бы лучше понять, как настроить мою локальную среду так, чтобы она как можно точнее транслировалась на мои серверы на Linode (или на любой другой Linux-модуль).
У меня есть физический диск, отведенный для разработки. В моем случае это диск Z:
,
Я обычно создаю один каталог для каждого проекта. Проект определяется как целый сайт.
В настоящее время я также выбрал каталог, Z:\virtualenv
где я создаю свою виртуальную среду. Один на проект. Я полагаю, что несколько проектов могут использовать один и тот же virtualenv, но я не уверен, что это разумно для разработки или производства.
Я подумал о том, чтобы виртуальный проект для каждого проекта был включен в соответствующий проект. Это привлекает меня, потому что тогда каждый проект будет монолитным. Например, если мы говорим о приложении Flask под PyCharm:
d z:\flask_app
d .git
d .idea
d static
d templates
d virtualenv
main.py
Как тогда вы настраиваете производственный сервер с учетом вышеизложенного?
Давайте предположим, что один использует одну машину для размещения более одного сайта через виртуальный хостинг, это один из них:
<VirtualHost *:80>
ServerAdmin you@example.com
ServerName example.com
ServerAlias example.com *.example.com
DocumentRoot /var/www/example/public_html
ErrorLog /var/www/example/logs/access.log
CustomLog /var/www/example/logs/error.log combined
<Directory /var/www/example>
Options Indexes FollowSymLinks
AllowOverride All
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
Настроить ли я virtualenv на глобальном уровне сервера? Я думаю, что это глобальное "да". Это не могло работать по-другому. Я не думаю
ОК, это означает, что вся структура файла под
z:\flask_app
теперь может быть FTP'd в
/var/www/example/public_html
а на сайт хорошо идти?
Я понимаю, что сервер БД, БД, таблицы и т. Д. Должны быть настроены на рабочей машине, чтобы соответствовать. Я просто сосредотачиваюсь на Python на переходе Python с помощью virtualenv из среды разработки для настольных компьютеров во внешнюю версию Linux.
Я думаю, что я должен использовать virtualenv на корневом уровне сервера, чтобы также включить эту виртуальную среду, верно? Это то, где я немного размышляю о вещах. Большинство учебных пособий, с которыми я сталкивался, широко охватывают вашу локальную среду разработки, но редко посвящены переходу проектов на рабочие серверы, их настройке и постоянным отношениям к настройке разработки.
Я буду использовать виртуальную машину с Ubuntu 14.04 LTS, чтобы разобраться с этим по мере продвижения вперед.
Я также подумал об использовании 14.04 Desktop для разработки на виртуальной машине, чтобы обеспечить соответствие сред и выход из Windows.
2 ответа
1) Настольная виртуальная машина 14.04 для того, чтобы просто разобраться и разобраться с вещами перед передачей в сценарии и командную строку для вашего сервера - отличная идея.
2) Вам может понравиться инструмент / проект virtualenvwrapper. Он почти точно соответствует вашему текущему рабочему процессу, но с некоторыми удобными удобствами (весь смысл). По сути, он содержит центральную папку virtualenvs для разных имен (/ папок). Его наиболее удобные команды mkproject
(создайте новую папку и virtualenv с тем же именем) и workon
(активировать проект с таким именем).
3) К счастью, учитывая, что 14.04 не слишком старый, в его пакетах уже присутствует virtualenv, python-virtualenv
(1.11.4). Я бы установил это, а затем использовал его для создания сред на вашем сервере для запуска проектов Python, как вы предлагаете.
Хорошо, это значит, что вся файловая структура в... теперь может быть передана в FTP... и сайт хорош?
Нет, потому что вы пытаетесь перенести virtualenv, созданный для Python, на компьютер с Windows и надеетесь, что он будет работать под Python в Linux / Ubuntu.
4) Чтобы сохранить список управляемых пакетов, необходимых для каждого проекта, перечислите их в файле require.txt. Затем с новым активным virtualenv вы можете просто запустить pip install -r requirements.txt
и все необходимые пакеты будут установлены для него.
5) Для запуска ваших приложений на одном сервере я бы предложил запустить локальный WSGI-сервер, такой как Chaussette (возможно, под Circus) или uWSGI, на котором размещено ваше приложение Python WSGI под сокетом локального порта / unix; затем настройте Apache или Nginx на обратный прокси-сервер всего необходимого динамического трафика на этот сервер (см. этот ответ SO в качестве примера).
6) Некоторые элементарные ноу-хау сценариев bash могут очень помочь, если у вас есть вещи с возможностью повторной загрузки:) Если это становится еще сложнее, вы можете использовать продукт управляемой конфигурации, такой как Salt.
Учтите это: ваш репозиторий Git должен содержать исходный код, файлы данных и другие файлы, относящиеся к разработке этого проекта. Он не должен содержать virtualenv, так как он представляет собой смесь исполняемых файлов (Python, pip), заголовочных файлов и зависимостей, установленных из различных источников. Должна быть возможность стереть virtualenv и восстановить его без особых хлопот.
Хотя вы можете иметь источник и virtualenv в одном каталоге, вам необходимо обновить .gitignore
файл в любом случае, который указывает, что имеет смысл найти все virtualenvs в другом месте. Дело не в том, чтобы FTP помещал весь каталог в другой: вы должны отделить понятие обновления кода от понятия установки virtualenv (в котором могут быть установлены другие пакеты, отличные от вашей машины для разработки).
Например, вы будете разрабатывать на компьютере с Windows и развертывать на компьютере с Linux, что может привести к использованию разных пакетов. Поэтому важно отделить "исходный код проекта" от "зависимостей и конфигурации, необходимых для запуска".
Аналогично, на производственных серверах вы можете назначить одно местоположение для ваших virtualenvs, и все проекты (где их код установлен где-то в выбранной вами структуре каталогов) будут активировать virtualenv и затем запускаться. На самом деле не существует неправильного или правильного способа сделать что-то, если у каждого процесса есть достаточные разрешения для его выполнения.
В зависимости от того, сколько автоматизации вы хотите поместить в развертывание, вам следует хотя бы немного подумать об автоматизации, чтобы убедиться, что она работает правильно. Все сводится к настройке структуры каталогов, разрешений, извлечению кода из git, настройке virtualenv, установке зависимостей и любой другой оставшейся конфигурации, чтобы все работало. Вы можете сделать эти задачи с помощью Ansible, например.
В общем, лучше не думать о вашем приложении как об одной монолитной вещи, потому что со временем вещи могут перемещаться в другие места. Статические файлы? Возможно, им когда-нибудь понадобится зайти в сеть доставки контента. Установка базы данных? Возможно, когда-нибудь нужно будет перейти на другую машину. И так далее.