Pull to refresh

Запускаем приложение ASP.NET MVC 4 на Ubuntu Server 12.04 + nginx

Reading time 5 min
Views 45K
Захотелось мне посмотреть, как работает реализация .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.
ОС установлена без роли:
image

Рекомендую сразу после установки ОС в виртуальную машину сохранить снапшот чистой системы. Очень удобно для экспериментов.
Тестирование скрипта происходило в домашней директории с непривилегированного юзера, но с правами на 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?
image

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

image

Пользуйтесь на здоровье.

Планы


  • В первую очередь — доработать monoserve скрипт.
  • Далее, на мой взгляд, стоит добавить в шаблон сайта поддержку БД. В нашем случае будем разворачивать PostgreSQL и дружить их с шаблоном ASP.NET MVC4.
  • Вместо git clone репозитория качать архив необходимого релиза. Это быстрее, но с другой стороны, локальный репозиторий можно быстрее актуализировать, переключить на другую версию.
  • Добавить обработку ошибок с прекращением дальнейшего выполнения скрипта.


Приветствуются замечания к скрипту, пожелания на его будущие доработки. Спасибо.

Ссылки на используемые материалы


FastCGI — Mono
Run ASP.Net MVC4 on Ubuntu 12.10
Mono / FastCGI Startup Script
Tags:
Hubs:
+41
Comments 51
Comments Comments 51

Articles