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


    Имея в хозяйстве замечательный накопитель от компании 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, но, как я указывал, это отдельная тема.
    Метки:
    • +14
    • 3,7k
    • 5
    Поделиться публикацией
    Реклама помогает поддерживать и развивать наши сервисы

    Подробнее
    Реклама
    Комментарии 5
    • +1
      Я считаю, что у связки *nix + Mono + ASP.NET (MVC) большое будущее.

      Хотел было написать, что XSP не рекомендуется к использованию на боевых серверах — только для разработки, но зашел на страницу, где раньше красовалось что-то вроде «Development only» и не нашел ничего такого. Может быть, пришло время, сервер неплохо показал себя и разработчики решили, что XSP готов для полноценного использования.
      • +1
        А что тогда, если не XSP?
      • 0
        Неделя ASP MVC на хабре :)
        А вопрос, на последнем скрине верстка поехала из за чего?
        • 0
          Про MVC: ага, после таких постов даже мне захотелось попробовать ASP.NET MVC :) Хотя Rails наше всё
          • 0
            Наблюдал и на Firefox и на IE. Это после того, как удалил блок с логином/паролем.

          Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.