Apache 2.2.x .NET (Mono) para despachar paginas ASPX y Appliciones C#
By: Date: mayo 9, 2013 Categories: Consultoria y Manuales,Programación

Mono es una iniciativa de Miguel de Icaza que ha traído al mundo de GNU/Linux el poder de .NET para desarrollar o ejecutar aplicaciones. Para la nueva generación de programadores WEB que usan webservice o aplicaciones con esta tecnología este articulo será interesante porque podrán usar un GNU/Linux para despachar paginas ASPX sin tener que instalar Internet Información Server o algún Windows Server

Debido a que RedHat y por lo tanto CentOS no tienen soporte para Mono deberemos instalar todo desde sus códigos fuentes, compilarlos y configurarlos. ¿ Por que explico como hacerlo en RedHat / CentOS ? porque otras distros como Ubuntu es tan simple como ejecutar un par de comandos apt-get install y queda resuelto en 5 minutos. Sin embargo RedHat y CentOS son plataformas profesionales es donde es deseable tener este soporte en producción. Sin embargo Mono, debido a unas diferencias de los que toman decisiones en RedHat no tiene soporte nativo. Al menos eso fue lo que dijo en algún momento el propio Miguel de Icaza.

Requerimientos al momento de escribir este artículo.
El código fuente de Mono 2.10
El código fuente de XSP 2.10
El código fuente de mod_mono 2.10
El código fuente de Apache es 2.2.24 al momento de escribir esto, existe Apache 2.4.2, sin embargo Mod_Mono no compila correctamente en la serie 2.4 de apache. Tal vez en unos meses esto quede solucionado.

Obtenido los códigos fuentes de mono
URL de mono
http://download.mono-project.com/sources/mono/mono-2.10.tar.bz2
URL de mod_mono
http://download.mono-project.com/sources/mod_mono/mod_mono-2.10.tar.bz2
URL de XSP
http://download.mono-project.com/sources/xsp/xsp-2.10.tar.bz2

URL del código fuente de Apache 2.2.24
http://www.us.apache.org/dist//httpd/httpd-2.2.24.tar.gz

1 Se compila el código fuente de mono
./configure –prefix=/usr/mono-2.10
make
make install

Terminada la instalación de mono se debe agregar a la variable de PATH la ruta de los binarios de mono para poder ejecutarlos sin problemas desde Shell, si su Shell es BASH, puede agregar en la línea de comandos y en el archivo .bash_profile las siguientes líneas.
PATH=$PATH:$HOME/bin:/usr/mono-2.10/bin
export PATH
2 Se compila XSP, antes de iniciar la compilación hay que SETear la variable PKG_CONFIG_PATH con la ruta del pkgconfig que está dentro de la estructura de directorios de mono previamente instalado. En este caso el valor es /usr/mono-2.10/lib/pkgconfig/

export PKG_CONFIG_PATH=/usr/mono-2.10/lib/pkgconfig/

Una vez con la variable el código fuente de XSP se compila con los mismos usados en la compilación pasada de mono

./configure –prefix=/usr/mono-2.10
make
make install
3 Compilando e Instalando Apache
./configure –prefix=/usr/apache2.2.24 –enable-so –enable-cgi –enable-ssl
make
make install

4 Compilando e Instalando mod_mono
./configure –prefix=/usr/mono-2.10/ –with-mono-prefix=/usr/mono-2.10/ –with-apxs=/usr/apache2.2.24/bin/apxs
make
make install
Hasta este punto hay instalado todo el soporte necesario para ejecutar y compilar programas de .NET en la consola y escritorio de Linux, así como para ejecutar aplicaciones WEB de .NET aunque aún no está terminada la configuración.

Configurar Apache y Mod_Mono para ejecutar aplicaciones .NET

Edita el siguiente archivo
/usr/apache2.2.24/conf/httpd.conf

Agregue las siguientes líneas

Include conf/mod_mono.conf
MonoServerPath “/usr/mono2.10/bin/mod-mono-server4”
MonoAutoApplication enabled

           
<location /mono>
             
SetHandler mono-ctrl
             
Order deny,allow
             
Deny from all
             
Allow from 192.168.1.198
           
</location>

AddMonoApplications default “/puntonet:/usr/apache2.2.24/htdocs/puntonet”

Alias /puntonet “/usr/apache2.2.24/htdocs/puntonet”

     <location /puntonet>
             
SetHandler mono
             
Allow from all

      </location>

Las primeras 3 preparan a Apache para recibir el entorno .NET que provee mono
Include conf/mod_mono.conf
MonoServerPath “/usr/mono2.10/bin/mod-mono-server4”
MonoAutoApplication enabled

Las líneas restantes preparan un directorio para ejecutar código de .NET, puede repetir las líneas tantas veces como directorios para ejecutar aplicaciones de .NET requiera.

AddMonoApplications default “/puntonet:/usr/apache2.2.24/htdocs/puntonet”

Alias /puntonet “/usr/apache2.2.24/htdocs/puntonet”

     <location /puntonet>
             
SetHandler mono
             
Allow from all
      </location>

Si se requiere otro directorio agregas otro bloque con otra ruta

AddMonoApplications default “/otraruta:/usr/apache2.2.24/htdocs/otraruta”

Alias /otraruta “/usr/apache2.2.24/htdocs/otraruta”

     <location /otraruta>
             
SetHandler mono
             
Allow from all
      </location>

Los directorios deben existir en el sistema de archivos antes de iniciar el apache por ejemplo para puntonet debe existir /usr/apache2.2.24/htdocs/puntonet y es en ese directorio (“/usr/apache2.2.24/htdocs/puntonet ) donde se colocaran los archivos .ASPX u otras aplicaciones .NET

El siguiente video puede describir de forma visual el proceso de instalación, configuración y una sencilla demostración de funcionamiento.

2 thoughts on “Apache 2.2.x .NET (Mono) para despachar paginas ASPX y Appliciones C#

  1. Google Chrome 26.0.1410.64 Windows 7

    Que pex,ya checastes Nancy + Razor , nancy trae selfhosting con httplistener o puedes usar owin y montarlo en otros webservers,actualmente funciona con iis,pero lo mas seguro que funcione con modmono.

    Otra es usar nginx como este tutorial:
    http://humblecoder.co.uk/blog/2012/01/07/hosting-nancy-on-debian-with-nginx/

    En un momento usaba kayak como webserver,pero como kayak ya no es compatible con el estandar OWIN 1.0, ya me la pele, pero ahi hice una vez la siguiente prueba:

    Pongo 3 o 4 instancias del proceso que hostea mi pagina con selfhost(httplistener) y nancy(corriendo sobre mono).
    Un server con Nginx, que haga proxy y balancee las cargas entre los distintos puertos que tienen cada una de las instancias. las doy de alta en la configuracion del Nginx. Ahorita lo haces con upstream pero hace como 1.5 años era algo como esto:
    upstream backend {
    ip_hash;
    server server1:8080 weight=2;
    server server1:9090;
    server server2:9090;
    server server3:9090;
    }

    Mando request al nginx y este va balanceando la carga entre distintas instancia de la aplicacion en mi server o en otro.

    El codigo con el que hice todo esto lo llame appgrid, era un intento de host de aplicaciones distribuidas, subi el codigo a github:
    https://github.com/majimenezp/AppGrid01

    Las referencias son a viejas versiones de las librerias, asi que si las actualices puede ser que no funcione o compile la aplicacion.

    Lo que no pude hacer con NGINX era notificarle por medio de mensajes o algo similar que habia actualizado el archivo o directamente agregarle o quitarle servers de la lista del balanceo, la verdad no le he dedicado el tiempo que se merece,pero seria interesante ver como hacer una especie de grid de apps para los pobres ya sea con C# usando mono o algun otro lenguaje como python o ruby.

    Ahi pongo unos ejemplos en mi cuenta de github de nancy mas complejos que corren en mono. No habia tenido internet en mi casa y tiempo para hacer uno y subirlo.

Responder a majimenezp Cancelar respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *