Разработка электроники,

Систем автоматики,

Программного обеспечения

8(981)186-50-82

ООО "Антех ПСБ",
Санкт-Петербург

anteh@bk.ru

antehru@gmail.com

©

Установка настройка mono 2.10, mod_mono 2.10, apache22 на FreeBSD 8.2

Сайт https://anteh.ru

Использовалась FreeBSD 8.2-RELEASE-p6, установлен apache22 с name-based virtual hosting.

Установка/функционирование ASP.NET возможна следующими способами:
связка первая ngnix+mono+xsp
вторая apache22+mono+mod_mono
mod_mono нужен для совместного использования Apache и Mono. Apache может работать с ASP.NET и без mod_mono, заменив его на комбинацию плагинов mod_proxy и mod_proxy_http и XSP web сервер. Это снизит производительность и XSP web сервер не поддерживает все возможности HTTP 1.1.
mod_mono автоматически запускает mod-mono-server, но какой версии указать нужно самостоятельно. Их пока 3 mod-mono-server(.NET 1.1), mod-mono-server2(.NET 2.0), mod-mono-server4(.NET 4.0). Какой будет запускаться задаётся директивой MonoServerPath site1.ru "/usr/local/bin/mod-mono-server2" в файле /usr/local/etc/apache22/Includes/mod_mono.conf. Если используется name-based virtual hosting и разные сайты требуют разных версий серверов, то попробую предположить, что в файле /usr/local/etc/apache22/extra/httpd-vhosts.conf для каждого сайта, который использует asp.net нужно прописать соответствующую директиву MonoServerPath "…".
Есть информация, что:
mod-mono-server используется для 1.0-1.1 ASP.NET
mod-mono-server2 используется для 2.0-3.5 ASP.NET
mod-mono-server4 используется для 4.0 ASP.NET
Проверял работоспособность под mod-mono-server2 ASP.NET 2.0, ASP.NET 3.5. Судя по тестовому примеру, предложенным xsp: /usr/local/lib/xsp/test с этой же версией запускается и ASP.NET 1.1 по крайней мере опцию [MonoServerPath site1.com "/usr/local/bin/mod-mono-server2"] не менял. ASP.NET 4.0 использовать не доводилось.

Ссылки: установка VirtualHost Apache mono FreeBSD http://wiki.visualwebgui.com/pages/index.php/Deploying_to_Mono_-_Install_FreeBSD_9
http://buddylindsey.com/how-to-get-asp-net-mvc-2-working-with-mono-in-10-steps/
http://www.rhyous.com/2011/03/02/asp-net-web-services-on-freebsd-and-apache-using-mono/
http://www.integratedwebsystems.com/2010/11/setting-up-mono-2-8-with-asp-net-4-0-and-mvc2-on-ubuntu-with-mysql-membership/

Можно глянуть сюда: http://www.mono-project.com/Mod_mono -настройка mod_mono, но для текущего случая настройки будут слегка отличаться.

Обновляем порты, систему. Перед обновлением, делаем резервные копии всех важных файлов настроек установленных портов.
Есть рекомендация: перед установкой mod_mono следует проверить наличие плагина для работы с PHP mod_php(mod_php5) и в случае, если он установлен удалить, так как данные плагины несовместимы между собой. В общем, если возникли проблемы, то через команду [pkg_deinstall -r <имя пакета> удаляет порт и все, что от него зависит].
pkg_deinstall -r удаляет порт и все, что от него зависит (т.е. рекурсия к листьям)
pkg_deinstall -R удаляет порт и все, от чего он зависит (т.е. рекурсия к корню)
Для чистоты эксперимента удалены установленные mod_mono mono xsp php apache22 и всё, что было связано с апачем, предварительно сохранив конфигурационные файлы, по инерции и openssh снёс через этот же SSH. Затем ставим apache22, mod_mono и не забываем установить libgdiplus . Проверяем работоспособность ASP.NET приложения.

1.Устанавливаем apache22:
# cd /usr/ports/www/apache22
# make && make install && make clean

2.В /etc/rc.conf прописываем запуск apache при старте:
apache22_enable="YES"

3.Если апач запущен, то останавливаем его:
# apachectl stop

Считаем, что apache-2.2.22_5 уже установлен, настроен и работает. Устанавливаем mod_mono, пакет сам установит нужные зависимости mono и xsp сервер. Проверяем существование возможных проблем с уже установленными портами:
# portaudit -Fad

Перед установкой mod_mono отключаем apache22

# apachectl stop
# whereis mod_mono
mod_mono: /usr/ports/www/mod_mono
# cd /usr/ports/www/mod_mono
# make && make install && make clean

После установки увидим что то вроде:

install -o root -g wheel -m 444 'mod_mono.conf' '/usr/local/etc/apache22/Includes/mod_mono.conf'
===> Compressing manual pages for ap22-mod_mono-2.10_1
===> Registering installation for ap22-mod_mono-2.10_1
===> Cleaning for mono-2.10.6
===> Cleaning for xsp-2.10.2
===> Cleaning for p5-XML-Parser-2.41
===> Cleaning for glib-2.28.8_4
===> Cleaning for gio-fam-backend-2.28.8_1
===> Cleaning for sqlite3-3.7.10
===> Cleaning for gamin-0.1.10_4
===> Cleaning for ap22-mod_mono-2.10_1

Смотрим версии установленных портов должны совпадать( 2.10==2.10==2.10 ):
mono-2.10.6 An open source implementation of .NET Development Framework
xsp-2.10.2 XSP server
ap22-mod_mono-2.10_1 Apache module for serving ASP.NET applications
Правда сейчас, при обновлении порта mono, его версия стала 3.0

Нужно убедиться, что права на папку /tmp =0777 (# chmod 0777 /tmp), иначе при старте, или перезапуске apache будут следующие ошибки и моно будет немоно:
# apachectl restart
[Wed Feb 22 12:40:31 2012] [crit] Failed to remove dashboard mutex file '/tmp/mod_mono_dashboard_XXGLOBAL_1.lock'; will attempt to continue. Permission denied
[Wed Feb 22 12:40:31 2012] [crit] (13)Permission denied: Failed to create mutex '/tmp/mod_mono_dashboard_XXGLOBAL_1.lock'
[Wed Feb 22 12:40:31 2012] [crit] (2)No such file or directory: Failed to create mutex '/tmp/mod_mono_dashboard_site1.ru_2.lock'

mod_mono установит конфигурацтонный файл mod_mono.conf в /usr/local/etc/apache22/Includes который будет автоматически включён в httpd.conf. В httpd.conf автоматически появится запись Include etc/apache22/Includes/*.conf
Для настройки mod_mono, или определённого сайта виртуальгого хостинга в файл /usr/local/etc/apache22/httpd.conf ничего дописывать не нужно. Конфигурационный файл /usr/local/etc/apache22/Includes/mod_mono.conf также не трогаем не редактируем, он будет запущен автоматически, да и при обновлении он перезаписывается. Все файлы .conf в директории /usr/local/etc/apache22/Includes запускаются автоматически в алфавитном порядке. Если в httpd.conf добавить "Include etc/apache22/Includes/mod_mono.conf" то можно получить неприятности. Редактируется только файл /usr/local/etc/apache22/extra/httpd-vhosts.conf настройки виртуального хостинга, для того сайта или сайтов, которые используют asp.net.

Возможное содержимое куска файла /usr/local/etc/apache22/extra/httpd-vhosts.conf, для сайта ASP.NET:

{
<VirtualHost *:80>
    ServerAdmin site1.com@inbox.ru
    ServerName site1.com
    ServerAlias www.site1.com
    DocumentRoot "/path/site1.com/site1.com"
    ErrorLog "/var/log/site1.com-error_log"
    CustomLog "/var/log/site1.com-customlog" combined

    MonoServerPath site1.com "/usr/local/bin/mod-mono-server2"
#Allow debug
    MonoDebug site1.com true
    MonoSetEnv site1.com MONO_IOMAP=all
    MonoApplications site1.com "/:/path/site1.com/site1.com"
    <Location "/">
        Allow from all
        Order allow,deny
        MonoSetServerAlias site1.com
        SetHandler mono
        SetOutputFilter DEFLATE
        SetEnvIfNoCase Request_UI "\.(?:gif|jpe?g|png)$" no-gzip dont-vary
    </Location>
    <IfModule mod_deflate.c>
        AddOutputFilterByType DEFLATE text/html text/plain text/xml text/javascript
    </IfModule>
#    <Directory /path/site1.com/site1.com>
#       Options Indexes FollowSymLinks
#        AllowOverride None
#       Order allow,deny
#       Allow from all
#    </Directory>
#MONO CONTROL PANEL
#    <Location /mono>
#        SetHandler mono-ctrl
#       Order deny,allow
#       Deny from all
#Address
#       Allow from 127.0.0.1
#    </Location>
</VirtualHost>
}

Работоспособность mono можно проверить отдельно:
Создаём в какой ни-будь директории, через ee файл test.cs следующего содержания:

class lala
{    public static void Main()
    {  System.Console.WriteLine("MONO is working on FreeBSD");
    }
}
В конце файла ставим перевод строки на всякий

Компилируем test.cs:
# mcs test.cs
При успешной компиляции не выводится никаких сообщений и в текущей папке появится test.exe
Запускаем исполняемый файл, и видим сообщение:
# mono test.exe
MONO is working on FreeBSD

xsp порт ASP.NET web сервер будет добавлен в /usr/local/lib/xsp

По умолчанию директория размещения сайта будет /usr/local/www/apache22/data в текущем случае, через настройки виртуального хостинга директория будет заменена на "/path/site1.com/site1.com"

Намеренно не приводится информация по настройке прав на эту директорию и запрет выхода удалённого клиента за её пределы через openssh. Это отдельная тема.

4.Теперь важно установить дополнительные библиотеки, для работоспособности обслуживаемых ASP.NET web сайтов:
# cd /usr/ports/x11-toolkits/libgdiplus
# make && make install && make clean

И самое важное действо -проверка работоспособности всей связки
При установке xsp сервера, cтавится автоматически с mod_mono, в директории /usr/local/lib/xsp/test находится тестовый сайт, со многими элементами отображаемыми на web странице. Т.е. всё, что находится в /usr/local/lib/xsp/test копируем в текущем случае в "/path/site1.com/site1.com. Скриншоты сделаны при цветовой схеме "контрастная чёрная". Тестирование производилось на реальном удалённом сервере. Запускаем апач # apachectl start заходим на страницу и видим: MonoApache22

Это дерево представляет многие элементы web страницы, все элементы должны работать. Скриншоты некоторых элементов тестового web сайта MonoApache22

Ошибки на странице появляются при загрузке следующих 4х ссылок
1.System.Web.HttpException -Cookie-less, hangman. Ошибки появляются из-за отсутствия соответствующих ссылок. Папок сookieless и hangman-vb. При создании например /path/site1.com/site1.com/1.1/сookieless и копировании в неё содержимого /usr/local/lib/xsp/test/1.1/authtest ошибка пропадала.
2.System.Web.Compilation.CompilationException -includetest. Здесь ошибка в файле /path/anteh.com/anteh.com/1.1/asp.net/includetest.aspx

3.System.TypeLoadException -monodoc.ashx

В общем всё работает. Здесь были проверены только ASP.NET версий 1.1 и 2.0. Отдельно была проверена работоспособность ASP.NET 3.5 web сайта обслуживаемого mod-mono-server2. Проект тестового web сайта VS2008 размещался в соответствующей директории удалённого сервера.

Замечены пару нюансов, при перезапуске apache22 через # apachectl stop # apachectl start будет появляться следующее сообщение:
# apachectl stop
# apachectl start
[Thu Feb 23 01:15:54 2012] [crit] (17)File exists: Failed to create shared memory segment for backend 'XXGLOBAL' at '/tmp/mod_mono_dashboard_XXGLOBAL_1'.
В сообщении говорится, что файл уже существует и повторно такой создать не получится. На эту тему нашёл следующее:
It means that your apache hasn't been shutdown properly - it failed to remove
the shared memory segments it allocated. You have two options at this point:
- reboot the server
- use the 'ipcs -m' command to list the shared memory segments and then 'ipcrm -m' shmid for each of the former apache segments (you can tell which belonged to apache by the owner - it will be the user apache runs as). Before removing the segments, though, make sure that you stop apache.

В общем предположу, что на это можно не обращать внимание.
Собственно в /tmp после запуска апача создаются некоторые представления обслуживаемых сайтов.

Copyright ©Новиков Алексей Александрович,

2012-2017 Санкт-Петербург, 197372, ООО "Антех ПСБ",

anteh собака bk.ru