Publicando un sitio web asp.net core en Linux, nos basaremos en Ubuntu 16.04 Server

Se puede conseguir maquinas virtuales con Linux baratas en distintos sitios de internet, conocemos digitalocean y linode estas maquinas funcionan como un cluster lo que quiere decir que si necesitamos ampliar nuestra maquina Linux pagando mas lo podremos hacer sin problema nos ampliaran los recursos sin ningun problema que podemos montar proyectos y si van creciendo ampliar la maquina pagando un poco mas pero no hay ningun problema en hacerlo, por tanto yo recomiendo este tipo de servicios.

1- Obtener una maquina virtual

Pues puedes obtenerla por ejemplo en cualquier de los 2 servicios mencionados arriba o buscarte otro y acceder a ella desde programas como:

  • ssh de ubuntu que trae Windows 10.
  • putty que es muy robusco y software libre.
  • OpenSSH for Windows
  • Bitvise que es software privativo por eso no lo uso.

2- Configurar un usuario que no sea root

Siempre es buena idea usar un sistema operativo Linux sin una cuenta root no siendo el administrador y solicitando los permisos cada vez que desees ejecutar algo como root.

Adduser user

usermod -aG sudo user

entoces de deslogueas y entras de nuevo con el usuario que hayas creado.

3- Obtener .net core en tu maquina Linux

Te bajas y te instalas .net core de http://dot.net las instrucciones estan en la misma pagina para el sistema operativo que te haga falta, en nuestro caso para ubuntu 16.04 si este tutorial lo haceis para otro Linux sin problema pero solo que instalais para el .net core de vuestro linux.

En la consola poneis estos comandos:

 

mkdir testapp

cd testapp

dotnet new

dotnet restore

dotnet run

si haceis funcionar estos comandos ya habreis puesto la web a funcionar si falla dotnet restore aquí dejo una ayuda en estos 2 enlaces que estan debajo.

https://github.com/dotnet/cli/issues/3681

https://github.com/dotnet/cli/issues/3681#issuecomment-242897595

No suele fallar nada cuando haceis la instalacion asi que tranquilos.

4- Hacer un sitio asp.net core

Puedes hacer un sitio web asp.net core es muy facil y ademas creando el proyecto desde 0 puedes empezar.

Dotnet new razor -o testapp

con este comando creamos la web, y funcionara en local sin ningun problema, el problema que claro si instalas esto en un servidor Linux normalmente sin entorno grafico, necesitamos que cualquier persona tenga acceso desde internet al sitio web.

En mi caso el asp.net core no lo tengo instalado en un servidor web en internet lo tengo en mi red local en una maquina Ubuntu Server 16.04 y no tengo ni navegador ni entorno grafico por tanto cuando terminemos el tutorial os mostrare una foto.

5- Exponer la web fuera a internet

Yo podría decir que kestrel que es un servidor web .net para exponer una web .net core por el puerto 80 del servidor web.

Esto se puede hacer de varias maneras, puedes abrir el editor de texto en el fichero program.cs y añadir estas lineas de codigo:

var host = new WebHostBuilder()
.UseKestrel()
.UseUrls("http://*:80")
.UseContentRoot(Directory.GetCurrentDirectory())
.UseStartup<Startup>()
.Build();

Aqui el * es el comodin para todos los adaptadores de red y que escuche al puerto 80.

A mi no me dio ningun problema usar el puerto 80 con el proxy reverso kestrel, algro parecido a lo que hace php-fpm para servir web en php.

 

public static void Main(string[] args)
{
var config = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("hosting.json", optional: true)
.Build();

var host = new WebHostBuilder()
.UseKestrel()
.UseConfiguration(config)
.UseContentRoot(Directory.GetCurrentDirectory())
.UseStartup<Startup>()
.Build();

host.Run();
}

 

El fichero hosting.json

{

“server.urls”:”http://localhost:5123″

}

Tambien podemos usar “AddCommandLine(args)” en lugar de “AddJsonFile()” y pasar server.urls = http://*:5123 en la lineade comando. Depende de usted. Tambien puede usar la variable ASPNETCORE_URLS.

6- Configurar el proxy reverso con Nginx

Yo estoy traduciendo la documentación de http://www.hanselman.com/blog/PublishingAnASPNETCoreWebsiteToACheapLinuxVMHost.aspx

Por si quereis saber de donde he sacado esta informacion y vamos a terminar con el tutorial y a mi me tocara actualizar .net core 1.1 a 2.0 y es la parte practica de este tutorial.

Yo voy a instalar Nginx y a ponernos a trabajar con el.

 

sudo apt-get install nginx

sudo service nginx start

 

Ahora cambiamos el sitio default que viene por defecto por esto otro, tal cual con este código.

server {
   listen 80;
   location / {
   proxy_pass http://localhost:5123;
   proxy_http_version 1.1;
   proxy_set_header Upgrade $http_upgrade;
   proxy_set_header Connection keep-alive;
   proxy_set_header Host $host;
   proxy_cache_bypass $http_upgrade;
   }
}

Entoces ponemos estos comandos:

sudo apt-get install nginx

sudo service nginx start

7- Manteniendo el sitio web funcionando

Este sitio no esta ejecutandose en localhost:5123 ( a menos de que o haya ejecutado usted mismo y lo haya ejecutado), asi que necesitamos una aplicación o un monitor para ejecutarlo y mantenerlo funcionando. Hay una aplicación llamada supervisor que es cbuena asi que la agregare.
sudo apt-get install supervisor
aquí es donde necesitamos obtener el path o camino o el nombre correcto ~/testapp o cualquier otro, necesito publicar mi sitio en una localizacion final, ahora hacemos funcionar dotnet publish entoces copia los resultados dentro de nuesrta carpeta para publicar la web en asp.net core.

dotnet publish

dotnet publish: Published to /home/user/webapp/bin/Debug/netcoreapp1.1/publish

sudo cp -a /home/user/webapp/bin/Debug/netcoreapp1.1/publish /var/webapp

Ahora yo voy a crear un fichero llamado /etc/supervisor/conf.d/webapp.conf con este contenido

 

sudo nano /etc/supervisor/conf.d/webapp.conf

[program:webapp]

command=/usr/bin/dotnet /var/webapp/webapp.dll --server.urls:http://*:5123

directory=/var/webapp/

autostart=true

autorestart=true

stderr_logfile=/var/log/webapp.err.log

stdout_logfile=/var/log/webapp.out.log

environment=ASPNETCORE_ENVIRONMENT=Production

user=www-data

stopsignal=INT

 

Ahora iniciamos y paramos el supervisor y veras tu aplicación empezando a funcionar.

 

sudo service supervisor stop

sudo service supervisor start

sudo tail -f /var/log/supervisor/supervisord.log

#and the application logs if you like

sudo tail -f /var/log/dotnettest.out.log

 

Si todo salio bien, (si no lo hizo, sera un nombre o una ruta, ¡sigue intentandolo!) veras que el super visor inicia sesion con el inicio de sesion de dotnet ejecutando tu aplicación.

user@ubuntunet:/etc/supervisor/conf.d$ sudo tail -f /var/log/supervisor/supervisord.log

 

2017-11-14 22:44:40,399 INFO supervisord started with pid 975

2017-11-14 22:44:41,407 INFO spawned: 'webapp' with pid 1100

2017-11-14 22:44:42,410 INFO success: webapp entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)

2017-11-15 10:52:07,924 CRIT Supervisor running as root (no user in config file)

2017-11-15 10:52:07,948 WARN Included extra file "/etc/supervisor/conf.d/webapp.conf" during parsing

2017-11-15 10:52:08,120 INFO RPC interface 'supervisor' initialized

2017-11-15 10:52:08,120 CRIT Server 'unix_http_server' running without any HTTP authentication checking

2017-11-15 10:52:08,135 INFO supervisord started with pid 962

2017-11-15 10:52:09,491 INFO spawned: 'webapp' with pid 1150

2017-11-15 10:52:10,493 INFO success: webapp entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)

 

Recuerda estas relaciones:

  • dotnet hace funcionar tu web
  • nginx o apache escuchan en el puerto 80 y hace las llamadas a tu web por HTTP.
  • Supervisor mantiene tu aplicación funcionando.

Bueno lo siguiente es que veremos la aplicación basica asp.net core funcionando en nuestro navegador.

Entradas relacionadas

Dejar un comentario