【node】Xserverでnodeを使ってサーバーを建ててみる

初書：2021/06/28
mac : 11.4
nodebrew : v16.4.0

# 前書き

最近nodejsを使うことが多いので、せっかく借りてるXserverでもnodejsで動かしたいなと思ったのでメモ。
ちなみに公式でサポートしてないので、参考にするときは自己責任でお願いします。

# 前提

・ローカルで`http`を用いてサーバーを立てる・アクセス出来る知識がある
・Xserverの基礎知識はある
・htaccessで基礎知識がある/調べたら理解できる

# Xserverのセットアップ

Xserverは標準でnodejsには対応していないため、いくつか設定する必要がある。

## ssh接続

まずはssh接続する準備。キーの作成方法は過去に一度やったため、割愛。作成したことない場合は以下を参照

[【git】ターミナルでgithubと連携する - Qiita](https://qiita.com/yuu_1st/items/9648d19edc2a90fa1cdb#%E9%80%A3%E6%90%BA)

キーが作成できたら、Xserverのサーバーパネルへ行き、SSH設定のところの「公開鍵登録・更新」に、.pubの中身をペーストする。

あとは、この先接続しやすいように、configに設定する。

`~/.ssh/config`（なければ作成）を開き、以下を追記する

```
Host xserver
  HostName <サーバーID>.xsrv.jp
  Port 10022
  IdentityFile ~/.ssh/<プライベートキーのファイル名>
  User <サーバーID>

```

これで、`% ssh xserver`とコマンドを打つだけで接続できるようになる。

## nodebrewをインストールする

Xserverにnodebrewをインストールすることができるので、インストールしてみる。

[hokaccha/nodebrew: Node.js version manager](https://github.com/hokaccha/nodebrew)

まずは、`$ curl -L git.io/nodebrew | perl - setup`でインストールし、
`$ echo 'export PATH=$HOME/.nodebrew/current/bin:$PATH' >> ~/.bashrc`でパスを通す。
・・・のだが、`~/.bashrc`ファイルの最後に改行が入っていない可能性があるので、その場合は改行を入れてからパスを通す。
それができれば`$ source ~/.bashrc`でパスを読み直す。

次に、バージョンを上げるため、`$ nodebrew install stable`で安定板をインストールし、
`$ nodebrew list`で現在インストールされているバージョンを確認
`$ nodebrew use vXX.X.X`（Xは先ほど確認したバージョン）で先ほどインストールしたバージョンを使用する。

その後、`$ node -v`、`$ npm -v`を実行し、バージョン情報が表示できればインストールは完了。
これで、nodeを使う準備が完了した。

# プロジェクトをサーバーに入れる

セットアップが終わったので次はローカルで作成したプロジェクト(package.jsonとか色々)をサーバーにアップロードする。
アップロード自体はFTPなど好きな方法で良いのだが、今回はgithub経由でアップロードしてみる。

まずはgithubでプライベートリポジトリを作成し、プロジェクトをpushする。
それが出来れば、あとはsshの方でcloneするだけ。

なお、`public_html`下に置いてしまうと、urlの直リンクができてしまうため、それ以外のところにおく必要がある。

プライベートリポジトリはcloneする際にユーザー名とパスワードを求められる。
その際、githubに二段階認証を入れているとログインに失敗するので、トークンを生成する必要がある。

## トークンの作成

`Settings` → `Developer settings` → `Personal access tokens` から、`Generate new token`を選択

Noteは好きな名前、Select scopesは今回pullするだけなので、repoだけでいい。
それが出来ればGenerate tokenを選択し、表示されたトークンをメモしておく。
これで、cloneする際にこのトークンをパスワードとして入れればclone、pullすることができる。

参考：[GitHubに二段階認証を設定した後にGit操作できない時の解決策 - Qiita](https://qiita.com/kitoko552/items/3f45de6c876c638b690d)

# サーバーを建ててみる

では次に実際にサーバーを建ててみる。
今回はnodeに標準であるhttpを使用する

## コードを記述する

今回は単純にサーバーを立てるだけなので、アクセスすると単一のページを表示させる。

```ts:index.ts
import * as http from 'http';

http
  .createServer((req, res) => {
    if (req.method === 'GET') {
      res.writeHead(200, { 'Content-Type': 'text/plain' });
      res.end('Hello world\n');
    }
  })
  .listen(32768);
```

とりあえずアクセスすればHello worldと表示されるコード。
(httpについてはここでは記述しない)

## htaccessを記述する

次はurlから建てたサーバーにアクセス出来るようにする。
nodeで建てたサーバーに、Xserverで直接アクセスできるようにする方法がないため、htaccessを用いてRewriteRuleでアクセスさせる方法を使用する。

まず、表示させたいディレクトリ(`https://example.com/`のように直下に置く場合は`public_html`)に、`.htaccess`を設置。

その中に以下を記述

```text:.htaccess
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^$ http://localhost:32768/ [P,L]
</IfModule>
```

nodeで建てたサーバーは、localhostのlistenで指定したポートで開放するので、そこにRewriteしている。
これでサーバーを建て、Hello worldと表示されれば一通りサーバーの構築は完成した。

# サーバーをデーモン化する

デーモン化とは：バックグラウンドで動くプログラムにする
大体そんな意味。今のところ、nodeで建てたサーバーはsshで接続して実行し続けないといけない
もちろんそんな事していることはできないので、デーモン化する必要がある

## foreverのインストール

今回はforeverといういかにもデーモン化しますみたいな名前のモジュールを使用する。
Xserverの方で実行してもいいが、`git pull`すると上書きで消えるので、ローカルのプロジェクトでテスト兼用でインストールし、実行することをおすすめする。

```zsh
% npm install --save-dev forever
```

`9 vulnerabilities (5 low, 4 moderate)` 。でもgithubをみる限り更新されているので、使ってもさほど問題にはならなさそう(多分)
ちなみにこの警告が出ているので、globalではなく`save-dev`でインストールしている。

今回主に使うのは、
・`npx forever start ファイル名`（デーモン化）
・`npx forever stop ファイル名`（デーモン化の解除）
・`npx forever list`（デーモン化中のスクリプトの一覧を表示）
の３つだけ。

## コマンドに追加

nodeを使用しているので、`package.json`の`scripts`に追加しておく。

```json
  "scripts": {
    "server-dev": "tsc && npm run server-start",
    "server-start": "npx forever start out/index.js",
    "server-stop": "npx forever stop out/index.js",
    "server-list": "npx forever list",
  }
```
とりあえず4つ。typescriptを使わない場合は`server-dev`は不要。`out/index.js`は基本的にmainと同じファイル。

これで、`npm run server-start`をすればバックグラウンドでサーバーを立てることができる。

# 終わりに

初期設定さえ出来ればあとはそこまで難しくない気がする。
git pullするときに毎回パスワードを求められるのが少し面倒かも…。


# 参考サイト

[xserver に nodejs インストール | Hapicode](https://hapicode.com/server/xserver-nodejs.html#nodebrew-%E3%81%A8%E3%81%84%E3%81%86%E4%BE%BF%E5%88%A9%E3%83%84%E3%83%BC%E3%83%AB-%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)

[Node.jsアプリをLinux環境で常駐化させる　forever編 - Qiita](https://qiita.com/chihiro/items/24ca8ac81cb20c22b47e)