エックスサーバーにWebアプリケーションをリリースしてみた【ASP.NET Core 他】

こんにちは、松井です。

「自作アプリをリリースしたいけど、
レンタルサーバー借りると、お金かかるしなぁ…」

と、ケチなことを考えていたところ、

エックスサーバーが
サーバーであることに気づきました。

 

なので、今回は、

エックスサーバーへ
Webアプリケーションをリリースしていこう

と思います。

 

僕は、エックスサーバーって、

「WordPress専用機」

だと思っていたんですけど、

言われてみれば、
エックスサーバーも

「サーバー」…、
(ちなみに、Linuxサーバー)

Webアプリリリースできるんですね! 盲点でした。笑

 

今回、僕がリリースするのは、

ASP.NET Core API

です。

とはいえ、他のアプリでも、
作業の大枠は同じ(はず)なので、

この記事は、様々なアプリリリースのお力になれるでしょう!

作業の全体像としては、

まず、ASP.NET Coreのアプリケーションを
起動できる土台づくりとして、

1. エックスサーバーへのSSH接続
2. .NETをインストール

を行います。

そのあと、

3. アプリケーションファイルをエックスサーバーへ設置
4. インターネット上へオープンにしていく

という流れになっております。

 

1. エックスサーバーへ、SSH接続する。

ここでは、

1. 公開鍵認証用鍵ペアの生成して、秘密キーの取得
2. TeraTermというアプリから、エックスサーバーへSSH接続します。(その際に、秘密キーを使用します)

を行います。

このへんは、エックスサーバーの公式ドキュメントがしっかりあるので、
それらを参考にやっていきましょう。

 

1-1. 秘密キーの発行

秘密キーを発行します。

こちらの公式ドキュメントを参考に、発行しましょう。
※パスフレーズは、忘れないようにメモしておきましょう。

(僕の場合は、)
公式ドキュメントの通りに進めていくと、

秘密キー(「[サーバーID].key」というファイル)がダウンロードされたので、
そのファイルを「id_xserver_rsa」にリネームし、テキトーなフォルダへ移動しました。

 

1-2. TeraTermで接続

次に、こちらを参考に、Tera TermでエックスサーバーへSSH接続します。

さきほどのパスフレーズ、秘密キーを使用して、
エックスサーバーへ接続していきます。

公式ドキュメントの通りにやれば、何の問題もありませんでした。

もしTeraTermから秘密キーを読み込めない時は、
秘密キーへのパスに、日本語や空白が含まれていないか確認してみてください。(僕はここで地味につまりました)

 

箸休め:とりあえず知っておくべきLinuxコマンド

・ls : カレントディレクトリにあるファイルを一覧表示します。
・cd xxxxx : 指定したディレクトリへ移動します。
・mkdir xxxxx : 新しくディレクトリを作成します。
・sh xxxxx : shファイルを実行します。
・echo $PATH : 環境変数を参照します。(あとで使います。)

 

2. エックスサーバーへ、NET 6.0をインストールする。

NET 6.0のインストールは、sudo yumが使えれば、

$ sudo yum install dotnet-sdk-6.0
$ sudo yum install aspnetcore-runtime-6.0

これで、インストールができるそうですが、
エックスサーバーは共用サーバー。

僕らには一般ユーザー権限しかないので、
sudo(スーパーユーザー実行)コマンドは使えないみたいですね。

なので今回は、dotnet-install スクリプトをつかっていきます。

 

2-1. dotnet-install.shで、NET 6.0をインストールする。

まず、dotnet-install スクリプトを以下のリンクからダウンロードします。
Linux 用を使っていきましょう。

・Windows
https://dot.net/v1/dotnet-install.ps1
・macOS/Linux/WSL
https://dot.net/v1/dotnet-install.sh

 

次は、dotnet-install スクリプトをエックスサーバーへアップロードします。

アップロード方法は、FTPでもなんでもOKです。

僕は、FTPツールをもってなかったので、
エックスサーバーのファイル管理からアップロードしました。

アップロード先は、任意ですが、

僕の場合、ホームディレクトリに「temp」ディレクトリを新しく作って、
そこにスクリプトをアップロードしています。

 

アップロードの文字コードは「SJIS」でいけました。

ホントは、バイナリでアップしたいところですが、
そういうのはないようです。謎です。

 

エックスサーバーのファイル管理は、
エックスサーバーにログインすると、このへんにあります。

>>エックスサーバーログイン

 

で、

dotnet-install スクリプトのアップロードが完了したら、

(エックスサーバーへSSH接続して、)
アップロードしたディレクトリに移動して、

dotnet-install スクリプトを実行していきます。

$ cd ~/temp$ sh dotnet-install.sh --version latest --install-dir ~/opt/dotnet

 

僕の場合は、dotnetのインストール先として、
「opt/dotnet」ディレクトリを作り、そこへインストールしてます。

 

コマンド実行後、

「Installation finished successfully.」

とメッセージ表示されたので、インストール完了されたっぽいですね。

とりあえず一安心。

 

2-2. dotnetへパスを通す。

先ほどdotnetをインストールしたディレクトリを
環境変数へ追加し、パスを通します。

$ export PATH=$HOME/opt/dotnet:$PATH

こちらのコマンドで、環境変数を確認して、ちゃんと追加されていたらOKです。

$ echo $PATH

 

2-3. NET 6.0が正しくインストールされたことを確認する。

NET 6.0が正しくインストールされたことを確認します。

$ dotnet --version

を実行して、

dotnetのバージョン「6.0.104」が表示されたので、
問題なく、NET 6.0がインストールされてるのが分かりました。

 

3. エックスサーバーへ、ASP.NET Coreアプリを発行する。

Visual Studioから、ASP.NET Coreアプリを発行します。

と、発行前に、こちらの2点やっておきます。

 

3-1. プロジェクトフォルダ内のappsettings.jsonに、urlsを追加しておく。

下記コードのurlsの行を追加します。

{
"urls": "http://localhost:5001",
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*"
}

1行目のurlsだけ追加すれば、OKです。

 

3-2. 公開設定で、ターゲットランタイムに「linux-x64」を選択しておく。

公開設定で、ターゲットランタイムに「linux-x64」を選択します。

これをミスると、地味にハマる(らしい)ので、
この設定は、忘れずやっておきましょう。

 

発行が完了したら、
アプリファイルをエックスサーバーへアップロードしていきます。

僕の場合は、~/h1deblog.com/dotnet/hideapp へアップロードしました。

 

3-3. アプリの実行。

アップロードしたアプリを、実行します。

$ cd ~/h1deblog.com/dotnet/hideapp
$ dotnet hideapp.dll

デバック実行のときに、いつもみるコンソール画面になったら、成功です。

 

4. エックスサーバーのWebアプリを、インターネット上へ公開する。

しかしこのままでは、ブラウザからWebアプリへアクセスできないので、
これから、インターネット上へオープンにできるように設定していきます。

(WordPressがはいった)エックスサーバーは、
public_htmlフォルダが、公開フォルダになっているので、

そのなかに、公開したいフォルダを作成し、
.htaccessファイルを設置して、オープンとしていきます。

例えば、
「https://h1deblog.com/hideapp」で公開したい場合は、
「public_html/hideapp/.htaccess」という風にします。

.htaccessには、以下のように書きました。

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^(.*)$ http://localhost:5001/$1 [P,L]
</IfModule>

 

5. Webアプリを常時、バックグラウンドで実行する [22/06/28 追記]

Webアプリを常時、バックグラウンドで実行させます。

(上に書いたような)dotnetコマンドだけでは、
実行しても、Tera Termのセッションが切れてしまうと、
アプリも一緒に落ちてしまいます。

正直、これには、かなーーーり悩まされまして、
解決方法がわからないまま、約2ヵ月が経ちました…
(単純に調査の時間がとれなかったのもありますが)。

そして、やっと分かった、解決方法がこちら。

$ nohup dotnet ~/h1deblog.com/dotnet/hideapp/hideapp.dll &

このコマンドを叩いておけば、いけます。

これで、アプリケーションリリース完了です!

以上!

・・・なんといいますか、

この答えにたどり着くまでに、
とっても遠回りをした気がします。

でも答えは、いつもシンプルでした…。あざしたー。

 

最後に。

「(個人開発での)
アプリリリースは、エンジニアの底力を向上させる。」

と僕は思っています。

 

というのも、

会社の業務での開発では、
アプリケーションの機能の一部だけに
携わることがほとんどで、

なかなか、
アプリケーションの全体をみることは、
難しいからです。

 

しかし、

「全は一、一は全」

という言葉があるように、

全体像がわかるからこそ、
目の前の機能をよりよいカタチで開発できるし、

そして、その目の前の開発によって、
アプリケーション全体としても、よりよいモノになっていきます。

 

それはつまり、

自分たちが開発しているものが、
お客さんのもとに届き、

そこでお客さんに、どのような影響を与えるのか?

を理解しながら開発すること

とも言えます。

 

 

つい先日、上司たちと

「 コーディング技術は、どのようにしたら
開発チーム全体で、あげられるか?」

について話していました。

 

そこで話に上がったのは、

コーディングが苦手な人っていうのは、

stringを文字列、
intを数字としてしか、みれてないよね、

ということでした。

 

コードを、コードとしてしか、
捉えられていないよね、

ということです。

 

というのも、

本来であれば、同じintであっても、

本の冊数(Books.Count)におけるintと、
交通事故の数(Accident.Count)におけるintでは、

全く別モノです。

 

だって、

本の冊数における、+1は、大したことなくても、
交通事故での、+1だとしたら、

結構、大きい差が出てくると思いません?

 

そんなふうに、

自分が書いているコードが
どんな意味や役割をもっているか、を

ちゃんと想像していくことが大切だと思っています。

 

そして、

それが結果として、コードの質を高めるよね。

という話に、その雑談でも、まとまりました。

 

 

そもそも、

プログラミングコードというのは、

現実世界のモノを抽象化することで、
コードとして、表現しているのですから。

(特に、オブジェクト思考では。)

 

コーディング感覚を高めたければ、

そのコードが、現実における、何を抽象化してるの?

っていうのを、掴めるようになるべし。

ってことです。

 

そして、それは、

自分で、

「現実世界のものを
アプリケーションに落とし込んでいく」

という0から1での、
アプリ開発をやってみると、

そのような感覚があがるのでは?

と、僕は、思っています。

 

なので、

「ブログもやってて、アプリもリリースしたい!」
っていう方は、

ぜひ、エックスサーバーへリリースしてみてください!

 

では、今日はこのへんで。

ありがとうございました!

 

 

P.S.

これを期に、今回の調査結果(の一部)をまとめたので、よかったらご覧ください。

>> 【雑に】Linux まとめ