Desplegando Cuyahoga Framework sobre Linux con Mono

by Luis Roig on agosto 16th, 2010

Warning: count(): Parameter must be an array or an object that implements Countable in /homepages/25/d229412665/htdocs/nectio/wordpress/wp-content/plugins/wp-syntax/wp-syntax.php on line 76

En este nuevo post vamos a hablar de los pasos necesarios para desplegar una aplicación web .NET sobre un stack Linux (Apache + MySQL) gracias al proyecto Mono. Aunque siguiendo en la línea de posts anteriores trataremos una aplicación desarrollada con Cuyahoga (un framework web modular construido sobre ASP.NET, Castle y NHibernate) gran parte de la información nos puede ser util igualmente si estamos desplegando una aplicación ASP.NET o ASP.NET MVC.

En realidad, a dia de hoy y gracias a Mono es muy sencillo que nuestra aplicación web desarrollada con tecnologías .NET de Microsoft sea servida en un servidor Linux con Apache. Gracias a mod_mono, un módulo de Apache desarrollado por el equipo de Mono, tan solo necesitaremos configurar un Virtual Host en el que indicaremos la ruta raíz a nuestra aplicación web y que dicha aplicación debe ser servida por mod_mono.

En nuestro caso, el de una una aplicación desarrollada con Cuyahoga 1.6.0, nuestro despliegue constará de tres grandes bloques:

1) Configurar el Virtual Host de Apache
2) Configurar el acceso a base de datos de Cuyahoga
3) Aplicar los permisos adecuados a la estructura de directorios de Cuyahoga

Configurar el Virtual Host de Apache

Típicamente, teniendo instalado en nuestra máquina el Runtime de Mono y mod_mono, y habiendo activado dicho módulo en el httpd.conf de nuestro Apache:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<IfModule !mod_mono.c>
    LoadModule mono_module /usr/lib/apache2/mod_mono.so
</IfModule>
 
<IfModule mod_headers.c>
    Header set X-Powered-By "Mono"
</IfModule>
 
AddType application/x-asp-net .aspx
AddType application/x-asp-net .asmx
AddType application/x-asp-net .ashx
AddType application/x-asp-net .asax
AddType application/x-asp-net .ascx
AddType application/x-asp-net .soap
AddType application/x-asp-net .rem
AddType application/x-asp-net .axd
AddType application/x-asp-net .cs
AddType application/x-asp-net .vb
AddType application/x-asp-net .master
AddType application/x-asp-net .sitemap
AddType application/x-asp-net .resources
AddType application/x-asp-net .skin
AddType application/x-asp-net .browser
AddType application/x-asp-net .webinfo
AddType application/x-asp-net .resx
AddType application/x-asp-net .licx
AddType application/x-asp-net .csproj
AddType application/x-asp-net .vbproj
AddType application/x-asp-net .config
AddType application/x-asp-net .Config
AddType application/x-asp-net .dll
DirectoryIndex index.aspx
DirectoryIndex Default.aspx
DirectoryIndex default.aspx

Podríamos empezar a servir nuestra aplicación ASP.NET desde Apache configurando un Virtual Host haciendo uso de la feature MonoAutoApplication de mod_mono con esta sencilla configuración:

1
2
3
4
5
6
7
<VirtualHost *:80>
	ServerName localhost
	ServerAdmin web-admin@localhost
	DocumentRoot /var/www/cuyahoga
	MonoAutoApplication enabled
	MonoApplications localhost "/:/var/www/cuyahoga"
</VirtualHost>

Sin embargo, en el caso de una aplicación Cuyahoga no nos será tan sencillo. Debido a que algunas de las rutas virtuales que establece Cuyahoga son del tipo /id_de_la_seccion/section.aspx/id, si no indicamos lo contrario Apache interpretará dicha ruta como contenido estático e intentará buscar directorio físico /id_de_la_seccion. Para evitar estos problemas, tendremos que forzar en el Virtual Host que Mono sirva tanto los contenidos dinámicos como los estáticos, usando la directiva SetHandler Mono:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<VirtualHost *:80>
  ServerName localhost
  ServerAdmin web-admin@localhost
  DocumentRoot /var/www/cuyahoga
  MonoAutoApplication disabled
  MonoServerPath localhost "/usr/bin/mod-mono-server2"
  MonoApplications localhost "/:/var/www/cuyahoga"
  <Location "/">
    Allow from all
    Order allow,deny
    MonoSetServerAlias localhost
    SetHandler mono
    SetOutputFilter DEFLATE
    SetEnvIfNoCase Request_URI "\.(?:gif|jpe?g|png)$" no-gzip dont-vary
  </Location>
  <IfModule mod_deflate.c>
    AddOutputFilterByType DEFLATE text/html text/plain text/xml text/javascript
  </IfModule>
</VirtualHost>

Configurar el acceso a base de datos de Cuyahoga

En el fichero Config/properties.config se situa la configuración necesaria para que Cuyahoga acceda a la base de datos. Típicamente, el fichero de configuración por defecto de Cuyahoga será un xml con este aspecto:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <properties>
    <!-- Database -->
 
    <!-- SQL Server settings
    <connectionString>Server=LOCALHOST\SQLEXPRESS;Database=Cuyahoga;Integrated Security=SSPI</connectionString>
    <nhibernateDriver>NHibernate.Driver.SqlClientDriver</nhibernateDriver>
    <nhibernateDialect>NHibernate.Dialect.MsSql2000Dialect</nhibernateDialect>
-
    <!--
    PostgreSQL settings
    <connectionString>Server=localhost;Port=5432;Database=cuyahoga;uid=;pwd=</connectionString>
    <nhibernateDriver>NHibernate.Driver.NpgsqlDriver</nhibernateDriver>
    <nhibernateDialect>NHibernate.Dialect.PostgreSQLDialect</nhibernateDialect>
    -->
    <!--
    MySQL settings -->
    <connectionString>server=localhost;database=cuyahoga;uid=root;pwd=root;</connectionString>
    <nhibernateDriver>NHibernate.Driver.MySqlDataDriver</nhibernateDriver>
    <nhibernateDialect>NHibernate.Dialect.MySQLDialect</nhibernateDialect>                
    <!-- Email. -->
    <!-- Important: also update services.config when setting port, username, password and encoding -->
    <smtpHost>localhost</smtpHost> <!-- required-->
    <smtpPort></smtpPort>
    <smtpUsername></smtpUsername>
    <smtpPassword></smtpPassword>
    <emailEncoding></emailEncoding> <!-- iso-8859-1, utf-8, us-ascii, etc.  -->
 
    <!--
    Location for temporary files in transactional uploads.
    When left empty, The TEMP environment variable is used to lookup the temp directory.
    -->
    <tempDir>/tmp</tempDir>
 
  </properties>
</configuration>

Como vemos, hay 3 bloques de configuración preparados para distintos tipos de bases de datos (SQL Server, PostreSQL y MySQL). En este ejemplo dejamos comentados los de SQL Server y PostgreSQL (o si queremos, podemos borrarlos). En el bloque de MySQL tan solo tenemos que indicar en la connection string los datos de acceso a nuestro servidor. Las otras dos etiquetas indican los ensamblados donde se sitúan los drivers y dialectos de MySQL para NHibernate, y las dejamos como están:

<connectionString>
	server=localhost;database=cuyahoga;uid=root;pwd=root;
</connectionString>
 
<nhibernateDriver>NHibernate.Driver.MySqlDataDriver</nhibernateDriver>
<nhibernateDialect>NHibernate.Dialect.MySQLDialect</nhibernateDialect>

También es muy conveniente indicar un directorio temporal en el que el usuario bajo el que corre Apache tenga permisos de escritura (en un sistema Linux lo típico será /tmp). Este directorio será donde Cuyahoga escriba los archivos temporales para las transacciones de NHibernate:

<tempDir>/tmp</tempDir>

Aplicar los permisos adecuados a la estructura de directorios de Cuyahoga

Finalmente, para un correcto funcionamiento de nuestra aplicación desarrollada con Cuyahoga, ciertos directorios tendrán que tener permisos de lectura y de escritura para el usuario bajo el que corra Apache:

  • Para la búsqueda, Cuyahoga usa la versión para .NET del conocido motor de búsqueda Lucene. Para su correcto funcionamiento deberemos tener permisos de lectura y escritura en el directorio ‘index’, donde Lucene almacenará el indice de búsqueda que construye.
  • Además, si nuestros módulos permiten la subida de ficheros (galerías multimedia, documentos, etc) deberemos tener permisos de escritura en el directorio donde la aplicación deposite dichos ficheros. Lo normal es ubicar nuestra estructura para estos ficheros colgando del directorio ‘UserFiles’ que ya existe en la raíz de una aplicación Cuyahoga.

Y con estos sencillos pasos ya tenemos Cuyahoga 1.6.0 funcionando en un servidor linux con Apache y MySQL. ¿ Quién dijo que por desarrollar en C# hay que atarse a stacks Microsoft 100% ?

From → Sin categoría

Todavía sin comentarios

Escribe un comentario!

Nota: Se permite XHTML. Tu email nunca se publicará.

Suscríbete a este feed de comentarios via RSS