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.