GNU/Linux >> Tutoriels Linux >  >> Linux

Exécuter ASP.NET Core sur l'hébergement Linux partagé le moins cher de GoDaddy - N'essayez pas ceci à la maison

Tout d'abord, un avertissement. Ne fais pas ça. Je l'ai fait pour tester une théorie et prouver un point. ASP.NET Core et le .NET Core sur lequel il s'exécute sont open source et s'exécutent pratiquement n'importe où. Je voulais voir si je pouvais exécuter un site ASP.NET Core sur l'hébergement le moins cher de GoDaddy (3 $, bien qu'il évolue à 8 $) qui ne prend en charge que PHP. Ce n'est pas une machine virtuelle Linux complète. C'est verrouillé et limité. Vous n'avez pas de racine. Il vous manque la plupart des outils que vous vous attendriez à avoir.

MAIS.

Je voulais voir si je pouvais quand même faire fonctionner ASP.NET Core dessus. Peut-être que si je le fais, ils (et d'autres hébergeurs peu coûteux) parleront à l'équipe .NET, apprendront qu'ASP.NET Core est open source et pourrait facilement fonctionner sur leur infrastructure existante.

ENCORE : Ne fais pas ça. C'est hacké. C'est idiot. Mais c'est super cool. A MON HUMBLE AVIS. Un grand merci également à Tomas Weinfurt pour son aide !

Tout d'abord, je suis allé chez GoDaddy et je me suis inscrit à leur hébergement bon marché. Encore une fois, pas une VM, mais leur partagée. J'ai également enregistré supercheapaspnetsite.com. Ils utilisent un système de gestion Web basé sur cPanel qui ne vous permet pas vraiment de faire quoi que ce soit. Vous pouvez activer SSH, faire des trucs PHP et généralement fouiner, mais ce n'est pas exactement de bas niveau.

D'abord, je me connecte en ssh (shoosh !) et je vois avec quoi je travaille. Je shooshing avec Ubuntu sur la fonctionnalité Windows 10, que chaque développeur devrait activer. Il est très facile de travailler avec des hôtes Linux si vous démarrez à partir de Linux sur 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]$

OK, ça ressemble à Red Hat, donc CentOS 6 devrait être compatible.

Je vais utiliser .NET Core 2.1 (qui est en préversion maintenant !) et obtenir le SDK sur https://www.microsoft.com/net/download/all et l'installer sur ma machine Windows où je développerai et créer l'application. Je n'ai pas BESOIN d'utiliser Windows pour ce faire, mais c'est l'ordinateur portable que j'ai et c'est aussi agréable de savoir que je peux construire sur Windows mais cibler CentOS/RHEL6.

Ensuite, je vais créer un nouveau site ASP.NET avec

dotnet new razor

puis je publierai une version autonome comme celle-ci :

dotnet publish -r rhel.6-x64

Et ces fichiers se retrouveront dans un dossier comme \supercheapaspnetsite\bin\Debug\netcoreapp2.1\rhel.6-x64\publish\

REMARQUE : Vous devrez peut-être ajouter le flux NuGet pour les quotidiens pour cet aperçu .NET Core afin d'obtenir le runtime RHEL6 téléchargé lors de cette publication locale.

Ensuite, j'ai utilisé WinSCP (ou n'importe quel client FTP/SCP que vous aimez, rsync, etc.) pour transférer les fichiers vers le dossier ~/www sur votre site partagé GoDaddy. Puis je

chmod +x ./supercheapasnetsite

pour le rendre exécutable. Maintenant, depuis ma session ssh chez GoDaddy, essayons d'exécuter mon application !

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'

Bien sûr, cela ne pouvait pas être aussi simple, n'est-ce pas ? .NET Core veut la bibliothèque de déroulement (objet partagé) et elle n'existe pas sur ce système verrouillé.

ET je n'ai pas yum/apt/rpm ou un moyen de l'installer, n'est-ce pas ?

Je pourrais aller chercher le fichier tar.gz quelque part comme ceci http://download.savannah.nongnu.org/releases/libunwind/ mais je dois penser aux versions et m'assurer que les choses s'alignent. Étant donné que je cible CentOS6, je devrais commencer ici https://centos.pkgs.org/6/epel-x86_64/libunwind-1.1-3.el6.x86_64.rpm.html et télécharger libunwind-1.1-3.el6 .x86_64.rpm.

J'ai besoin d'ouvrir ce fichier rpm et d'obtenir la bibliothèque. Les packages RPM ne sont que des en-têtes au-dessus d'une archive CPIO, je peux donc installer apt-get rpm2cpio à partir de mes instances Ubuntu locales (sur Windows 10). Ensuite, depuis /mnt/c/users/scott/Downloads (où j'ai téléchargé le fichier), je vais l'extraire.

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

Ils sont là.

Cette partie est cool. Même si j'ai ces fichiers, je n'ai pas de racine ni aucun moyen de les "installer". Cependant, je pourrais soit exporter/utiliser la variable d'environnement LD_LIBRARY_PATH pour contrôler la façon dont les bibliothèques sont chargées OU je pourrais mettre ces fichiers dans $ORIGIN/netcoredeps . Vous pouvez en savoir plus sur les applications Linux autonomes sur .NET Core ici.

L'exécutable principal des applications .NET Core publiées (qui est l'hôte .NET Core) a une propriété RPATH définie sur $ORIGIN/netcoredeps . Cela signifie que lorsque le chargeur de bibliothèque partagée Linux recherche des bibliothèques partagées, il recherche cet emplacement avant de rechercher les emplacements de bibliothèque partagée par défaut. Il est à noter que les chemins spécifiés par le LD_LIBRARY_PATH variable d'environnement ou bibliothèques spécifiées par le LD_PRELOAD La variable d'environnement est toujours utilisée avant la propriété RPATH. Ainsi, afin d'utiliser des copies locales des bibliothèques tierces, les développeurs doivent créer un répertoire nommé netcoredeps à côté de l'exécutable principal de l'application et copiez-y toutes les dépendances nécessaires.

À ce stade, j'ai ajouté un dossier "netcoredeps" à mon dossier public, puis je l'ai copié (scp) sur GoDaddy. Recommençons.

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, maintenant il se plaint des packages ICU. Ce sont pour la mondialisation. Cela est également mentionné dans la documentation des applications Linux autonomes et il existe un binaire précompilé que je pourrais télécharger. Mais il y a des options.

Si votre application ne désactive pas explicitement l'utilisation de la globalisation, vous devez également ajouter libicuuc.so.{version} , libicui18n.so.{version} , et libicudata.so.{version}

J'aime "opt-out" donc je n'ai pas à creuser ces ups (bien que je le puisse) donc je peux soit définir la var env CORECLR_GLOBAL_INVARIANT sur 1, soit ajouter System.Globalization.Invariant =true à supercheapaspnetsite.runtimeconfig .json, que je ferai avec juste pour être odieux.;)

Quand je le lance à nouveau, je reçois une autre plainte à propos de libuv. Encore une autre bibliothèque partagée qui n'est pas installée sur cette instance. Je pourrais allez le chercher et mettez-le dans netcoredeps OU puisque j'utilise le .NET Core 2.1, je pourrais essayer quelque chose de nouveau. Certaines améliorations ont été apportées à .NET Core 2.1 concernant les sockets et les performances http. Côté client, ces nouvelles bibliothèques gérées sont écrites à partir de zéro en code géré à l'aide du nouveau Span hautes performances et côté serveur, je pourrais utiliser les UseSockets expérimentaux de Kestrel (Kestrel est le serveur Web .NET Core) ( ) alors qu'ils commencent à déplacer cela.

En d'autres termes, je peux contourner entièrement l'utilisation de libuv en modifiant mon Program.cs pour utiliser UseSockets() comme ceci.

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

Exécutons-le à nouveau. Je vais ajouter la variable d'environnement ASPNETCORE_URLS et la définir sur un port élevé comme 8080. N'oubliez pas que je ne suis pas administrateur, donc je ne peux utiliser aucun port sous 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.

Putain de merde, ça a vraiment commencé.

Ok, mais je ne peux pas y accéder depuis supercheapaspnetsite.com:8080 car il s'agit de l'hébergement partagé géré verrouillé de GoDaddy. Je ne peux pas simplement ouvrir un port ou transférer un port dans leur panneau de contrôle.

Mais. Ils utilisent Apache, et cela a le fichier .htaccess !

Puis-je utiliser mod_proxy et essayer ceci ?

ProxyPassReverse / http://127.0.0.1:8080/

On dirait que non, ils n'ont pas activé cette option. Il est probable qu'ils ne veuillent pas faire appel à des domaines externes, mais ce serait bien s'ils autorisaient localhost. Dommage. Si proche.

Très bien, je vais proxy le trafic moi-même. (Pas parfait, mais tout cela n'est qu'un pic)

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

Cool, maintenant un proxy ringard va dans 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.
?>

Chouette, oui. Travaille pour GET ? Aussi, oui. C'est vraiment le travail d'Apache, pas le nôtre, mais bravo à Tomas pour cette mauvaise idée.

Boom. Que diriez-vous d'une autre page sur /about ? Oui.

Joli. Mais j'ai dû exécuter l'application moi-même. Je n'ai pas de superviseur ou de gestionnaire de processus (encore une fois, cela est déjà géré par GoDaddy pour PHP mais je suis dans un monde non privilégié.) Shooshing et l'exécuter est une mauvaise idée et non durable. (Eh bien, tout cela n'est pas durable, mais quand même.)

Nous pourrions copier "screen" et le démarrer et le détacher comme utiliser l'application screen ./supercheapaspnet , mais encore une fois, s'il plante, personne ne le démarrera. Nous faisons ont crontab, donc pour l'instant, nous lancerons l'application de temps en temps pour faire un bilan de santé et, si nécessaire, la continuer à fonctionner. Ajout également de quelques outils de débogage dans ~/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*

Bref, pas si difficile. ASP.NET Core et .NET Core en dessous peuvent s'exécuter à peu près n'importe où, tout comme PHP, Python, peu importe.

Si vous êtes un hôte et que vous souhaitez parler à quelqu'un de Microsoft de la configuration de l'hébergement partagé ASP.NET Core, envoyez un e-mail à [email protected] et parlez-lui ! Si vous êtes GoDaddy, je m'excuse, et vous devriez également envoyer un e-mail.;)

Parrain : Obtenez le dernier JetBrains Rider pour le débogage du code .NET tiers, Smart Step Into, d'autres améliorations du débogueur, C# Interactive, un nouvel assistant de projet et le formatage du code dans les colonnes.


Linux
  1. 4 façons de trouver un cœur de processeur qui exécute un processus particulier sous Linux

  2. Visual Basic est-il pris en charge par .NET Core sous Linux ?

  3. Comment supprimer les versions précédentes de .NET Core de Linux (CentOS 7.1)

  4. Comment écrire un démon Linux avec .Net Core

  5. Erreur lors de l'installation de Nodejs sur l'hébergement Linux partagé Godaddy

Explorer ASP.NET Core avec Docker dans les conteneurs Linux et Windows

Déplacement d'un ASP.NET Core d'Azure App Service sur Windows vers Linux en testant d'abord dans WSL et Docker

Essayer .NET Core sur Linux avec juste une archive tar (sans apt-get)

Publication d'un site Web ASP.NET Core sur un hôte de machine virtuelle Linux bon marché

Comment installer (.NET Core) Dotnet Core sur les distributions Linux

MX Linux :essayez cette distribution Linux pour une expérience de bureau dynamique