Установка ASP.NET (+Mono 2.6) в Debian/Ubuntu Linux
Для работы сайтов, написанных на ASP.NET, необходимо поставить среду выполнения IL байт-кода и собственно веб-сервер. Таким образом, существует, как минимум, два способа заставить работать сайт на ASP.NET в Linux. Первый – поставить родной для ASP.NET фреймворк Microsoft .NET Framework для работы под управлением Wine, второй – установить Mono и адаптировать под него свой сайт.
Но не все так просто и безобидно. Оба метода не лишены недостатков. Прежде всего, Microsoft .NET Framework является дополнением к операционной системе Windows, и, установив его под Wine, вы нарушите лицензионное соглашение. Кроме того, даже если вы, нарушив лицензионное соглашение, все-таки установите его под Wine, неизвестно как он покажет себя в плане стабильности и производительности, а это очень важно для сервера. Во втором случае существует такая особенность, как неполная совместимость Mono с Net. Framework. Поэтому, если изначально сайт не разрабатывался для работы в Mono, вероятно, часть кода придется переписать. Впрочем, переписывать код в любом случае придется, в частности, при миграции с MSSQL или Oracle, с которыми работает большинство сайтов на ASP.NET, это коснется кода, взаимодействующего с базой данных.
В моем случае, целью была изначальная разработка сайта на APS.NET для сервера с Linux. Поэтому был создан локальный VPS, на который теперь нужно установить Mono, веб-сервер и сделать минимально необходимые настройки. Итак, коннектимся к серверу по SSH, вводим логин и пароль. Мой сервер был никак почти никак не настроен, поэтому первым делом я установил sudo и добавил себя в список /etc/sudoers.
aptitude install sudo
Все, теперь все операции через sudo. У меня на сервере стоит Debian, поэтому все, что далее написано, применимо к любому дистрибутиву Linux, основанному на Debian, в том числе и к большинству дистрибутивов, основанных на Ubuntu.
Итак, если вы используете Debian, то на первый взляд тут все довольно печально – самой старшей версией, доступной в стандартном репозитории стабильной ветки, является Mono 1.9.1. Идем на сайт Mono. Слегка порывшись в документации можно увидеть, что все-таки существует возможность поставить версию 2.4.2.3. Для этого нужно добавить репозиторий в файл /etc/apt/sources.list:
deb http://www.backports.org/debian lenny-backports main
Обновить список пакетов и произвести установку:
sudo aptitude update
sudo aptitude -t lenny-backports install mono-runtime
В репозитории Ubuntu последних версий, версия 2.4.2.3 доступна, поэтому если нужна эта версия, ее можно установить так:
sudo aptitude install mono-runtime
Вначале собственно она и была мной установлена, но потом там обнаружились некоторые нужные мне и не реализованные в этой версии функции. Нужно было работать c SSL, а также отправить письмо через Google SMTP. Для работы с SSL было найдено несколько способов реализации этих возможностей, в Windows все работало. В Linux при соединении по SSL работал только устаревший способ. Для работы с SMTP Google, потребовалось установить сертификат, но и после этого отправка писем не работала. При установке другого сертификата, вообще возникало исключение. Для решения данной проблемы, было найдено 3 варианта, изменить логику и не отсылать письма через Google, поставить патчи, либо перейти на более новую версию.
Установка Mono 2.6
Сначала был найден
Для установки Mono 2.6.1 нужно добавить в файл /etc/apt/sources.list два репозитория – тестируемых пакетов Debian, для получения свежих версий некоторых пакетов, и репозиторий OpenSuse. Во втором находятся несколько версий Mono 2.6.1 и можно выбрать нужную версию. Так как конкретно для Debian там был только пакет libgdiplus, я добавил репозиторий для Ubuntu 9.10:
deb http://ftp.de.debian.org/debian squeeze main
deb
http://download.opensuse.org/repositories/home:/surfzoid:/DebianUbuntu:/Mono/Ubuntu_9.10_standard
./
Обновляем список пакетов и устанавливаем Mono:
sudo aptutude update
sudo aptitude install mono-runtime
Итак, минимальная конфигурация Mono установлена. Проверить, что установилась именно Mono версии 2.6.1, можно, набрав команду:
mono -V
Теперь можно доустановить другие нужные пакеты Mono или оставить все как есть.
Настройка nginx в качестве front-end к xsp2.
В качестве веб-сервера для работы ASP.NET в Linux можно использовать как стандартный Mono-сервер xsp2, так и Apache или nginx. Первый, в общем-то, целесообразно использовать только для обработки ASP.NET страниц. В Apache обрабатывать страницы APS.NET можно путем подключения модуля mod_mono или через FastCGI. В третьем случае страницы ASP.Net можно обрабатывать либо через FastCGI, следуя руководству, расположенному на сайте Mono, либо, используя nginx в качестве front-end сервера, а xsp2 в качестве back-end сервера.
Очевидно, что для эффективной работы связка с веб-сервером nginx более предпочтительна, по сравнению с Apache. Вначале я настроил связку через FastCGI и протестировал на простой странице ASP.NET, которая показывала текущее время. В итоге получилось, что при обработке каждой тысячи запросов возникает 2-3 ошибки (посылалось по 10 запросов одновременно). После перенастройки nginx для проксирования страниц на веб-сервер xsp2, такой проблемы не обнаружилось даже после увеличения количества одновременных запросов до 100.
Итак, процесс установки nginx в качестве front-end сервера к xsp2, заключается в следующем.
Установка и настройка nginx:
sudo aptitude install nginx
В файле конфигурации /etc/nginx/nginx.conf в секции http записываем настройки веб-сервера.
upstream backend {
server 127.0.0.1:8080; #адрес на котором находится веб-приложение
}
server {
listen 80;
server_name myvps; #имя сервера myvps
access_log /var/log/nginx/myvps.access.log;
error_log /var/log/nginx/myvps.error.log;
location / {
root /var/www/myvps/; #корневая директория
index index.html index.htm default.aspx Default.aspx;
}
#далее расширения файлов, которые будет обрабатывать xsp2
location ~ \.(aspx|asmx|ashx|asax|ascx|soap|rem|axd|cs|config|dll)$ {
#настройки проксирования
proxy_pass http://backend;
#передаваемые заголовки
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}Установка xsp2
sudo aptitude install mono-xsp2
При желании можно сконфигурировать автозапуск веб-сервера xsp2. Сделать это очень просто, например, через .webapp-файл, который имеет следующий формат
<apps>
<web-application>
<name>{имя Web-приложения}</name>
<vhost>{Имя виртуального хоста}</vhost>
<vport>{Порт для Web-приложения}</vport>
<vpath>{Путь относительно корневой директории виртуального сервера}</vpath>
<path>{Физический путь к файлам aspx}</path>
<!-- <enabled> по умолчанию – true -->
<enabled>{true|false}</enabled>
</web-application>
</apps>Тегов web-application может быть несколько, по одному на каждое Web-приложение.
Конфигурационной директорией, указанной в стандартном скрипте для автозапуска, является /etc/xsp2/. В ней находится файл debian.webapp, используемый в качестве конфигурационного по умолчанию. Можно внести измения прямо в него. Например, для запуска Web-приложения, используемого выше для проверки работоспособности сервера, изменения выглядят так:
<apps>
<web-application>
<name>Mono server test application</name>
<vhost>myvps</vhost>
<vport>8080</vport>
<vpath>/</vpath>
<path>/var/www/myvps</path>
<enabled>true</enabled>
</web-application>
</apps>Также, нужно убрать опцию --port $post из скрипта автозапуска, в противном случае указанные в конфигурационном .webapp-файле порты будут проигнорированы.
Теперь нужно проверить работоспособность. Распакуйте и поместите тестовые файлы в папку /var/www/myvps. Запустите nginx и xsp2:
sudo /etc/init.d/nginx start
xsp2 --applications myvps:/:/var/www/myvps --port 8080 --root /var/www/myvps/
Теперь в браузере можно набрать адрес http://myvps/ и откроется страница, показывающая текущее время. Также, можно проверить скрипт автозапуска. Для этого нажимаем Enter для остановки xsp2 и запускаем его через скрипт автозапуска:
sudo /etc/init.d/mono-xsp2 start
Снова набираем в адресной строке браузера адрес http://myvps/ и видим, что все работает.
На этом установка веб-сервера для ASP.NET в Linux завершена. Теперь можно произвести дополнительные настройки веб-серверов nginx и xsp2, поставить базу данных и разместить сайт.
Обсуждение статьи