Картинка блога
mono-at-dreamhostПоднять свой сайт на Mono ( .NET Framework с открытым исходным кодом) технически возможно и с помощью виртуального хостинга на серверах DreamHost. Для этого можно использовать предварительно установленной модуль FastCGI, который доступен на DreamHost для Apache и LightHttpd Web-серверов, с помощью которого затем настроить динамическую загрузку Mono FastCGI. Как и любой другой динамический сервер FastCGI (например, PHP FastCGI), модуль FastCGI в Apache будет отслеживать и управлять процессами и запуском / остановкой Mono FastCGI по мере их необходимости, в соответствии с политикой настроек DreamHost‘s FastCGI. Mono FastCGI Backend распространяется как часть пакета Mono XSP, которые должны быть собраны и установлены вместе со всеми другими Mono библиотеками файлов. Эта процедура подробно описана ниже, а также включен пример конфигурации Apache с основным web Mono-приложением, которое содержит несколько стандартных страниц ASP.NET (. ASPX-файлы) и веб-службу (. ASMX файл). Установив и изучив это приложение, можно продолжать разрабатывать уже свое приложение на Mono.

О статье.

Эта статья является переводом «Mono on Shared Hosting at DreamHost through FastCGI» с некоторыми дополнениями с моей стороны. В оригинальной статье например, установка приложения Mono происходит в подкаталог домена, я устанавливал его как обработчик саб-домена. Из за поверхностного знания конфигурации Apache, это потребовало несколько дополнительных часов борьбы с 500-й ошибкой.

Сбор и установка Mono 2.4.2.3.

Наиболее сложная и трудоемкая часть получения поддержки Mono на сайте, это компиляция и установка. Однако, вам нужно просто следовать инструкциям скрипта показаного ниже, чтобы достичь этого. Чтобы убедиться, что все идет по плану и иметь возможность вмешаться, если что-то пойдет не так, вы можете запустить этот скрипт вручную, а затем скопировать и вставить его шаг за шагом в консоль (следить за сообщениями об ошибках, которые будут показаны выше строки после каждого этапа завершения исполнения). Или же, просто поставить проверку выполнения на ошибки после, после каждого Wget, TAR, make и configure. Строка проверки может, например выглядеть так: «if [ $? -ne 0 ]; then exit 1; fi» которая будет прервать сценарий, если что-то пойдет не так. В скрипте, около 84 таких мест, где вы должны проверить завершение предыдущей команды для успешного продвижения по пути.
Стоит отметить, что не все пакеты необходимы для получения Mono. Например, libxml2 и libxslt включаются только для того, чтобы были доступны утилиты xsltproc (это нужно, если вы хотите, запускать тесты Mono после сборки). Аналогичным образом, если вы не собираетесь использовать язык Visual Basic. NET (VB.NET) , пакет  mono-basic не нужен. Кроме того, если функциональность связанная с графикой вам не требуется (то есть, GDI+ или пространство имен System.Drawing), то ни пакет libgdiplus, ни ее зависимость  (например, Zlib, Libpng, Libjpeg / jpegsrc, libexif , LibTIFF / TIFF и giflib) не нужны. Следующий скрипт включает полную сборку, вы можете просто убрать не нужные части.
Код скрипта показан в конце стать или его можно скачать с FileBase вместе с тестовым приложением.
Команду nice (приоритет на выделяемые ресурсы) в начале make можно убрать, если вы собираете mono когда на сайте мало людей.
Скрипт, представленный здесь как есть, выполнялся у меня 3 с половиной часа с выделенными ресурсами 300MB ram. На локальной машине (P4, 512MB ram, без ‘nice‘ — полтора часа).
После сборки, перенести Mono в другое место не получится, так как все скрипты будут ссылаться по указанному пути.    Во время выполнения сценария вы можете получить следующую ошибку:

Yikes! One of your processes (xxx, pid 12345) was just killed because your
processes are, as a whole, consuming too much memory. If you believe you’ve
received this message in error, please contact Support.

Это обозначает, что ваш процесс убили из за потребления слишком большого объема памяти. Если это произошло, можно попросить поддержку DreamHost временно увеличить ограничение на память, по словам автора, служба поддержки любезно предоставила на время недостающий ресурс. Я же просто зашел в свою панель и увеличил на время ресурсы в ручную 300 мегов на три часа обошлось мне в 10 центов.

После того как установка Mono закончена, для удобства, можно добавить путь до запускаемых файлов Mono в глобальную переменную PATH. Сделать это можно в файле ~/.bash_profile, который запускается каждый раз, при входе в консоль. Добавьте следующую строку:

PATH=~/mono-2.4.2.3/bin:$PATH

Теперь если перезайти после изменений в шелл можно попробовать запустить следующую команду «mono —version«, на выходе должно быть сообщение, начинающееся с «Mono JIT compiler version 2.4.2.3«. Значит Mono теперь установлен в системе, а нам осталось только настроить сайт.

Конфигурация Apache и .NET сайта.

Структура папки с атрибутами (команда «ls -alR«) должна быть следующей:

/home/username/example.com:
drwxr-xr-x username groupname .
drwxr-x--x username groupname cgi-bin
drwxr-x--x username groupname mono-web
-rw-r--r-- username groupname .htaccess
-rw-r--r-- username groupname index.html

/home/username/example.com/cgi-bin:
-rwxr-x—x username groupname mono-web-launcher.fcgi

/home/username/example.com/mono-web:
-rw-r—r— username groupname .htaccess
-rw-r—— username groupname Default.aspx
-rw-r—— username groupname Default.aspx.cs
-rw-r—— username groupname Test.aspx
-rw-r—— username groupname WebService.asmx
-rw-r—— username groupname web.config

Весь тестовый сайт можно скачать с Filebase
Если атрибуты не те, придется по колдовать с командой chmod.

Основной .htaccess файл просто разрешает статический index.html или динамический index.php выполнятся по умолчанию, тут ничего особенного:

# Не показывать содержимое папки
Options -Indexes

# Следовать символьным ссылкам на папки.
Options +FollowSymLinks

# Страницы по умолчанию
DirectoryIndex index.php index.html

Файл «mono-web-launcher.fcgi» в папке example.com/cgi-bin и есть загрузчик Mono интерпретатора «~/mono-2.4.2.3/bin/fastcgi-mono-server2», здесь можно настроить дополнительную Mono FastCGI конфигурацию. Расширение .fcgi говорит Apache, что это скрипт FastCGI. Вместе с monoWrapper обработчиком, установленным на срабатывание в файле «mono-web/.htaccess«, этот скрипт запустится как Mono FastCGI при первом запросе сайта. Убедитесь, что значения HOME и DOMAIN в начале загрузчика соответственно совпадают с именем и доменом вашего сайта:

#!/bin/sh
# Укажите папку домена и ваш домашний путь для dreamhost
HOME=/home/username
DOMAIN=example.com
MONO_DIR=${HOME}/mono-2.4.2.3

# Включить пути Mono скриптов в глобальные пути,
# для контекта FastCGI
export PATH=${MONO_DIR}/bin:$PATH

# Использовать не чувствительный к регистру обработчик;
# не используйте эту опцию если можете без нее обойтисб (медленнее)
export MONO_IOMAP=all

# Запустить динамический FastCGI сервер для Mono
# и заркгистрировать пути приложения;
# Менеджер FastCGI остоновит процесс согласно внутренней конфигурации.
# (eнапример, время бездействия)
exec mono $MONO_OPTIONS \
${MONO_DIR}/lib/mono/2.0/fastcgi-mono-server2.exe \
/logfile=${HOME}/fastcgi-mono-web.log \
/loglevels=Warning,Error \
/applications=/mono-web/:${HOME}/${DOMAIN}/mono-web/ \
«$@»

При первой установку, вас может интересовать и другой уровень сохранения логов «loglevels«, его временно можно поменять на All или Standard. В данной конфигурации, файл будет созранятся в «~/fastcgi-mono-web.log«. Конечно, некоторая информация, также может осесть в логах Apache. Дополнительную информацию о параметрах Mono сервера, можно получить, запустив:

mono ~/mono-2.4.2.3/lib/mono/2.0/fastcgi-mono-server2.exe /help

Теперь, осталось настроить Apache таким образом, чтобы он обращался к нашему загрузчику, при запросе сайта, файл «mono-web/.htaccess«:

# Указать Asp.NET файлы загрузки по умолчанию
DirectoryIndex Default.aspx default.aspx Index.aspx index.aspx \
Default.htm default.htm Default.html default.html \
Index.htm index.htm Index.html index.html

# Запускать mono-web-launcher.fcgi при любом запросе файлов в указанной папке.
SetHandler monoWrapper
Action monoWrapper /cgi-bin/mono-web-launcher.fcgi virtual

Такой подход позволяет Mono отвечать за весь контент, запрашиваемый из этой папки. Все запросы будут перенаправлены в наш загрузчик (SetHandler), и не требует указывать расширения для обработки (AddHandler).

Наконец, обычный web.config файл:

Установив customErrors в «Off» сделает возможные ошибки не видимыми из браузера, для начальной установки, скорее всего вы захотите это поменять на «On«, в противном случае, искать ошибки нужно будет в логах. Для тестового сайта, никакие другие настройки не нужны. И конечно, не включайте трейс ошибок для всех, в соображениях безопасности. Для проверки работы Mono, в архиввве! есть две страницы и один веб сервис — Default.aspx, Test.aspx, WebService.asmx. Последний можно проверить на генерацию описания wdsl («http://example.com/mono-web/WebService.asmx?page=wsdl«).

Ставим Mono на весь домен, или как это делал я.

Начну с того, что SetHandler у меня не сработал, Апач вылетал ругаясь на рекурсивный вызов. Возможно это связанно с отличиями можуля «mod_fastcgi» от «mod_fcgid«. Я использовал AddHandler для .NET расширений. В итоге, я получил следующий .htaccess файл:

#Options -Indexes
DirectoryIndex Default.aspx default.aspx Index.aspx index.aspx \
Default.htm default.htm Default.html default.html \
Index.htm index.htm Index.html index.html

Options +FollowSymLinks +ExecCGI

Action monoAction /cgi-bin/mono-launcher.fcgi virtual
#SetHandler monoAction

AddHandler monoAction .aspx .ascx .asax .ashx .config .cs .asmx .axd
AddHandler monoAction .dll

Финальные мысли

В соображениях безопасности название mono-web-launcher.fcgi лучше изменить на свое, так как оно доступно по запросу («http://example.com/cgi-bin/mono-web-launcher.fcgi«).
Если у вас еще нет хостинга в Dreamhost у вас есть отличная возможность получить его на выгодных условиях.

Код скрипта для установки Mono

#!/bin/sh
# ===================================================================
# Download, build and install the Mono .NET-compatible Framework...
# ===================================================================

# ===================================================================
# Setup and initialization
# ——————————————————————-

# Define some common variables
# TODO: Remember to use your own domain name (DreamHost directory name)
export DOMAIN=»example.com»
mono_dir=»${HOME}/mono-2.4.2.3″
mono_src=»${HOME}/src/mono-build»

# Create a few directories (maybe not needed, but it shouldn’t hurt)
mkdir -p «${mono_dir}»
mkdir -p «${mono_dir}/etc»
mkdir -p «${mono_src}»

# Setup the source environment variables to ensure that any custom
# pkg-config libraries can be located and progressive compilations
# can use the C# compiler and other Mono tools
export DYLD_LIBRARY_PATH=»${mono_dir}/lib:${DYLD_LIBRARY_PATH}»
export LD_LIBRARY_PATH=»${mono_dir}/lib:${LD_LIBRARY_PATH}»
export LIBRARY_PATH=»${mono_dir}/lib:${LIBRARY_PATH}»
export C_INCLUDE_PATH=»${mono_dir}/include»
export CPLUS_INCLUDE_PATH=»${mono_dir}/include»
export ACLOCAL_PATH=»${mono_dir}/share/aclocal»
export PKG_CONFIG_PATH=»${mono_dir}/lib/pkgconfig:${PKG_CONFIG_PATH}»
export PATH=»${mono_dir}/bin:${PATH}»

# ===================================================================
# Get and extract Mono and related packages/extensions
# ——————————————————————-

cd «${mono_src}»

wget -c «http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.13.1.tar.gz»
wget -c «http://ftp.gnu.org/pub/gnu/gettext/gettext-0.17.tar.gz»
wget -c «http://iweb.dl.sourceforge.net/project/libexif/libexif/0.6.18/libexif-0.6.18.tar.bz2»
wget -c «http://www.zlib.net/zlib-1.2.3.tar.gz»
wget -c «http://iweb.dl.sourceforge.net/project/libpng/00-libpng-stable/1.2.40/libpng-1.2.40.tar.gz»
wget -c «http://www.ijg.org/files/jpegsrc.v7.tar.gz»
wget -c «ftp://ftp.remotesensing.org/pub/libtiff/tiff-3.9.1.tar.gz»
wget -c «http://iweb.dl.sourceforge.net/project/giflib/giflib%204.x/giflib-4.1.6/giflib-4.1.6.tar.bz2»
wget -c «http://ftp.gnu.org/gnu/bison/bison-2.4.1.tar.bz2»
wget -c «http://xmlsoft.org/sources/libxml2-2.7.6.tar.gz»
wget -c «http://xmlsoft.org/sources/libxslt-1.1.26.tar.gz»
wget -c «http://ftp.gnome.org/pub/GNOME/sources/glib/2.22/glib-2.22.2.tar.bz2»
wget -c «http://ftp.novell.com/pub/mono/sources/libgdiplus/libgdiplus-2.4.2.tar.bz2»
wget -c «http://ftp.novell.com/pub/mono/sources/mono/mono-2.4.2.3.tar.bz2»
wget -c «http://ftp.novell.com/pub/mono/sources/xsp/xsp-2.4.2.tar.bz2»
wget -c «http://ftp.novell.com/pub/mono/sources/mono-basic/mono-basic-2.4.2.tar.bz2»

nice -n 19 tar -xzf «libiconv-1.13.1.tar.gz»
nice -n 19 tar -xzf «gettext-0.17.tar.gz»
nice -n 19 tar -xjf «libexif-0.6.18.tar.bz2»
nice -n 19 tar -xzf «zlib-1.2.3.tar.gz»
nice -n 19 tar -xzf «libpng-1.2.40.tar.gz»
nice -n 19 tar -xzf «jpegsrc.v7.tar.gz»
nice -n 19 tar -xzf «tiff-3.9.1.tar.gz»
nice -n 19 tar -xjf «giflib-4.1.6.tar.bz2»
nice -n 19 tar -xjf «bison-2.4.1.tar.bz2»
nice -n 19 tar -xzf «libxml2-2.7.6.tar.gz»
nice -n 19 tar -xzf «libxslt-1.1.26.tar.gz»
nice -n 19 tar -xjf «glib-2.22.2.tar.bz2»
nice -n 19 tar -xjf «libgdiplus-2.4.2.tar.bz2»
nice -n 19 tar -xjf «mono-2.4.2.3.tar.bz2»
nice -n 19 tar -xjf «xsp-2.4.2.tar.bz2»
nice -n 19 tar -xjf «mono-basic-2.4.2.tar.bz2»
echo Download complete
exit

# ===================================================================
# Build packages
# ——————————————————————-

# libiconv
cd «${mono_src}/libiconv-1.13.1»
./configure —enable-extra-encodings «—prefix=${mono_dir}»
nice -n 19 make
nice -n 19 make install

# gettext
cd «${mono_src}/gettext-0.17»
./configure «—prefix=${mono_dir}»
nice -n 19 make
nice -n 19 make install

# Rebuild libiconv, again after gettext; recommended
# on the GNU page http://www.gnu.org/software/libiconv/
cd «${mono_src}/libiconv-1.13.1»
nice -n 19 make distclean
./configure —enable-extra-encodings «—prefix=${mono_dir}»
nice -n 19 make
nice -n 19 make install

# libexif
cd «${mono_src}/libexif-0.6.18»
./configure «—prefix=${mono_dir}»
nice -n 19 make
nice -n 19 make install

# zlib
cd «${mono_src}/zlib-1.2.3»
./configure «—shared» «—prefix=${mono_dir}»
nice -n 19 make
nice -n 19 make install

# libpng
cd «${mono_src}/libpng-1.2.40»
./configure «—prefix=${mono_dir}»
nice -n 19 make
nice -n 19 make install

# jpegsrc
cd «${mono_src}/jpeg-7»
./configure «—prefix=${mono_dir}»
nice -n 19 make
nice -n 19 make install

# libtiff
cd «${mono_src}/tiff-3.9.1»
./configure «—prefix=${mono_dir}»
nice -n 19 make
nice -n 19 make install

# giflib
cd «${mono_src}/giflib-4.1.6»
./configure «—prefix=${mono_dir}»
nice -n 19 make
nice -n 19 make install

# bison
cd «${mono_src}/bison-2.4.1»
./configure —without-libintl-prefix «—prefix=${mono_dir}»
nice -n 19 make
nice -n 19 make install

# libxml2
cd «${mono_src}/libxml2-2.7.6»
./configure «—with-iconv=${mono_dir}» \
«—with-zlib=${mono_dir}» «—prefix=${mono_dir}»
nice -n 19 make
nice -n 19 make install

# libxslt
cd «${mono_src}/libxslt-1.1.26»
./configure «—prefix=${mono_dir}» «—with-iconv=${mono_dir}»
nice -n 19 make
nice -n 19 make install

# glib
cd «${mono_src}/glib-2.22.2»
./configure —with-libiconv=gnu «—prefix=${mono_dir}»
nice -n 19 make
nice -n 19 make install

# libgdiplus
cd «${mono_src}/libgdiplus-2.4.2»
./configure —with-libexif —with-libjpeg \
—with-libtiff —with-libgif «—prefix=${mono_dir}»
nice -n 19 make
nice -n 19 make install

# ===================================================================
# Build Mono core and extensions
# ——————————————————————-

# Mono
cd «${mono_src}/mono-2.4.2.3»
./configure «—prefix=${mono_dir}»
nice -n 19 make
nice -n 19 make install

# XSP, including Mono’s FastCGI support
cd «${mono_src}/xsp-2.4.2»
./configure «—prefix=${mono_dir}»
nice -n 19 make
nice -n 19 make install

# Basic (alternative Mono language, similar to .NET’s Visual Basic)
cd «${mono_src}/mono-basic-2.4.2»
./configure «—prefix=${mono_dir}»
nice -n 19 make
nice -n 19 make install

# ===================================================================
# Cleanup and wrap-up
# ——————————————————————-

# Remove intermediate source code, since it is no longer needed
#cd ~
#rm -rf «${mono_src}»

# Create a directory for the web-app launcher script
#mkdir -p «${HOME}/${DOMAIN}/cgi-bin»
#chmod 751 «${HOME}/${DOMAIN}/cgi-bin»

echo » *************** INSTALL COMPLETE! ***************»
# ===================================================================

Метки:, ,

Один комментарий в “Установка Mono на Dreamhost или другой выделенный сервер.”

Trackbacks/Pingbacks

  1. Обновление Mono до 2.10 на DreamHost