GNU/Linux >> Znalost Linux >  >> Linux

Spuštění ASP.NET Core na nejlevnějším sdíleném Linux Hostingu GoDaddys – nezkoušejte to doma

Za prvé, vyloučení odpovědnosti. Nedělej to. Udělal jsem to, abych otestoval teorii a prokázal věc. ASP.NET Core a .NET Core, na kterém běží, jsou open source a běží prakticky kdekoli. Chtěl jsem zjistit, zda mohu provozovat web ASP.NET Core na nejlevnějším hostingu GoDaddy (3 $, i když je to 8 $), který v podstatě podporuje pouze PHP. Není to úplný virtuální počítač s Linuxem. Je to uzamčené a omezené. Nemáte root. Chybí vám většina nástrojů, které byste očekávali, že budete mít.

ALE.

Chtěl jsem zjistit, jestli bych na něm mohl spustit ASP.NET Core. Možná, že když to udělám, oni (a další levní hostitelé) si promluví s týmem .NET, zjistí, že ASP.NET Core je open source a může snadno běžet na jejich stávající infrastruktuře.

ZNOVU: Nedělej to. Je to hacky. Je to hloupé. Ale je to sakra cool. IMHO. Velké díky také Tomas Weinfurt za jeho pomoc!

Nejprve jsem šel do GoDaddy a přihlásil se na jejich levný hosting. Opět ne virtuální počítač, ale jejich sdílený. Také jsem zaregistroval supercheapaspnetsite.com také. Používají webový systém správy založený na cPanel, který vám ve skutečnosti nic nedovolí. Můžete zapnout SSH, dělat nějaké věci s PHP a obecně se šťourat, ale není to zrovna nízká úroveň.

Nejprve ssh (šup!) a uvidím, s čím pracuji. Střílím s funkcí Ubuntu na Windows 10, kterou by si měl zapnout každý vývojář. Díky tomu je opravdu snadné pracovat s hostiteli Linuxu, pokud začínáte s Linuxem ve Windows 10.

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]$

Dobře, vypadá to jako Red Hat, takže CentOS 6 by měl být kompatibilní.

Budu používat .NET Core 2.1 (který je nyní ve verzi Preview!) a získat SDK na https://www.microsoft.com/net/download/all a nainstalovat jej na svůj počítač s Windows, kde budu vyvíjet a vytvořit aplikaci. Nepotřebuji k tomu používat Windows, ale je to notebook, který mám, a je také příjemné vědět, že mohu stavět na Windows, ale cílit na CentOS/RHEL6.

Dále vytvořím nový web ASP.NET s

dotnet new razor

a poté zveřejním samostatnou verzi takto:

dotnet publish -r rhel.6-x64

A tyto soubory skončí ve složce jako \supercheapaspnetsite\bin\Debug\netcoreapp2.1\rhel.6-x64\publish\

POZNÁMKA: Možná budete muset přidat zdroj NuGet pro deníky pro tento náhled .NET Core, abyste si během tohoto místního publikování stáhli běhové prostředí RHEL6.

Potom jsem použil WinSCP (nebo jakéhokoli FTP/SCP klienta, který se vám líbí, rsync atd.), abych soubory dostal do složky ~/www na vašem sdíleném webu GoDaddy. Pak já

chmod +x ./supercheapasnetsite

aby to bylo spustitelné. Nyní, z mé ssh session na GoDaddy, zkusme spustit moji aplikaci!

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'

Samozřejmě to nemohlo být tak snadné, že? .NET Core chce knihovnu unwind (sdílený objekt) a ta v tomto uzamčeném systému neexistuje.

A nemám yum/apt/rpm nebo způsob, jak to nainstalovat?

Mohl bych jít hledat soubor tar.gz někde takto http://download.savannah.nongnu.org/releases/libunwind/, ale musím přemýšlet o verzích a ujistit se, že věci jsou v souladu. Vzhledem k tomu, že cílím na CentOS6, měl bych začít zde https://centos.pkgs.org/6/epel-x86_64/libunwind-1.1-3.el6.x86_64.rpm.html a stáhnout libunwind-1.1-3.el6 .x86_64.rpm.

Potřebuji otevřít ten rpm soubor a získat knihovnu. Balíčky RPM jsou pouze hlavičky nad archivem CPIO, takže mohu apt-get nainstalovat rpm2cpio z mých místních instancí Ubuntu (ve Windows 10). Poté z /mnt/c/users/scott/Downloads (kde jsem soubor stáhl) jej rozbalím.

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

Tady jsou.

Tento díl je cool. I když mám tyto soubory, nemám root ani žádný způsob, jak je "nainstalovat". Mohl bych však buď exportovat/použít proměnnou prostředí LD_LIBRARY_PATH k řízení způsobu načítání knihoven, NEBO bych mohl tyto soubory umístit do $ORIGIN/netcoredeps . Více o Self Contained Linux Applications na .NET Core si můžete přečíst zde.

Hlavní spustitelný soubor publikovaných aplikací .NET Core (což je hostitel .NET Core) má vlastnost RPATH nastavenou na $ORIGIN/netcoredeps . To znamená, že když zavaděč sdílených knihoven v Linuxu hledá sdílené knihovny, podívá se na toto umístění a poté na výchozí umístění sdílených knihoven. Stojí za zmínku, že cesty určené LD_LIBRARY_PATH proměnná prostředí nebo knihovny specifikované LD_PRELOAD Proměnné prostředí se stále používají před vlastností RPATH. Aby tedy mohli vývojáři používat místní kopie knihoven třetích stran, musí vytvořit adresář s názvem netcoredeps vedle hlavního spustitelného souboru aplikace a zkopírujte do něj všechny potřebné závislosti.

V tomto okamžiku jsem přidal složku „netcoredeps“ do své veřejné složky a poté jsem ji zkopíroval (scp) do GoDaddy. Spusťte to znovu.

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, teď si stěžuje na balíčky na JIP. Ty jsou pro globalizaci. To je také zmíněno v dokumentech pro samostatné aplikace pro linux a existuje předkompilovaný binární soubor, který bych si mohl stáhnout. Ale existují možnosti.

Pokud se vaše aplikace výslovně neodhlásí z používání globalizace, musíte také přidat libicuuc.so.{version} , libicui18n.so.{version} a libicudata.so.{version}

Líbí se mi "opt-out", takže nemusím kopat tyto ups (i když bych mohl), takže mohu buď nastavit CORECLR_GLOBAL_INVARIANT env var na 1, nebo mohu přidat System.Globalization.Invariant =true k supercheapaspnetsite.runtimeconfig .json, se kterým to udělám, jen abych byl nepříjemný.;)

Když to znovu spustím, objeví se další stížnost na libuv. Další sdílená knihovna, která není v této instanci nainstalována. Mohl bych jděte si to a vložte to do netcoredeps NEBO protože používám .NET Core 2.1, mohl bych zkusit něco nového. V .NET Core 2.1 byla provedena určitá vylepšení týkající se soketů a výkonu http. Na straně klienta jsou tyto nové spravované knihovny napsány od základu ve spravovaném kódu pomocí nového vysoce výkonného Span a na straně serveru jsem mohl použít experimentální UseSockets(Kestrel) (Kestrel je webový server .NET Core). ), jak to začínají přesouvat.

Jinými slovy, mohu zcela obejít používání libuv tím, že změním svůj Program.cs tak, aby používal UseSockets() jako je tento.

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

Pojďme to spustit znovu. Přidám proměnnou prostředí ASPNETCORE_URLS a nastavím ji na vysoký port, jako je 8080. Pamatujte, že nejsem správce, takže nemohu použít žádný port pod 1024.

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.

Sakra, ve skutečnosti to začalo.

Dobře, ale nemám k němu přístup z webu supercheapaspnetsite.com:8080, protože toto je zamčený sdílený hosting spravovaný společností GoDaddy. Nemohu jen otevřít port nebo přeposlat port v jejich ovládacím panelu.

Ale. Používají Apache a ten má soubor .htaccess!

Mohl bych použít mod_proxy a zkusit to?

ProxyPassReverse / http://127.0.0.1:8080/

Vypadá to, že ne, tohle nezapnuli. Pravděpodobně se nechtějí připojovat k externím doménám, ale bylo by hezké, kdyby povolili localhost. Smůla. Tak blízko.

Dobře, zprovozním provoz sám. (Není dokonalé, ale tohle všechno je špička)

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

Výborně, teď se do show.php objeví ošidný proxy.

<?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.
?>

Syrový, ano. Funguje pro GET? Také ano. Tohle je opravdu Apacheova práce, ne naše, ale sláva Tomášovi za tento zlý nápad.

Výložník. Co takhle další stránka na /about? Ano.

Půvabný. Aplikaci jsem si ale musel spustit sám. Nemám žádného supervizora ani procesního manažera (opět to už řeší GoDaddy pro PHP, ale já jsem v neprivilegovaném světě.) Přehazovat a provozovat to je špatný nápad a neudržitelný. (No, celá tato věc není udržitelná, ale přesto.)

Mohli bychom zkopírovat "screen" a spustit ji a odpojit jako use screen ./supercheapaspnet app, ale znovu, pokud se zhroutí, nikdo ji nespustí. děláme mít crontab, takže prozatím aplikaci spustíme podle plánu příležitostně, abychom provedli kontrolu stavu a v případě potřeby ji udržíme v provozu. Také přidáno několik nástrojů pro ladění v ~/bin:

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*

Celkově vzato, není to tak těžké. ASP.NET Core a .NET Core pod ním mohou běžet prakticky kdekoli, stejně jako PHP, Python, cokoliv.

Pokud jste hostitel a chcete si s někým v Microsoftu promluvit o nastavení sdíleného hostingu ASP.NET Core, pošlete e-mail na [email protected] a promluvte si s ním! Pokud jste GoDaddy, omlouvám se a měli byste také poslat e-mail.;)

Sponzor: Získejte nejnovější JetBrains Rider pro ladění kódu .NET třetích stran, Smart Step Into, další vylepšení debuggeru, C# Interactive, nového průvodce projektu a formátování kódu ve sloupcích.


Linux
  1. Jak odebrat předchozí verze .NET Core z Linuxu (CentOS 7.1)

  2. NuGet pro .NET Core na Linuxu

  3. Existuje F# Interactive pro Linux na .NET Core bez použití Mono?

  1. 4 způsoby, jak zjistit jádro CPU, na kterém běží konkrétní proces v Linuxu

  2. .NET core X509Store na linuxu

  3. Chyba při instalaci Nodejs na Godaddy Shared Linux Hosting

  1. Podporuje .NET Core v Linuxu Visual Basic?

  2. Spuštění samostatné aplikace ASP.NET Core na Ubuntu

  3. Jak napsat linuxového démona s .Net Core