まず、免責事項です。これをしないでください。理論をテストし、要点を証明するためにこれを行いました。 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
つまり、このように 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# インタラクティブ、新しいプロジェクト ウィザード、および列のコードの書式設定を入手してください。