GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Veröffentlichen einer ASP.NET Core-Website auf einem günstigen Linux-VM-Host

Eine kleine Linux-VM auf Azure kostet etwa 13 US-Dollar pro Monat. Sie können überall kleine Linux-Maschinen für zwischen 10 und 15 US-Dollar pro Monat bekommen. Auf Linode kosten sie etwa 10 US-Dollar pro Monat, also dachte ich, es wäre interessant, eine ASP.NET Core-Website einzurichten, die auf .NET Core läuft. Wie Sie vielleicht wissen, ist .NET Core kostenlos, Open Source, plattformübergreifend und läuft praktisch überall.

Schritt 0 - Holen Sie sich einen günstigen Host

Ich ging zu Linode (oder irgendwo anders) und bekam die billigste Linux-Maschine, die sie anboten. In diesem Fall ist es ein Ubuntu 14.04 LTS-Profil, 64-Bit, 4.6.5-Kernel.

Da ich unter Windows arbeite, aber SSH in diese Linux-Maschine einbinden möchte, benötige ich einen SSH-Client. Es gibt eine Reihe von Optionen.

  • Wenn Sie das neueste Windows 10 haben, können Sie einfach verwenden Sie die Bash/Ubuntu-Shell, die in Windows selbst integriert ist . Das ist, was ich tat. Ich habe bash ausgeführt, dann ssh.
  • Sie können OpenSSH für Windows herunterladen. Dies ist diejenige, die das Windows/PowerShell-Team zu Windows bringt. Es ist eine Win32-Portierung von OpenSSH.
  • SmarTTY - Schöner als Putty, dies ist ein kostenloser SSH-Client mit mehreren Registerkarten, der auch das Kopieren von Dateien unterstützt
  • Putty oder Bitvise - beide kostenlos und beide funktionieren gut

Schritt 0.5 - Richten Sie einen Benutzer ein, der nicht root ist

Es ist immer eine gute Idee, nicht root zu sein. Nachdem ich mich als root in das System eingeloggt habe, habe ich einen neuen Benutzer angelegt und ihm sudo (super user do):

gegeben
adduser scott
usermod -aG sudo scott

Dann werde ich mich abmelden und als Scott wieder anmelden.

Schritt 1 – Holen Sie sich .NET Core auf Ihren Linux-Rechner

Wechseln Sie zu http://dot.net, um .NET Core herunterzuladen, und befolgen Sie die Anweisungen. Es werden mindestens 8 Linuxe in 6 Geschmacksrichtungen unterstützt, also sollten Sie keine Probleme haben. Ich habe die Ubuntu-Anweisungen befolgt.

Um sicherzustellen, dass es funktioniert, nachdem Sie es eingerichtet haben, erstellen Sie schnell eine Konsolen-App wie diese und führen Sie sie aus.

mkdir testapp
cd testapp
dotnet new
dotnet restore
dotnet run

Wenn es ausgeführt wird, haben Sie .NET Core installiert und können damit fortfahren, eine Web-App zu erstellen und diese im Internet bereitzustellen.

HINWEIS: Wenn „dotnet restore“ mit einem Segmentierungsfehler fehlschlägt, tritt dieses Problem möglicherweise bei einigen 64-Bit-Linux-Kernels auf. Hier sind Befehle, um das Problem zu beheben, die bei mir unter Ubuntu 14.04 funktioniert haben, als ich darauf stieß. Der Fix wurde jetzt als NuGet veröffentlicht, aber er wird in der nächsten Nebenversion von .NET Core enthalten sein, aber wenn Sie die CoreCLR jemals manuell aktualisieren müssen, können Sie das tun.

Schritt 2 – ASP.NET Core-Website erstellen

Sie können eine ASP.NET Core-Website erstellen, die sehr einfach und sehr leer ist, und das ist in Ordnung. Sie können auch Yeoman herunterladen und die ASP.NET Yeoman-basierten Generatoren verwenden, um mehr Auswahlmöglichkeiten zu erhalten. Es gibt auch das großartige ASP.NET MVC Boilerplate-Projekt für Visual Studio.

Oder Sie beginnen einfach mit:

dotnet new -t web

Heute verwendet diese Standardseite npm, gulp und bower, um JavaScript- und CSS-Abhängigkeiten zu verwalten. In Zukunft wird es Optionen geben, die nicht so viel zusätzliches Zeug erfordern, aber im Moment brauche ich npm, um diese Site wiederherzustellen, und was nicht, also werde ich dies tun, um Knoten, npm usw. zu erhalten.

sudo apt-get install npm
sudo npm install gulp
sudo npm install bower

Jetzt kann ich dotnet einfach wiederherstellen und meine Web-App zum Testen ausführen. Es startet normalerweise auf localhost:5000.

$ dotnet restore
$ dotnet run
scott@ubuntu:~/dotnettest$ dotnet run
Project dotnettest (.NETCoreApp,Version=v1.0) was previously compiled. Skipping compilation.
info: Microsoft.Extensions.DependencyInjection.DataProtectionServices[0]
User profile is available. Using '/home/scott/.aspnet/DataProtection-Keys' as key repository; keys will not be encrypted at rest.
Hosting environment: Production
Content root path: /home/scott/dotnettest
Now listening on: http://localhost:5000

Natürlich hilft es mir nicht, etwas auf localhost:5000 zu starten, da ich hier zu Hause bin und eine lokale Website wie diese nicht testen kann. Ich möchte diese Seite (über einen Port) der Außenwelt zugänglich machen. Ich möchte so etwas wie http://mysupermachine -> inside my machine -> localhost:5000.

Schritt 3 – Zeigen Sie Ihre Web-App nach außen.

Ich könnte Weisen Sie Kestrel – das ist der .NET-Webserver – an, sich Port 80 auszusetzen, obwohl Sie normalerweise einen anderen Prozess zwischen Ihnen und der Außenwelt haben möchten.

Dafür gibt es mehrere Möglichkeiten . Sie können Program.cs mit einem Editor wie „pico“ öffnen und dem WebHostBuilder wie folgt einen .UseUrls()-Aufruf hinzufügen.

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

Hier bindet * an alle Netzwerkadapter und lauscht auf Port 80. Das Setzen von http://0.0.0.0:80 funktioniert auch.

Möglicherweise haben Sie dabei Berechtigungsprobleme und müssen den dotnet-Prozess und den Webserver erhöhen, was ebenfalls ein Problem darstellt, also lassen Sie uns einfach einen hohen internen Port und einen Reverse-Proxy beibehalten den Verkehr mit etwas wie Nginx oder Apache. Wir ziehen den fest codierten Port aus dem Code heraus und ändern die Datei „Program.cs“ so, dass eine .json-Konfigurationsdatei verwendet wird.

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();
}

Die Datei hosting.json ist einfach diese:

{
"server.urls": "http://localhost:5123"
}

Wir können auch "AddCommandLine(args)" anstelle von "AddJsonFile()" verwenden und --server.urls=http://*:5123 auf der Befehlszeile übergeben. Es liegt an Ihnen. Sie können auch die Umgebungsvariable ASPNETCORE_URLS verwenden .

HINWEIS:Ich mache diese Arbeit in einem Ordner unter meinem Home-Ordner ~ oder jetzt. Ich werde diese Website später kompilieren und in etwas wie /var/dotnettest "veröffentlichen", wenn ich möchte, dass sie gesehen wird.

Schritt 4 – Richten Sie einen Reverse-Proxy wie Nginx ein

Ich folge den detaillierten Anweisungen auf der ASP.NET Core Docs-Website mit dem Titel „In einer Linux-Produktionsumgebung veröffentlichen“. (Alle Dokumente sind auch auf GitHub)

Ich werde Nginx einbringen und starten.

sudo apt-get install nginx
sudo service nginx start

Ich werde die standardmäßige Nginx-Site so ändern, dass sie auf meine (zukünftige) laufende ASP.NET Core-Web-App verweist. Ich öffne und ändere /etc/nginx/sites-available/default und lasse es so aussehen. Notieren Sie sich die Portnummer. Nginx ist VIEL komplexer und hat viele Nuancen. Wenn Sie also bereit sind, in die Super Official Production einzusteigen, sollten Sie sich unbedingt ansehen, wie die perfekte Nginx-Konfigurationsdatei aussieht, und sie an Ihre Bedürfnisse anpassen.

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;
}
}

Dann prüfen wir das und laden die Konfiguration neu.

sudo nginx -t 
sudo nginx -s reload

Schritt 5 – Halten Sie Ihre Website am Laufen

Die Website läuft noch nicht auf localhost:5123 (es sei denn, Sie haben sie selbst ausgeführt und am Laufen gehalten!), also benötigen wir eine App oder einen Monitor, um sie auszuführen und am Laufen zu halten. Es gibt eine App namens Supervisor, die das gut kann, also werde ich sie hinzufügen.

sudo apt-get install supervisor

Hier müssen Sie/wir/ich/der Fehler die richtigen Pfade und Namen finden, also seien Sie sich dessen bewusst. Ich bin drüben in ~/testapp oder so. Ich muss meine Website an einem endgültigen Ort veröffentlichen, also werde ich dotnet publish ausführen und dann die Ergebnisse nach /var/dotnettest kopieren wo es leben wird.

dotnet publish
publish: Published to /home/scott/dotnettest/bin/Debug/netcoreapp1.0/publish
sudo cp -a /home/scott/dotnettest/bin/Debug/netcoreapp1.0/publish /var/dotnettest

Jetzt werde ich eine Datei namens /src/supervisor/conf.d/dotnettest.conf erstellen (wiederum verwende ich pico, weil ich nicht so großartig bin wie emacs oder vim), um meine App zu starten und am Laufen zu halten:

[program:dotnettest]
command=/usr/bin/dotnet /var/dotnettest/dotnettest.dll --server.urls:http://*:5123
directory=/var/dotnettest/
autostart=true
autorestart=true
stderr_logfile=/var/log/dotnettest.err.log
stdout_logfile=/var/log/dotnettest.out.log
environment=ASPNETCORE_ENVIRONMENT=Production
user=www-data
stopsignal=INT

Jetzt starten und stoppen wir Supervisor und beobachten/verfolgen seine Protokolle, um den Start unserer App zu sehen!

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

Wenn alles geklappt hat (wenn nicht, ist es ein Name oder ein Pfad, also versuchen Sie es weiter!), sehen Sie das Supervisor-Protokoll mit dotnet, das gestartet wird und Ihre App ausführt.

Denken Sie an die Beziehungen.

  • Dotnet - führt Ihre Website aus
  • Nginx oder Apache – Lauscht auf Port 80 und leitet HTTP-Aufrufe an Ihre Website weiter
  • Supervisor – Hält Ihre App am Laufen

Als Nächstes möchte ich vielleicht einen Continuous Integration Build oder SCP/SFTP einrichten, um die Bereitstellung meiner App zu handhaben. Auf diese Weise kann ich lokal entwickeln und auf meine Linux-Maschine hochschieben.

Natürlich gibt es ein Dutzend anderer Möglichkeiten, eine ASP.NET Core-Site zu veröffentlichen, ganz zu schweigen von Docker. Ich werde ein anderes Mal etwas über Docker schreiben, aber im Moment konnte ich meine ASP.NET Core-Website in weniger als einer Stunde auf einem günstigen 10-Dollar-Host veröffentlichen. Sie können die gleichen Tools verwenden, um eine .NET Core-Site zu verwalten, die Sie verwenden, um jede Site zu verwalten, sei es PHP, nodejs, Ruby oder was auch immer Sie glücklich macht.

Sponsor: Aspose erstellt Programmier-APIs für die Arbeit mit Dateien wie:DOC, XLS, PPT, PDF und unzählige mehr. Entwickler können ihre Produkte verwenden, um Dateien auf nahezu beliebige Weise zu erstellen, zu konvertieren, zu ändern oder zu verwalten. Aspose ist ein gutes Unternehmen und bietet solide Produkte an. Probieren Sie sie aus und laden Sie eine kostenlose Testversion herunter.


Linux
  1. C# in Linux-Umgebung

  2. Visual Basic .Net unter Linux

  3. Wird Visual Basic von .NET Core unter Linux unterstützt?

  4. Ausführen einer eigenständigen ASP.NET Core-Anwendung auf Ubuntu

  5. So schreiben Sie einen Linux-Daemon mit .Net Core

So ändern Sie die ASP.NET-Version auf Ihrer Website

Erkunden von ASP.NET Core mit Docker in Linux- und Windows-Containern

Veröffentlichen einer ASP.NET 5-App in Docker unter Linux mit Visual Studio

Verschieben eines ASP.NET Core von Azure App Service unter Windows zu Linux, indem zuerst in WSL und Docker getestet wird

Testen von .NET Core unter Linux mit nur einem Tarball (ohne apt-get)

So installieren Sie (.NET Core) Dotnet Core auf Linux-Distributionen