Захотелось мне посмотреть, как работает реализация .NET на Linux. Решено было развернуть Ubuntu Server на нашем гипервизоре, установить свежий пакет mono и через nginx запустить ASP.NET MVC4 сайт.
На официальном сайте mono готовый пакет для Ubuntu только 2-х летней давности. С этого момента начались поиски в сети путей осуществления задуманного. Результатом полученного опыта стал скрипт для автоматического развертывания на голой Ubuntu Server 12.04.3 или 13.04 всего необходимого для запуска сайтов ASP.NET MVC4:
- Соберем из исходников и установим mono 3.2.1
- Добавим monoserve скрипт в init.d для автоматического запуска сайтов и управления ими.
- Установим nginx 1.4.1
- Создадим и настроим простой сайт, чтобы проверить работоспособность всей связки.
Сразу под катом находится строчка для автоматического выполнения всей процедуры, описанной в статье.
Установка всего одной строчкой в консоли
Одна строчка для закачивания скрипта, установки ему права на запуск и собственно запуска. Вначале попросит жмякнуть [Enter] для добавления репозитория, а позже еще раз попросит пароль на sudo.
wget https://bitbucket.org/mindbar/install-mono/raw/master/install-nginx-mono.sh && sudo chmod +x install-nginx-mono.sh && ./install-nginx-mono.sh
Выполнение всего скрипта зависит от скорости интернета и мощности железа. В среднем около 40 минут.
Требования
Предполагается установка на чистую Ubuntu Server 12.04.3 x64 либо Ubuntu Server 13.04 x64.
ОС установлена без роли:
Рекомендую сразу после установки ОС в виртуальную машину сохранить снапшот чистой системы. Очень удобно для экспериментов.
Тестирование скрипта происходило в домашней директории с непривелигоравнного юзера, но с правами на sudo.
Установка mono & co
Для установки mono нам нужны некоторые зависимости и утилиты. Установим их:
sudo apt-get -y install build-essential git autoconf libtool automake gettext libglib2.0-dev libjpeg-dev libpng12-dev libgif-dev libexif-dev libx11-dev libxrender-dev libfreetype6-dev libfontconfig1-dev
После этого клонируем и собираем libgdiplus, mono и xsp именно в такой последовательности. Все файлы будем держать в отдельной директории ~/monobuild, а устанавливать в /usr/local
На момент написания статьи версия libgdiplus была 2.10.8. Последнюю версию можно узнать тут: github.com/mono/libgdiplus/releases
mkdir monobuild
cd monobuild
git clone https://github.com/mono/libgdiplus.git
cd libgdiplus
git checkout 2.10.8
./autogen.sh --prefix=/usr/local
make && sudo make install
cd ..
Собственно mono. Новые релизы выпускаются достаточно часто — раз в месяц-два. Текущая версия — mono-3.2.1. Последнюю версию можно узнать тут: github.com/mono/mono/releases
Интересный нюанс: чтобы собрать моно нужно сначала собрать компилятор monolite. Благо, он идет в комплекте, нужно только сначала собрать его и потом передать к нему путь для сборки собственно mono:
git clone https://github.com/mono/mono.git
cd mono
git checkout mono-3.2.1
./autogen.sh --prefix=/usr/local
make get-monolite-latest && make EXTERNAL_MCS=${PWD}/mcs/class/lib/monolite/gmcs.exe && sudo make install
cd ..
Дошла очередь до сервера xsp — веб сервер для отладки сайтов на mono. Написан на C#. Вместе с ним идут компоненты FastCGI. Текущая версия — 3.0.11. Последнюю версию можно узнать тут: github.com/mono/xsp/releases
git clone https://github.com/mono/xsp.git
cd xsp
git checkout 3.0.11
./autogen.sh --prefix=/usr/local
make && sudo make install
cd ..
cd ..
Сверим версию mono -V?
nginx
nginx является одним из рекомендуемых веб серверов для связки с mono. Возможно взаимодействие nginx+mono через FastCGI (предпочтительный метод) либо как reverse proxy для xsp.
xsp — это сервер для тестирования и отладки сайтов на mono. Для пром среды его использование не рекомендуется.
Ничего особенного в устанавке nginx нет. Подключаем репозиторий, обновляем список пакетов и устанавливаем nginx.
sudo apt-get -y install python-software-properties
sudo add-apt-repository ppa:nginx/stable
sudo apt-get update
sudo apt-get -y install nginx
monoserve
Сайты должны запускаться вместе с сервером.
Предлагаемая конфигурация сродни тем, что используются в nginx:
- В директории /usr/local/etc/mono/fcgi/apps-available/ хранятся настройки доступных серверов
- В директории /usr/local/etc/mono/fcgi/apps-enabled/ создаются симлинки на те из них, которые сейчас должны работать
Написан скрипт monoserve, который берет список сайтов из файлов в директории /usr/local/etc/mono/fcgi/apps-enabled и запускает их как демоны от пользователя www-data.
Пример содержания такого файла (одна строчка):
/:/home/anvol/www
Как видим, это всего лишь "/:" + путь к приложению. К сожалению, текущая версия скрипта правильно запускает только один такой сервер. Планируется доработка monoserve, чтобы в конфигурационных файлах можно было указать также порт приложения либо название unix-socket'а. Тогда станет возможном запустить несколько сайтов на одном сервере.
А пока, загрузим из подготовленного мной репозитория чуть переработанный шаблон ASP.NET MVC4 сайта в папку ~/www и настроим monoserve для его запуска
git clone https://mindbar@bitbucket.org/mindbar/mono-mvc4-default.git www
sudo mkdir /usr/local/etc/mono/fcgi
sudo mkdir /usr/local/etc/mono/fcgi/apps-available
sudo mkdir /usr/local/etc/mono/fcgi/apps-enabled
sudo touch /usr/local/etc/mono/fcgi/apps-available/default
echo "/:`pwd`/www" | sudo tee -a /usr/local/etc/mono/fcgi/apps-available/default
sudo ln -s /usr/local/etc/mono/fcgi/apps-available/default /usr/local/etc/mono/fcgi/apps-enabled/default
wget https://bitbucket.org/mindbar/install-mono/raw/master/monoserve
sudo cp monoserve /etc/init.d/monoserve
sudo chmod +x /etc/init.d/monoserve
sudo update-rc.d monoserve defaults
sudo /etc/init.d/monoserve start
rm monoserve
После этого мы имеем запущенный fastcgi-mono-server4 на порту 9001, который готов выполнять сайт из папки ~/www
Настройка nginx
Завершающим аккордом будет настройка nginx. Первым делом мы отключим дефолтный сервер убрав симлинк на него из /etc/nginx/sites-enabled/:
sudo rm /etc/nginx/sites-enabled/default
Теперь добавим в /etc/nginx/fastcgi_params необходимые настройки:
echo "# mono config" | sudo tee -a /etc/nginx/fastcgi_params
echo "fastcgi_param PATH_INFO "";" | sudo tee -a /etc/nginx/fastcgi_params
echo "fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;" | sudo tee -a /etc/nginx/fastcgi_params
Напишем конфигурацию для нашего сервера mono:
echo "server {" | sudo tee -a /etc/nginx/sites-available/mono-default
echo " listen 80;" | sudo tee -a /etc/nginx/sites-available/mono-default
echo " server_name localhost;" | sudo tee -a /etc/nginx/sites-available/mono-default
echo " location / {" | sudo tee -a /etc/nginx/sites-available/mono-default
echo " root `pwd`/www/;" | sudo tee -a /etc/nginx/sites-available/mono-default
echo " index index.html index.htm default.aspx Default.aspx;" | sudo tee -a /etc/nginx/sites-available/mono-default
echo " fastcgi_index Home;" | sudo tee -a /etc/nginx/sites-available/mono-default
echo " fastcgi_pass 127.0.0.1:9001;" | sudo tee -a /etc/nginx/sites-available/mono-default
echo " include /etc/nginx/fastcgi_params;" | sudo tee -a /etc/nginx/sites-available/mono-default
echo " }" | sudo tee -a /etc/nginx/sites-available/mono-default
echo "}" | sudo tee -a /etc/nginx/sites-available/mono-default
Включаем нашу конфигурацию, создавая симлинк в /etc/nginx/sites-enabled, и просим nginx принять изменения в работу
sudo ln -s /etc/nginx/sites-available/mono-default /etc/nginx/sites-enabled/mono-default
sudo /etc/init.d/nginx restart
Заходим браузером на ip-вашей-виртуалки либо проверяем работу сайта в консоли:
wget localhost && cat index.html
Пользуйтесь на здоровье.
Планы
- В первую очередь — доработать monoserve скрипт.
- Далее, на мой взгляд, стоит добавить в шаблон сайта поддержку БД. В нашем случае будем разворачивать PostgreSQL и дружить их с шаблоном ASP.NET MVC4.
- Вместо git clone репозитория качать архив необходимого релиза. Это быстрее, но с другой стороны, локальный репозиторий можно быстрее актуализировать, переключить на другую версию.
- Добавить обработку ошибок с прекращением дальнейшего выполнения скрипта.
Приветствуются замечания к скрипту, пожелания на его будущие доработки. Спасибо.
Ссылки на используемые материалы
FastCGI — Mono
Run ASP.Net MVC4 on Ubuntu 12.10
Mono / FastCGI Startup Script
Автор: Anvol