あるプログラミング実況配信系YouTuberのかたから「C#やっているならどうして.NET Coreをやらないの?」と言われてしまいました。本当はやってもいいのですが、そのためにVPSを別に契約するのはちょっと…。

.NET6.0 でWebアプリケーションを作成する方法やこれを公開する方法は調べればいくらでもでてくるのですが、レンタルサーバー上で動かす方法についてはほとんど見つかりません。本当は非推奨なやり方なのかもしれませんが、やってみました。

.NET SDK を使用すると.NET を使用してアプリを開発できます。またASP.NET Core ランタイムを使用すればランタイムを提供しない.NET を使用して作成されたアプリを実行することができます。

sudo yumを使わずにNET 6.0をエックスサーバーにインストールする

もしsudo yumが使えるのであれば

これでいいのですが、エックスサーバーは共用サーバーなので一般ユーザーでしかない私にsudoは使えません。

一般ユーザーであるならインストールするなら/homeディレクトリ以下でなければなりません。

sudo yum が使えないならどうするか。こんなコマンドはどうでしょうか?

実際にやってみると、他のレンタルサーバーならできるかもしれませんが、エックスサーバーの場合はsudoなしでもyumは使えないというメッセージが表示されます。

あきらめるしかないのでしょうか? さっさとあきらめて安価なVPS(仮想専用サーバー)をみつけてそこでやったほうがいいのかもしれません。でもNET 6.0をこのブログで使っているエックスサーバーにもインストールしてみたいので、もうすこし考えます。

この記事が参考になります。

dotnet-install スクリプト、使ってます? – Qiita

これによると以下のサイトからdotnet-install.shをダウンロードします。

https://dotnet.microsoft.com/en-us/download/dotnet/scripts
https://dotnet.microsoft.com/download/dotnet/scripts/v1/dotnet-install.sh

そしてサーバー上の適当な場所に作業用のディレクトリをつくってそこへアップロード。適当な場所にインストール用のディレクトリをつくります。鳩でもわかるC#管理人はホームディレクトリのなかにoptというディレクトリを作成し、そのなかにdotnetというディレクトリを作成し、そこにインストールすることにしました。

そのあとインストールしたディレクトリに移動してバージョンを調べてみると6.0.103と表示されました。インストールされています。

そのあと.bashrcを編集してパスをとおします。

.bashrc

そのあと以下を実行します。source .bashrcを実行しないと反映されません。

ためしにインストールしたディレクトリに移動しないで以下を実行してみます。すると前回同様に6.0.103と表示されました。

なにかつくって公開してみる

ではさっそく何かをつくることにします。

新しいプロジェクトの作成で「ASP.NET Core Webアプリ」を選択。プロジェクト名はZeroとします。

メニューから[デバッグなしで実行]を選択すると https://localhost:7249/(7249の部分は環境により異なる)で作成したアプリが実行されます。httpsなのに証明書が検証できないため、「警告: 潜在的なセキュリティリスクあり」と表示されますが、ここは気にせずに実行します。すると作成されたばかりの「Welcome Learn about building Web apps with ASP.NET Core.」と書かれたページが表示されます。これをこのままサーバー上で公開します。

appsettings.jsonを編集する

まずプロジェクトフォルダ内のappsettings.jsonを編集します。追加するのは”urls”ではじまる1行だけです。

そしてソリューションエクスプローラのプロジェクトを右クリックして[発行]を選択します。ターゲットはフォルダを選択します。そして設定の最後の部分でターゲットランタイムで「linux-x64」を選択します(これに気がつかなかった!)。

設定が終わったら発行ボタンをクリックします。するとpublishというフォルダのなかにファイルが生成されます。これをアップロードします。今回は ~/lets-csharp.com/dotnet/asp-net-core-app/zeroというディレクトリを作成してそこにアップロードします。

サーバー上で実行し表示させる

アップロードし終わったらアップロードしたディレクトリへ移動して実行します。

これだけでは表示されません。表示されるようにするために表示させたいディレクトリに.htaccessを設置します。

たとえば https://test1.lets-csharp.com/ で公開したいのであれば対応するディレクトリである ~/lets-csharp.com/public_html/test1.lets-csharp.com に設置します。そしてアクセスしてみると真っ白でなにも表示されません。ところが https://test1.lets-csharp.com/Index にアクセスすると表示されます。上側に表示されているリンクをクリックすると https://test1.lets-csharp.com/Privacy にもアクセスでき、Privacy Policyのページが表示されます(編集作業をしていないので無味乾燥もいいところなのですが…)。

これで一応表示はされますが、トップページへのリンクをクリックしてしまうとなにも表示されなくなります。この部分は対応が必要です(後述)。

サブディレクトリで表示させたい

ドメインやサブドメインのトップページとして表示させるのであればこれでいいのですが、サブディレクトリで表示させたい場合はちょっと面倒です。

HTMLソースをみると以下のように/で始まっている部分がたくさんあります。

そのためサブディレクトリで公開しようとするとうまくstylesheetやJavaScriptを読み込むことができません。リンクも正しくはれていないのでクリックすると見当外れなページに飛ばされます。これは https://lets-csharp.com/samples/2204/aspnetcore-app-ng/Index として公開しようとした失敗例です。

失敗例

https://lets-csharp.com/samples/2204/aspnetcore-app-zero/ で公開するのであれば以下のようにします。

Pages\Shared\_Layout.cshtmlを編集して対応

プロジェクトを作成したフォルダのなかのPages\Shared\_Layout.cshtmlを以下のように編集します。サブディレクトリで公開するときは絶対urlを指定するようにして、asp-pageタグを使うと自動的にリンク先のurlの先頭に / が入ってしまうので通常のリンクに書き換えます。

すると サンプルページ のように表示されます。