Pull to refresh

Хостер, поставь мне модуль, а?

Hosting
imageДостаточно регулярно на хостинге не оказывается предустановленной библиотеки для той или иной программы. И не всегда хостер удовлетворяет просьбу установить библиотеку требуемой версии. Бывает, что библиотека есть, но устаревшая. Или сломался у хостера сервер, он перекинул сайт на другой, а там более новая версия библиотеки, не совместимая с той, на которой работает программное обеспечение сайта (пользователи Django прекрасно поймут меня). Что делать? Искать опять новый хостинг? Всегда быть готовым переписать свою программу под другую версию библиотеки? Наш путь — поставить её самостоятельно. В самом крайнем случае, придётся просто переустановить её. Кроме бинарных модулей PHP почти все библиотеки для популярных веб-технологий можно поставить к себе в домашний каталог не трогая хостера и не завися от него. Кстати сказать, это можно делать не только на шаред-хостинге, но также и на виртуальных серверах — проекты становятся слабо зависящими от того, кто и как настраивал виртуальный сервер. Сложно?

Что необходимо для простой и удачной установки библиотеки в домашний каталог на среднестатистическом хостинговом UNIX-сервере? Желательно наличие доступа по SSH. Можно обойтись и без него, но тогда придётся искать какой-нибудь веб-шелл. Желательно, чтобы ssh-консоль работала НЕ в chroot-окружении, потому что в большинстве случаев она имеет урезанный вид, или же чтобы chroot-окружение ssh совпадало с таковым у apache. У Вашего хостера нет SSH? Это повод задуматься. Также необходимы навыки работы с консолью UNIX. Это не сложнее, чем посылать наборы цифр на короткие номера в мобильных телефонах. Не надо этого бояться, если Вы уж взялись за разработку сайтов.

По ходу повествования, я часто буду упоминать макрос $PREFIX. Одной из самых распространённых ошибок пользователей является то, что обычно под префиксом понимают тот каталог, куда будут установлены файлы библиотеки. Дело в том, что дистрибутивы библиотек и программ имеют файлы руководства, документацию, вспомогательные файлы, возможно бинарные запускаемые файлы и собственно сами файлы библиотеки. Все системы установки хотят создать под указанные файлы некую условную иерархию каталогов, начиная как раз от $PREFIX. Например, модули Python будут раскладывать бинарные файлы в $PREFIX/bin, файлы руководства в $PREFIX/shared/man, а сами файлы библиотеки в $PREFIX/lib/pythonX.X/site-packages (X.X — версия интерпретатора Python, что, кстати, позволяет ставить разные библиотеки для разных версий). Я рекомендую не противиться иерархии каталогов по умолчанию, а также считать, что в общем случае $PREFIX (определённый мною макрос, не существующий в системе) и $HOME (домашний каталог пользователя, предопределённая переменная шелл) идентичны, хотя никто не обязывает следовать этим соглашениям.

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

Для того, чтобы переменную окружения задать для командной строки ssh (на самом деле для любой консоли во время логина), следует прописать её в файл .profile для шеллов sh и bash (на большинстве хостингов именно они являются основными шеллами для пользователей), находящемся в корне домашнего каталога пользователя, следующие строки:
VARIABLE=VALUE
export VARIABLE

Например, для модулей Python 2.5 это будет выглядеть так:
PYTHONPATH=$HOME/lib/python2.5/site-packages
export PYTHONPATH

Обращаю внимание на то, что в данном случае использовалась обычно предопределённая переменная $HOME, которая автоматически раскрывается шеллом. Для отличных от sh и bash шеллов строки будут иными, отсылаю читателя к документации на эти шеллы. Переменные окружения для шелл лучше всего установить ДО начала установки библиотек. Не забудьте «перелогиниться» после добавления, чтобы настройки применились.

Для того, чтобы переменную окружения видели задания cron, следует в начале crontab-файла прописать её:
VARIABLE=VALUE
Например, для модулей Python 2.5, устанавливаемых в домашний каталог пользователя vasya, это будет выглядеть так:
PYTHONPATH=/home/vasya/lib/python2.5/site-packages
Сам путь до домашнего каталога на серверах различных хостеров может отличаться от приведённого выше. Особое внимание обращаю на то, что cron не умеет «раскрывать» переменные и путь надо прописывать полностью как он есть.

С веб-сервером немного сложнее. Следует почитать документацию, применимую к конкретному случаю. Например, для того чтобы CGI-скрипты на языке Perl5 под управлением apache видели установленные в домашний каталог пользователя vasya библиотеки, следует прописать в файл .htaccess в корне сайта или в том каталоге, где находятся CGI-скрипты, следующую строку:
SetEnv PERL5LIB /home/vasya/lib/perl5
Из этого описания понятно, как задаются переменные окружения в веб-сервере apache.
Но для приложений на языке Python 2.5 под управлением WSGI-сервера (любого) лучше прописать в файл инициализации WSGI следующие строки:
import sys
sys.path.insert(0,"/home/vasya/lib/python2.5/site-packages")

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

Для опытных пользователей UNIX отмечу, что для удобства можно расширять переменную PATH, указав каталог $HOME/bin, чтобы утилиты, идущие вместе с библиотеками, работали без введения из консоли полного пути, и задать переменную MANPATH, обычно это $HOME/share/man, для того чтобы можно было пользоваться страницами руководства устанавливаемых модулей также как и обычными — командой man.

Установка библиотек (модулей) CPAN в домашний каталог (Perl)



Напомню, что CPAN (Comprehensive Perl Archive Network — архив Perl) является центральным хранилищем всего, что касается Perl. Один из способов посмотреть модули CPAN — посетить сайт search.cpan.org.

Для того, чтобы скрипты могли работать с устанавливаемыми модулями, следует установить переменную окружения PERL5LIB. Можно задать несколько путей для поиска модулей, перечислив их через двоеточие, например:
PERL5LIB=/home/vasya/lib/perl5:/home/vasya/lib1/perl5:/home/vasya/lib2/perl5

Модули находящиеся на CPAN можно скачивать и компилировать вручную. Как правило последовательность команд компиляции и требуемые модули, перечислены в файле README, обычно входящем в состав дистрибутива модуля. Все модули CPAN могут устанавливаться одним из способов: ExtUtils::MakeMaker и/или Module::Build (для более подробной информации просто почитайте документацию к этим модулям). ExtUtils::MakeMaker использует файл Makefile.PL. Для установки в домашний каталог требуется указать переменную окружения INSTALL_BASE:
perl Makefile.PL INSTALL_BASE=~
Module::Build использует файл Build.PL. Для установки в домашний каталог требуется указать ключ --install_base:
perl Build.PL --install_base ~
Тильда обычно «раскрывается» шеллом в значение домашнего каталога пользователя — это и есть наш $PREFIX, о котором я рассказывал в начале статьи. Можно указать вместо тильды любой другой полный путь, сделав соответствующие поправки в переменных окружения. Остальные ключи и предпочтительный способ установки обычно описаны в файлах README и INSTALL внутри дистрибутива модуля.

Также в состав дистрибутива Perl входит модуль под названием CPAN. Он позволяет автоматизировать операции установки необходимых модулей, включая установку зависимостей. Модуль может работать в ручном и пакетном режиме. Рассмотрим для простоты ручной режим работы. Для интерактивной работы с модулем следует набрать команду:
perl -MCPAN -e shell
При первом запуске программа попытается создать конфигурационный файл и будет задавать вопросы. Проблема в том, что при любых ответах итоговый конфигурационный файл, создаваемый обычно в каталоге .cpan/CPAN/MyConfig.pm внутри домашнего каталога пользователя, не готов к использованию для установки модулей локально. В нём нас интересуют нижеследующие строки, которые должны быть заполнены подобным образом:
'build_dir' => qq[$ENV{'HOME'}/.cpan/build],
'cpan_home' => qq[$ENV{'HOME'}/.cpan],
'histfile' => qq[$ENV{'HOME'}/.cpan/histfile],
'keep_source_where' => qq[$ENV{'HOME'}/.cpan/sources],
'makepl_arg' => qq[INSTALL_BASE=$ENV{'HOME'}],
'mbuildpl_arg' => qq[--install_base $ENV{'HOME'}],
'prefs_dir' => qq[$ENV{'HOME'}/.cpan/prefs],

Вместо $ENV{'HOME'} может стоят полный путь до домашнего каталога пользователя, или любой другой путь, например: /home/vasya

Убедившись в правильности конфигурации, можно устанавливать модули. Команда
perl -MCPAN -e shell
запускает специальную интерактивную оболочку. Установка модулей в ней производится например такой командой:
force install ИМЯ_МОДУЛЯ
Ключевое слово force позволит избежать отказа от установки в случае отрицательных результатов тестов, которые по разным причинам действительно могут быть отрицательными.

Модуль CPAN также предоставляет возможность и пакетной (программной) работы по управлению модулями CPAN. Стоит для более тонких настроек модуля или для программирования пакетной работы ознакомиться с документаций на CPAN.pm.

Установка библиотек (модулей) PEAR в домашний каталог (PHP)



Напомню, PEAR (PHP Extension and Application Repository) — это фреймворк и система распространения компонент на языке PHP. Подробную информацию можно найти на сайте pear.php.net

Сам пакетный менеджер pear не входит в состав дистрибутива PHP, поэтому необходимо, чтобы он был предварительно установлен у хостера.

Основная проблема — это чтобы php-скрипт «видел» откуда ему брать тот или иной компонент (PHP как всегда идёт «своим» путём). Для этого должна быть определена настройка include_path, например, для пользователя vasya, так:
include_path=".:/home/vasya/pear"
Самый простой способ — указать интерпретатору php эту переменную:
php -d include_path=".:/home/vasya/pear"
Или же в код скрипта вставить конструкцию:
ini_set("include_path",".:/home/vasya/pear");
Это касается и запуска скриптов через cron.
Для того, чтобы скрипты, запускаемые из-под веб-сервера apache, могли включать компоненты PEAR, требуется или в скрипт прописать:
ini_set("include_path",".:/home/vasya/pear");
или в файл .htaccess добавить строку вида:
php_value include_path ".:/home/vasya/pear"

Перед установкой модулей PEAR следует сообщить утилите pear, что мы хотим ставить компоненты в свой домашний каталог командой:
pear create-config $HOME .pearrc
Будет создан конфигурационный файл, используемый pear в дальнейшем. Конечно же вместо $HOME можно выбрать любое другое место, не забыв отразить это в значении include_path.

Теперь можно просто устанавливать требуемые пакеты. Например:
pear install -o PEAR
установит базовый компонент системы PEAR с зависимостями.

Установка библиотек (модулей) Python в домашний каталог (Python)



Для того, чтобы скрипты могли работать с устанавливаемыми модулями, следует установить переменную окружения PYTHONPATH. Можно задать несколько путей для поиска модулей, перечислив их через двоеточие, например:
PYTHONPATH=/home/vasya/lib/python2.5/site-packages:/home/vasya/lib2/python2.5/site-packages

Ручная установка из архива



Обычно ключи и предпочтительный способ установки описаны в файлах README и INSTALL внутри дистрибутива модуля. Обычно, это команда:
python setup.py install --prefix=$HOME
Проблемы могут возникнуть, если разработчики модуля проигнорировали ключ --prefix.

Установка с помощью easy_install



Утилита easy_install сама умеет искать пакеты в хранилище pypi.python.org/pypi, скачивать и устанавливать их. Или же устанавливать уже скачанные. Не существует для Python версий 3.x. Утилита не входит в состав дистрибутива Python, необходима предварительная установка модуля setuptools pypi.python.org/pypi/setuptools. Для установки модулей с помощью easy_install требуется существование каталога вида:
$PREFIX/lib/pythonX.Y/site-packages
где X.Y — версия Python. Например, для установки модулей для Python 2.5 используя easy_install требуется создать соответствующую иерархию каталогов следующей командой:
mkdir $HOME/lib $HOME/lib/python2.5 $HOME/lib/python2.5/site-packages
При отсутствии такого каталога easy_install выдаст ошибку.

После этого можно устанавливать пакет:
easy_install --prefix $HOME имя_пакета

Как и во всех других случаях, вместо приведённого в примерах $HOME можно использовать другие префиксы, сделав соответствующие поправки в переменных окружения.

Установка RubyGems в домашний каталог (Ruby)



Напомню, RubyGems — менеджер пакетов для языка программирования Ruby который предоставляет стандартный формат для программ и библиотек Ruby, инструменты, предназначенные для простого управления установкой, и сервер для их распространения. Пакеты могут быть установлены с любого gems-сервера. По умолчанию, gems ищет пакеты на сервере rubygems.org. RubyGems не входят в дистрибутив Ruby и должен быть предварительно установлен хостером.

RubyGems самая «умная» система установки из описываемых. Запустите команду:
gem environment
и посмотрите, какие пути он укажет после ключевого слова GEM PATHS. Нас интересуют переменные GEM_HOME и GEM_PATH. Хотя gems сам достаточно верно определяет все переменные, на всякий случай пропишите их явно. Это касается и случая, когда Вы хотите устанавливать пакеты в какое-нибудь нестандартное место.

Установка с помощью gem очень простая. Достаточно набрать команду:
gem install имя_пакета

Установка библиотек Ruby не входящих в состав gems



Может появиться необходимость использовать скрипты Ruby в качестве библиотеки, не зависящей от скриптов Вашего приложения. Интерпретатор Ruby должен «видеть» их. Для этого следует установить переменную окружения RUBYLIB, например так:
RUBYLIB=/home/vasya/mylib/render

Установка бинарных библиотек



Установку бинарных библиотек трудно формализовать. Но скорее всего Вам никогда не придётся столкнуться с их установкой.

Для подавляющего большинства дистрибутивов этих библиотек верны нижеописываемые правила.

В состав дистрибутива входит файл configure, воспринимающий ключ --prefix, например, команда
./configure --prefix=$HOME
внутри распакованного дистрибутива скорее всего будет достаточна для правильной конфигурации процесса инсталяции.

Если библиотека написана с учётом --prefix и всё сделано правильно, то последовательность команд после конфигурации:
make
make install

внутри распакованного дистрибутива должна привести к установке библиотеки в домашний каталог.

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

На пути к звёздам



Для поднятия позитивного настроя предлагаю ссылку на работающую инструкцию установки на шаред-хостинг поискового движка xapian: wiki.diphost.ru/XapianInstall
Там имеется всё — и установка бинарной составляющей, и установка модулей к языкам Perl, Python и Ruby. Надеюсь, мой мастер-класс, собранный по крупицам и отлаженный, поможет читателям упростить схемы взаимодействия с хостерами и почувствовать себя более свободными в выборе технологий.
Tags: хостингperlpythonrubyphppeargemCPANdreamless
Hubs: Hosting
Total votes 101: ↑89 and ↓12 +77
Comments 40
Comments Comments 40

Popular right now