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

ASP.NET Core auf GoDaddys billigstem gemeinsam genutztem Linux-Hosting ausführen – nicht zu Hause ausprobieren

Zunächst ein Haftungsausschluss. Tu das nicht. Ich tat dies, um eine Theorie zu testen und einen Punkt zu beweisen. ASP.NET Core und der .NET Core, auf dem es ausgeführt wird, sind Open Source und können so ziemlich überall ausgeführt werden. Ich wollte sehen, ob ich eine ASP.NET Core-Site auf GoDaddys billigstem Hosting (3 US-Dollar, obwohl es auf 8 US-Dollar skaliert) betreiben könnte, das im Grunde nur PHP unterstützt. Es ist keine vollständige Linux-VM. Es ist gesperrt und begrenzt. Du hast kein Root. Ihnen fehlen die meisten Tools, die Sie erwarten würden.

ABER.

Ich wollte sehen, ob ich ASP.NET Core trotzdem zum Laufen bringen kann. Wenn ich das tue, werden sie (und andere kostengünstige Hosts) vielleicht mit dem .NET-Team sprechen und erfahren, dass ASP.NET Core Open Source ist und problemlos auf ihrer vorhandenen Infrastruktur ausgeführt werden könnte.

WIEDER: Tu das nicht. Es ist hackig. Es ist dumm. Aber es ist verdammt cool. MEINER BESCHEIDENEN MEINUNG NACH. Auch ein großes Dankeschön an Tomas Weinfurt für seine Hilfe!

Zuerst ging ich zu GoDaddy und meldete mich für ihr günstiges Hosting an. Wieder keine VM, sondern ihre gemeinsame. Ich habe auch supercheapaspnetsite.com registriert. Sie verwenden ein cPanel-basiertes Webverwaltungssystem, mit dem Sie nicht wirklich etwas tun können. Sie können SSH einschalten, ein paar PHP-Sachen machen und im Allgemeinen herumstöbern, aber es ist nicht gerade Low-Level.

Zuerst ssh (shusch!) rein und sehe, womit ich arbeite. Ich schwöre auf Ubuntu on Windows 10 Feature, das jeder Entwickler aktivieren sollte. Es macht es wirklich einfach, mit Linux-Hosts zu arbeiten, wenn Sie mit Linux unter Windows 10 beginnen.

secretname@theirvmname [/proc]$ cat version
Linux version 2.6.32-773.26.1.lve1.4.46.el6.x86_64 ([email protected]) (gcc version 4.4.7 20120313 (Red Hat 4.4.7-18) (GCC) ) #1 SMP Tue Dec 5 18:55:41 EST 2017
secretname@theirvmname [/proc]$

OK, sieht aus wie Red Hat, also sollte CentOS 6 kompatibel sein.

Ich werde .NET Core 2.1 verwenden (das sich jetzt in der Vorschau befindet!) und das SDK unter https://www.microsoft.com/net/download/all herunterladen und auf meinem Windows-Computer installieren, auf dem ich entwickeln und entwickeln werde bauen Sie die App. Ich MUSS dafür nicht Windows verwenden, aber es ist der Laptop, den ich habe, und es ist auch schön zu wissen, dass ich auf Windows aufbauen kann, aber CentOS/RHEL6 als Ziel habe.

Als Nächstes erstelle ich eine neue ASP.NET-Site mit

dotnet new razor

und dann veröffentliche ich eine eigenständige Version wie diese:

dotnet publish -r rhel.6-x64

Und diese Dateien landen in einem Ordner wie \supercheapaspnetsite\bin\Debug\netcoreapp2.1\rhel.6-x64\publish\

HINWEIS: Möglicherweise müssen Sie den NuGet-Feed für die Dailies für diese .NET Core-Vorschau hinzufügen, damit die RHEL6-Laufzeit während dieser lokalen Veröffentlichung heruntergeladen wird.

Dann habe ich WinSCP (oder einen beliebigen FTP/SCP-Client, rsync usw.) verwendet, um die Dateien in den Ordner ~/www auf Ihrer von GoDaddy freigegebenen Website zu übertragen. Dann habe ich

chmod +x ./supercheapasnetsite

ausführbar zu machen. Lassen Sie uns jetzt von meiner SSH-Sitzung bei GoDaddy aus versuchen, meine App auszuführen!

secretname@theirvmname [~/www]$ ./supercheapaspnetsite
Failed to load hb, error: libunwind.so.8: cannot open shared object file: No such file or directory
Failed to bind to CoreCLR at '/home/secretname/public_html/libcoreclr.so'

So einfach kann das natürlich nicht sein, oder? .NET Core möchte die Unwind-Bibliothek (gemeinsames Objekt) und sie ist auf diesem gesperrten System nicht vorhanden.

UND ich habe kein yum/apt/rpm oder eine Möglichkeit, es richtig zu installieren?

Ich könnte irgendwo nach einer tar.gz-Datei suchen http://download.savannah.nongnu.org/releases/libunwind/, aber ich muss über Versionen nachdenken und sicherstellen, dass die Dinge übereinstimmen. Da ich auf CentOS6 abziele, sollte ich hier beginnen https://centos.pkgs.org/6/epel-x86_64/libunwind-1.1-3.el6.x86_64.rpm.html und libunwind-1.1-3.el6 herunterladen .x86_64.rpm.

Ich muss diese RPM-Datei knacken und die Bibliothek abrufen. RPM-Pakete sind nur Header auf einem CPIO-Archiv, sodass ich rpm2cpio von meinen lokalen Ubuntu-Instanzen (unter Windows 10) mit apt-get installieren kann. Dann entpacke ich sie aus /mnt/c/users/scott/Downloads (wo ich die Datei heruntergeladen habe).

rpm2cpio ./libunwind-1.1-3.el6.x86_64.rpm | cpio -idmv

Da sind sie.

Dieser Teil ist cool. Obwohl ich diese Dateien habe, habe ich weder Root noch eine Möglichkeit, sie zu "installieren". Ich könnte jedoch entweder die Umgebungsvariable LD_LIBRARY_PATH exportieren/verwenden, um zu steuern, wie Bibliotheken geladen werden, ODER ich könnte diese Dateien in $ORIGIN/netcoredeps ablegen . Weitere Informationen zu eigenständigen Linux-Anwendungen auf .NET Core finden Sie hier.

Die ausführbare Hauptdatei veröffentlichter .NET Core-Anwendungen (der .NET Core-Host) hat eine RPATH-Eigenschaft, die auf $ORIGIN/netcoredeps festgelegt ist . Das bedeutet, dass der Linux-Loader für gemeinsam genutzte Bibliotheken, wenn er nach gemeinsam genutzten Bibliotheken sucht, an diesem Speicherort sucht, bevor er nach den Standardspeicherorten für gemeinsam genutzte Bibliotheken sucht. Es ist erwähnenswert, dass die durch LD_LIBRARY_PATH angegebenen Pfade Umgebungsvariable oder Bibliotheken, die durch den LD_PRELOAD angegeben werden Umgebungsvariable werden immer noch vor der Eigenschaft RPATH verwendet. Um also lokale Kopien der Bibliotheken von Drittanbietern verwenden zu können, müssen Entwickler ein Verzeichnis mit dem Namen netcoredeps erstellen neben der ausführbaren Datei der Hauptanwendung und kopieren Sie alle notwendigen Abhängigkeiten hinein.

An diesem Punkt habe ich einen „netcoredeps“-Ordner zu meinem öffentlichen Ordner hinzugefügt und ihn dann (scp) auf GoDaddy kopiert. Lassen Sie es uns noch einmal ausführen.

secretname@theirvmname [~/www]$ ./supercheapaspnetsite
FailFast: Couldn't find a valid ICU package installed on the system. Set the configuration flag System.Globalization.Invariant to true if you want to run with no globalization support.

   at System.Environment.FailFast(System.String)
   at System.Globalization.GlobalizationMode.GetGlobalizationInvariantMode()
   at System.Globalization.GlobalizationMode..cctor()
   at System.Globalization.CultureData.CreateCultureWithInvariantData()
   at System.Globalization.CultureData.get_Invariant()
   at System.Globalization.CultureInfo..cctor()
   at System.StringComparer..cctor()
   at System.AppDomain.InitializeCompatibilityFlags()
   at System.AppDomain.Setup(System.Object)
Aborted

Ok, jetzt beschwert es sich über ICU-Pakete. Diese sind für die Globalisierung. Das wird auch in den Dokumenten zu eigenständigen Linux-Apps erwähnt, und es gibt eine vorkompilierte Binärdatei, die ich herunterladen könnte. Aber es gibt Optionen.

Wenn Ihre App die Nutzung der Globalisierung nicht ausdrücklich ablehnt, müssen Sie außerdem libicuuc.so.{version} hinzufügen , libicui18n.so.{version} , und libicudata.so.{version}

Ich mag „opt-out“, also muss ich diese Ups nicht ausgraben (obwohl ich könnte), sodass ich entweder die CORECLR_GLOBAL_INVARIANT-Umgebungsvariable auf 1 setzen oder System.Globalization.Invariant =true zu supercheapaspnetsite.runtimeconfig hinzufügen kann .json, was ich tun werde, nur um unausstehlich zu sein.;)

Wenn ich es erneut ausführe, bekomme ich eine andere Beschwerde über libuv. Eine weitere gemeinsam genutzte Bibliothek, die auf dieser Instanz nicht installiert ist. Ich könnte Holen Sie es und fügen Sie es in netcoredeps ein ODER da ich .NET Core 2.1 verwende, könnte ich etwas Neues ausprobieren. In .NET Core 2.1 wurden einige Verbesserungen in Bezug auf Sockets und HTTP-Leistung vorgenommen. Auf der Clientseite werden diese neuen verwalteten Bibliotheken von Grund auf in verwaltetem Code unter Verwendung des neuen hochleistungsfähigen Span geschrieben, und auf der Serverseite könnte ich die experimentellen UseSockets von Kestrel (Kestrel ist der .NET Core-Webserver) verwenden. ), während sie anfangen, das zu verschieben.

Mit anderen Worten, ich kann die Verwendung von libuv vollständig umgehen, indem ich meine Program.cs so ändere, dass use UseSockets() wie folgt verwendet wird.

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
     WebHost.CreateDefaultBuilder(args)
     .UseSockets()
     .UseStartup<Startup>();

Lassen Sie es uns noch einmal ausführen. Ich füge die Umgebungsvariable ASPNETCORE_URLS hinzu und setze sie auf einen hohen Port wie 8080. Denken Sie daran, dass ich kein Administrator bin und daher keinen Port unter 1024 verwenden kann.

secretname@theirvmname [~/www]$ export ASPNETCORE_URLS="http://*:8080"
secretname@theirvmname [~/www]$ ./supercheapaspnetsite
Hosting environment: Production
Content root path: /home/secretname/public_html
Now listening on: http://0.0.0.0:8080
Application started. Press Ctrl+C to shut down.

Heilige Scheiße, es fing tatsächlich an.

Ok, aber ich kann nicht über supercheapaspnetsite.com:8080 darauf zugreifen, da dies GoDaddys gesperrtes Managed Shared Hosting ist. Ich kann in ihrem Control Panel nicht einfach einen Port öffnen oder einen Port weiterleiten.

Aber. Sie verwenden Apache, und das hat die .htaccess-Datei!

Könnte ich mod_proxy verwenden und dies versuchen?

ProxyPassReverse / http://127.0.0.1:8080/

Sieht so aus, als hätten sie das nicht aktiviert. Wahrscheinlich möchten sie nicht auf externe Domänen umstellen, aber es wäre schön, wenn sie localhost zulassen würden. Schade. So nah.

Gut, ich übernehme den Datenverkehr selbst. (Nicht perfekt, aber das ist alles eine Spitze)

RewriteRule ^(.*)$  "show.php" [L]

Cool, jetzt kommt ein kitschiger Proxy in show.php.

<?php
$site = 'http://127.0.0.1:8080';
$request = $_SERVER['REQUEST_URI'];

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $site . $request);
curl_setopt($ch, CURLOPT_HEADER, TRUE);
$f = fopen("headers.txt", "a");
    curl_setopt($ch, CURLOPT_VERBOSE, 0);
    curl_setopt($ch, CURLOPT_STDERR, $f);
    #don't output curl response, I need to strip the headers.
    #yes I know I can just CURLOPT_HEADER, false and all this 
    # goes away, but for testing we log headers
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
$hold = curl_exec($ch);

#strip headers
$header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
$headers = substr($hold, 0, $header_size);
$response = substr($hold, $header_size);
$headerArray = explode(PHP_EOL, $headers);

echo $response; #echo ourselves. Yes I know curl can do this for us.
?>

Kitschig, ja. Funktioniert für GET? Auch ja. Das ist wirklich Apaches Job, nicht unserer, aber ein großes Lob an Tomas für diese böse Idee.

Boom. Wie wäre es mit einer anderen Seite unter /about? Ja.

Schön. Aber ich musste die App selbst ausführen. Ich habe keinen Supervisor oder Prozessmanager (auch dies wird bereits von GoDaddy für PHP gehandhabt, aber ich befinde mich in einer nicht privilegierten Welt.) Es ist eine schlechte Idee und nicht nachhaltig. (Nun, das Ganze ist nicht nachhaltig, aber immerhin.)

Wir könnten "screen" kopieren und starten und wie use screen ./supercheapaspnet app entfernen, aber noch einmal, wenn es abstürzt, wird es niemand starten. Wir tun haben crontab, also werden wir die App vorerst gelegentlich nach einem Zeitplan starten, um eine Zustandsprüfung durchzuführen und sie bei Bedarf am Laufen zu halten. Außerdem wurden ein paar Debugging-Tools in ~/bin hinzugefügt:

secretname@theirvmname [~/bin]$ ll
total 304
drwxrwxr-x  2    4096 Feb 28 20:13 ./
drwx--x--x 20    4096 Mar  1 01:32 ../
-rwxr-xr-x  1  150776 Feb 28 20:10 lsof*
-rwxr-xr-x  1   21816 Feb 28 20:13 nc*
-rwxr-xr-x  1  123360 Feb 28 20:07 netstat*

Alles in allem nicht so schwer. ASP.NET Core und .NET Core darunter können so ziemlich überall ausgeführt werden, genau wie PHP, Python, was auch immer.

Wenn Sie ein Host sind und mit jemandem bei Microsoft über die Einrichtung von ASP.NET Core Shared Hosting sprechen möchten, senden Sie eine E-Mail an [email protected] und sprechen Sie mit ihm! Wenn Sie GoDaddy sind, entschuldige ich mich, und Sie sollten auch eine E-Mail senden.;)

Sponsor: Holen Sie sich den neuesten JetBrains Rider zum Debuggen von .NET-Code von Drittanbietern, Smart Step Into, weitere Debugger-Verbesserungen, C# Interactive, den Assistenten für neue Projekte und das Formatieren von Code in Spalten.


Linux
  1. 4 Möglichkeiten, einen CPU-Kern herauszufinden, der einen bestimmten Prozess in Linux ausführt

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

  3. So entfernen Sie frühere Versionen von .NET Core von Linux (CentOS 7.1)

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

  5. Fehler beim Installieren von Nodejs auf Godaddy Shared Linux Hosting

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

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)

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

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

MX Linux:Testen Sie diese Linux-Distribution für ein flottes Desktop-Erlebnis