GNU/Linux >> Linux の 問題 >  >> Linux

GoDaddys の最も安価な共有 Linux ホスティングで ASP.NET Core を実行する - 自宅で試してはいけない

まず、免責事項です。これをしないでください。理論をテストし、要点を証明するためにこれを行いました。 ASP.NET Core とそれが実行される .NET Core はオープン ソースであり、ほぼどこでも実行できます。基本的に PHP のみをサポートする GoDaddy の最も安価なホスティング ($3、ただし $8 にスケーリング) で ASP.NET Core サイトを実行できるかどうかを確認したかったのです。完全な Linux VM ではありません。ロックダウンされ、制限されています。ルートがありません。あるはずのほとんどのツールが不足しています。

でも。

とにかく、ASP.NET Core を実行できるかどうかを確認したかったのです。もしそうなら、彼ら (および他の安価なホスト) は .NET チームと話し、ASP.NET Core がオープン ソースであり、既存のインフラストラクチャで簡単に実行できることを知るでしょう。

<ブロック引用>

再度: これをしないでください。ハッキーです。ばかげている。しかし、それはとてもクールです。私見では。また、 Tomas Weinfurt に感謝します。

まず、GoDaddy にアクセスして、安価なホスティングにサインアップしました。繰り返しますが、VM ではなく、共有されているものです。また、supercheapaspnetsite.com も登録しました 彼らは、実際には何もできないcPanelベースのWeb管理システムを使用しています. SSH をオンにして、PHP をいくつか実行し、一般的にいろいろ調べてみることはできますが、厳密には低レベルではありません。

まず、ssh (シューッ!) して、作業内容を確認します。すべての開発者がオンにする必要がある、Windows 10 の Ubuntu 機能を試してみます。 Windows 10 上の Linux から開始する場合、Linux ホストでの作業が非常に簡単になります。

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、Red Hat のように見えるので、CentOS 6 は互換性があるはずです。

私は .NET Core 2.1 (現在プレビュー中です!) を使用し、https://www.microsoft.com/net/download/all で SDK を入手して、自分の Windows マシンにインストールします。アプリをビルドします。これを行うために Windows を使用する必要はありませんが、これは私が持っているラップトップであり、CentOS/RHEL6 をターゲットにして Windows でビルドできることもわかっています。

次に、新しい ASP.NET サイトを作成します

dotnet new razor

そして、次のような自己完結型のバージョンを公開します:

dotnet publish -r rhel.6-x64

これらのファイルは \supercheapaspnetsite\bin\Debug\netcoreapp2.1\rhel.6-x64\publish\ のようなフォルダーになります。

<ブロック引用>

注: このローカル パブリッシュ中に RHEL6 ランタイムをダウンロードするには、この .NET Core プレビューのデイリー用に NuGet フィードを追加する必要がある場合があります。

次に、WinSCP (または任意の FTP/SCP クライアント、rsync など) を使用して、ファイルを GoDaddy 共有サイトの ~/www フォルダーに移動しました。それから私は

chmod +x ./supercheapasnetsite

実行可能にします。それでは、GoDaddy での ssh セッションから、アプリを実行してみましょう!

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'

もちろん、そう簡単にはいきませんよね? .NET Core は巻き戻しライブラリ (共有オブジェクト) を必要としていますが、このロックダウンされたシステムには存在しません。

そして、yum/apt/rpm またはそれを正しくインストールする方法がありませんか?

この http://download.savannah.nongnu.org/releases/libunwind/ のような場所で tar.gz ファイルを探しに行くこともできますが、バージョンについて考えて、すべてが揃っていることを確認する必要があります。私が CentOS6 をターゲットにしていることを考えると、https://centos.pkgs.org/6/epel-x86_64/libunwind-1.1-3.el6.x86_64.rpm.html から始めて、libunwind-1.1-3.el6 をダウンロードする必要があります。 .x86_64.rpm.

その rpm ファイルをクラックして開き、ライブラリを取得する必要があります。 RPM パッケージは CPIO アーカイブのヘッダーにすぎないため、ローカルの Ubuntu インスタンス (Windows 10 上) から rpm2cpio を apt-get install できます。次に、/mnt/c/users/scott/Downloads (ファイルをダウンロードした場所) から抽出します。

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

この部分はクールです。これらのファイルはありますが、ルートも、それらを「インストール」する方法もありません。ただし、LD_LIBRARY_PATH 環境変数をエクスポート/使用してライブラリのロード方法を制御するか、これらのファイルを $ORIGIN/netcoredeps に配置することができます . .NET Core 上の自己完結型 Linux アプリケーションの詳細については、こちらをご覧ください。

<ブロック引用>

公開された .NET Core アプリケーション (.NET Core ホスト) のメインの実行可能ファイルには、RPATH プロパティが $ORIGIN/netcoredeps に設定されています。 .つまり、Linux 共有ライブラリー・ローダーが共有ライブラリーを探すとき、デフォルトの共有ライブラリーの場所を探す前に、この場所を探します。 LD_LIBRARY_PATH で指定されたパスは注目に値します。 LD_PRELOAD で指定された環境変数またはライブラリ 環境変数は、RPATH プロパティの前に引き続き使用されます。したがって、サードパーティ ライブラリのローカル コピーを使用するには、開発者は netcoredeps という名前のディレクトリを作成する必要があります。

この時点で、"netcoredeps" フォルダーをパブリック フォルダーに追加し、それ (scp) を GoDaddy にコピーしました。もう一度実行しましょう。

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

わかりました、今は ICU パッケージについて不平を言っています。これらはグローバル化のためのものです。これは、自己完結型の Linux アプリのドキュメントにも記載されており、ダウンロードできるコンパイル済みのバイナリがあります。ただし、選択肢はあります。

<ブロック引用>

アプリがグローバリゼーションの使用を明示的にオプトアウトしていない場合は、 libicuuc.so.{version} も追加する必要があります 、 libicui18n.so.{version} 、および libicudata.so.{version}

私は「オプトアウト」が好きなので、これらのアップを掘り下げる必要はありません (可能ですが) ので、CORECLR_GLOBAL_INVARIANT 環境変数を 1 に設定するか、System.Globalization.Invariant =true を supercheapaspnetsite.runtimeconfig に追加できます。 .json を使用します。;)

もう一度実行すると、libuv について別の苦情が寄せられます。このインスタンスにインストールされていないさらに別の共有ライブラリ。 できる それを入手して netcoredeps に入れるか、.NET Core 2.1 を使用しているので、何か新しいことを試すことができます。 .NET Core 2.1 では、ソケットと http パフォーマンスに関していくつかの改善が行われました。クライアント側では、これらの新しいマネージド ライブラリは、新しい高性能 Span を使用してマネージド コードでゼロから作成され、サーバー側では Kestrel (Kestrel は .NET Core Web サーバー) の実験的な UseSockets( )彼らはそれを上に移動し始めているので。

つまり、このように UseSockets() を使用するように Program.cs を変更することで、libuv の使用を完全に回避できます。

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

もう一度実行してみましょう。 ASPNETCORE_URLS 環境変数を追加し、8080 などの高いポートに設定します。覚えておいてください、私は管理者ではないので、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.

なんてこった、それは実際に始まった.

わかりましたが、supercheapaspnetsite.com:8080 からはアクセスできません。これは、GoDaddy のロックダウンされた管理共有ホスティングであるためです。コントロール パネルでポートを開いたり、ポートを転送したりすることはできません。

しかし。彼らは Apache を使用しており、それには .htaccess ファイルがあります!

mod_proxy を使って試してみませんか?

ProxyPassReverse / http://127.0.0.1:8080/

いいえ、彼らはこれをオンにしていません。外部ドメインへのプロキシを望んでいない可能性がありますが、localhost を許可するとよいでしょう。残念。とても近い。

わかりました。トラフィックを自分でプロキシします。 (完璧ではありませんが、これはすべてスパイクです)

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

これで安っぽいプロキシが 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.
?>

安っぽい、はい。 GETで動作しますか?また、はい。これは実際には Apache の仕事であり、私たちの仕事ではありませんが、Tomas のこの邪悪な考えに敬意を表します。

ブーム。 /about の別のページはどうですか?はい。

素晴らしい。しかし、アプリを自分で実行する必要がありました。私にはスーパーバイザーやプロセス マネージャーはいません (これも PHP 用の GoDaddy によって既に処理されていますが、私は特権のない世界にいます)。 (まあ、このすべては持続可能ではありませんが、それでもなおです。)

「screen」をコピーして起動し、screen ./supercheapaspnet アプリを使用するように切り離すこともできますが、クラッシュした場合、誰も起動しません。 する crontab があるので、今のところ、定期的にアプリを起動してヘルス チェックを行い、必要に応じて実行し続けます。また、~/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*

全体として、それほど難しくありません。 ASP.NET Core とその下にある .NET Core は、PHP や Python など、ほとんどどこでも実行できます。

あなたがホストで、ASP.NET Core 共有ホスティングの設定について Microsoft の担当者と話したい場合は、[email protected] に電子メールを送信して、彼らと話をしてください。あなたが GoDaddy の場合は、お詫び申し上げます。メールも送信してください。;)

スポンサー: サードパーティの .NET コードをデバッグするための最新の JetBrains Rider、Smart Step Into、デバッガーの改善、C# インタラクティブ、新しいプロジェクト ウィザード、および列のコードの書式設定を入手してください。


Linux
  1. Visual Basic は Linux 上の .NET Core でサポートされていますか?

  2. Linux (CentOS 7.1) から以前のバージョンの .NET Core を削除する方法

  3. Godaddy 共有 Linux ホスティングに Nodejs をインストール中にエラーが発生しました

  1. Linuxで特定のプロセスを実行しているCPUコアを見つける4つの方法

  2. 自己完結型の ASP.NET Core アプリケーションを Ubuntu で実行する

  3. .Net Core で Linux デーモンを作成する方法

  1. Linux 上の .NET Core 用 NuGet

  2. Mono を使用せずに、.NET Core 上の Linux 用の F# Interactive はありますか?

  3. Linux 上の .NET コア X509Store