О статье.
Эта статья является переводом «Mono on Shared Hosting at DreamHost through FastCGI» с некоторыми дополнениями с моей стороны. В оригинальной статье например, установка приложения Mono происходит в подкаталог домена, я устанавливал его как обработчик саб-домена. Из за поверхностного знания конфигурации Apache, это потребовало несколько дополнительных часов борьбы с 500-й ошибкой.
Сбор и установка Mono 2.4.2.3.
Скрипт, представленный здесь как есть, выполнялся у меня 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! ***************»
# ===================================================================
Похожие статьи
- 17 января 2010 -- Сборка Mono 2.6.1 из исходного кода (14)
- 14 июня 2011 -- Обновление Mono до 2.10 на DreamHost (0)
- 24 июня 2011 -- Установка Mono 2.10.2 и MonoDevelop 2.6 на Debian (1)
- 25 июня 2011 -- Компиляция Mono 2.10.2 с исходного кода (3)
- 21 января 2010 -- Mono 2.6.1 и VirtualBox (20)
Один комментарий в “Установка Mono на Dreamhost или другой выделенный сервер.”
Trackbacks/Pingbacks