Как стать автором
Обновить

ASP.NET MVC 3 сервер на NAS Synology — solution

Время на прочтение4 мин
Количество просмотров5K

Имея в хозяйстве замечательный накопитель от компании Synology, я довольно долгое время грустил по поводу того, что в нём отсутствует хостинг .NET приложений. И вот, вооружившись мат. частью приведённой в статье habrahabr.ru/post/121159 я озадачился созданием домашнего сервера для проектов на ASP.NET MVC. Пакет mono там довольно старый, а классическая последовательность команд для сборки оного не привела к успеху. Информация собиралась из различных источников, в том числе и с хабра, по крупицам давая понимание, что и в какой последовательности необходимо делать. Прохождение этого квеста я как раз и хочу описать в этой статье. Надеюсь кому-то пригодится.

Итого, дано:
1. Железо: NAS Synology 110j с процессором Marvell mv5281 на борту.
2. ОС DSM 4.0 (на базе малораспространённого дистрибутива Linux)
Необходимо: Установить последнюю версию mono + xsp.

Подготовка


Компания Synology не озадачилась предоставить возможности для установки дополнительных пакетов традиционным для *nix систем способом, т.е. через консоль. Поэтому для начала необходимо ознакомится с топиком по адресу www.synology-forum.ru/index.php?showtopic=38, и выполнить необходимые телодвижения. Конечным результатом будет установка и запуск консольного менеджера пакетов ipkg. Я не могу в этой статье привести краткий конспект, поскольку накопители Synology выпускаются на различных процессорах и рецепт для каждой архитектуры будет свой.

Сборка и установка MONO


После того как заработал менеджер пакетов ipkg, получаем и распаковываем последние исходники mono (на тот момент это был 2.10.9). По ходу повествования, если необходимо, доустанавливайте необходимые пакеты с помощью ipkg самостоятельно, поскольку в силу специфики «железки» я не могу полностью виртуализировать среду для чистого эксперимента, а многие пакеты у меня были поставлены по ходу «плясок с бубном» и я уже подзабыл что необходимо устанавливать дополнительно.
wget http://download.mono-project.com/sources/mono/mono-2.10.9.tar.bz2
tar -xvf mono-2.10.9.tar.bz2


Процесс сборки mono:
cd mono-2.10.9
./configure --prefix=/usr --sysconfdir=/etc/mono

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

Напоминаю, что просто команда make у меня не справилась с компиляцией. Необходимо добавить флаги '-Wl,-lpthread,-lrt'. Но этого оказалось мало. При линковке с библиотекой pthread в последней отсутствовали некоторые функции. Возможно, что это связано с архитектурой и на Intel`ах будет всё OK. Тем не менее, на моём ARM непосредственно перед компиляцией, мне дополнительно пришлось выполнить следующие заклинания:

mkdir /opt/arm-none-linux-gnueabi/lib_disabled
mv /opt/arm-none-linux-gnueabi/lib/libpthread* /opt/arm-none-linux-gnueabi/lib_disabled
cp /lib/libpthread.so.0 /opt/arm-none-linux-gnueabi/lib/
cd /opt/arm-none-linux-gnueabi/lib/
ln -s libpthread.so.0 libpthread.so
ln -s libpthread.so.0 libpthread-2.5.so


В /opt/etc/ipkg/cross-feed.conf изменить на
src/gz cross ipkg.nslu2-linux.org/feeds/optware/cs08q1armel/cross/stable

ipkg remove perl
ipkg install perl


Магия с libpthread была выяснена гуглением и как ясно из команд мы подменяем библиотеку. Мне не ведомо, почему так случилось, но это факт. А вот переустановка perl – это вообще нечто. У меня изначально пакеты ставились из «нестабильной» ветки (unstable). Возможно, что в вашем случае всё будет нормально.

Итак, запасаемся попкорном и компилируем… процесс не быстрый и местами даже интересный.
make CFLAGS+='-Wl,-lpthread,-lrt'


Итак, если компиляция mono закончилось успешно, устанавливаем его командой
make install

и проверим
mono --version 

должна выдать что-то вроде
Mono JIT compiler version 2.10.9 (tarball Sun Apr 15 18:40:39 MSK 2012)
Copyright (C) 2002-2011 Novell, Inc, Xamarin, Inc and Contributors. www.mono-project.com
        TLS:           __thread
        SIGSEGV:       normal
        Notifications: epoll
        Architecture:  armel,soft-float
        Disabled:      none
        Misc:          softdebug
        LLVM:          supported, not enabled.
        GC:            Included Boehm (with typed GC and Parallel Mark)


Сборка и проверка XSP



Среда установлена, теперь необходимо установить XSP – сервер ASP.NET приложений для mono. Я понимаю, что «сервер ASP.NET» для XSP — это звучит слишком сильно, но и не забываем, на чём он будет эксплуатироваться.

Здесь всё банально…
wget http://download.mono-project.com/sources/xsp/xsp-2.10.tar.bz2
tar -xvf xsp-2.10.tar.bz2
cd xsp-2.10
./configure
make install

после установки проверим:
cd /src/Mono.WebServer.XSP
mono xsp4.exe --applications /:./../../test

должна выдать
xsp4
Listening on address: 0.0.0.0
Root directory:  /xsp-2.10/src/Mono.WebServer.XSP
Listening on port: 8080 (non-secure)
Hit Return to stop the server.

Запускаем броузер, набираем адрес NAS и порт 8080. Наш сервер должен выдать тестовую страницу


Готовим подопытное ASP.NET MVC приложение



1. Создаём проект ASP.NET MVC 3 Web Application


2. Я выбирал Internet Application


3. В исходный текст внесём небольшое исправление


4. Я настроил публикацию через файловую систему (выберите по вкусу то, что настроено на вашем NAS, например FTP)


5. Запускаем XSP на папку в которую будем деплоить наше приложение
mono xsp4.exe --applications /:./volume1/web/TestMvcOnSynology


6. Далее необходимо включить в проект сборки MVC, чтобы они деплоились вместе с нашим приложением, поскольку в MONO они отсутствуют. Для этого в свойствах подключенных сборок устанавливаем свойство «Копировать локально» в True. Список сборок: System.Web.Helpers, System.Web.Mvc, System.Web.WebPages, добавляем сборки System.Web.Razor, System.Web.WebPages.Razor, System.Web.WebPages.Deployment и также устанавливаем свойство «копировать локально» в true.
7. Так же, в целях ознакомления, я «вырезаю» из приложения авторизацию и все упоминания об EntityFramework (это тема отдельной статьи).
1. Удаляем ссылку на EntityFramework, System.Data.Entity
2. Исключаем из проекта AccountController.cs;
3. из Моделей исключаем AccountModels.cs;
4. из представлений исключаем полностью папку Account
5. В _Layout.cshtml удаляем секцию с id=logindisplay
6. Исключаем из проекта файл _LogOnPartial.cshtml

Всё. Можно деплоить приложение и наслаждаться результатом:


Напоследок



1. Учитывая, что Microsoft не так давно открыла исходники всего стека ASP.NET вероятнее всего более правильно будет подключить пакет MVC из codeplex`а к приложению и все ссылки переключить на него и в таком виде деплоить приложение.
2. Вместо вырезания авторизации необходимо реализовать собственные механизм без использования EntityFramework, но, как я указывал, это отдельная тема.
Теги:
Хабы:
Всего голосов 22: ↑18 и ↓4+14
Комментарии5

Публикации

Истории

Работа

.NET разработчик
68 вакансий

Ближайшие события

Конференция HR API 2024
Дата14 – 15 июня
Время10:00 – 18:00
Место
Санкт-ПетербургОнлайн
Конференция «IT IS CONF 2024»
Дата20 июня
Время09:00 – 19:00
Место
Екатеринбург
Summer Merge
Дата28 – 30 июня
Время11:00
Место
Ульяновская область