XREA サーバで最新の Node.js を使う

以前紹介したとおり、ちょっと頑張れば SSH 接続ができる XREA。

XREA サーバにはデフォルトで Node.js と npm が入っているのだが、少々バージョンが古い。

$ /usr/bin/node -v
v6.17.1

$ /usr/bin/npm -v
3.10.10

そこで、最新の Node.js を導入してみる。

目次

SSH 接続し、制限なしの Bash を使えるようにする

以前紹介した記事に沿って SSH 接続する。デフォルトでは rbash という制限付きのシェルで、cd などができないので、制限がない Bash に切り替える。

$ chsh -s /bin/bash
# パスワードを入力する
# 変更後、再ログインすれば反映される様子

# うまくいかなかったら以下のいずれかで Bash を開けば行けた
$ bash
$ /bin/bash

# /usr/bin/bash だと rbash になってしまうようなので確認しておく
$ echo "${BASH}"
/bin/bash

最新の Node.js をダウンロードする

Node.js の公式ページから、「Linux Binaries (x64)」のリンク URL を取得する。LTS でも良いし、Current でも良い。自分は v14.13.1 (Current) を選択した。

そしたらダウンロードする。

$ curl -sSL -O https://nodejs.org/dist/v14.13.1/node-v14.13.1-linux-x64.tar.xz

$ ls -lh
-rw-r--r--  1 neo hpusers 21M 2020-10-14 10:41 node-v14.13.1-linux-x64.tar.xz

解凍し配置する

ファイルをダウンロードしたら、解凍して適当なところに配置する。今回は ~/.local/lib/ 配下に配置することにした。

# 拡張子のとおり XZ 形式
$ file ./node-v14.13.1-linux-x64.tar.xz
node-v14.13.1-linux-x64.tar.xz: XZ compressed data

# まずはその場 (ホームディレクトリ) に解凍してみる
$ tar xvf ./node-v14.13.1-linux-x64.tar.xz

# ディレクトリを用意し、移動する
$ mkdir -p ~/.local/lib
$ mv ./node-v14.13.1-linux-x64/ ~/.local/lib/

# 配置できたか確認する
$ ls -lh ~/.local/lib/
drwxr-xr-x 6 neo hpusers 9 2020-10-08 02:58 node-v14.13.1-linux-x64/

$ ls -lh ~/.local/lib/node-v14.13.1-linux-x64/
-rw-r--r-- 1 neo hpusers 52K 2020-10-08 02:58 CHANGELOG.md
-rw-r--r-- 1 neo hpusers 79K 2020-10-08 02:58 LICENSE
-rw-r--r-- 1 neo hpusers 28K 2020-10-08 02:58 README.md
drwxr-xr-x 2 neo hpusers   5 2020-10-08 02:58 bin/
drwxr-xr-x 3 neo hpusers   3 2020-10-08 02:58 include/
drwxr-xr-x 3 neo hpusers   3 2020-10-08 02:58 lib/
drwxr-xr-x 5 neo hpusers   5 2020-10-08 02:58 share/

PATH を通す

以上で配置ができたので、PATH を通す。~/.bash_profile あたりで以下のように書き、反映する。rbash だと環境変数 PATH は読み取り専用だと怒られるので注意。

export PATH="${HOME}/.local/lib/node-v14.13.1-linux-x64/bin:${PATH}"
# 反映する
$ source ~/.bash_profile

# 最新版になっている
$ node -v
v14.13.1

$ npm -v
6.14.8

最新版の Node.js を CGI として使えるか確認する

今回は ~/.local/lib/ 配下に雑に配置したのだが、フルパスで指定すれば Node.js を CGI として使用できる。

# フルパスを確認しておく。${HOME} は /virtual/【ユーザ名】/ となる
$ type node
node はハッシュされています (/virtual/neo/.local/lib/node-v14.13.1-linux-x64/bin/node)

# Node.js v12 以降で使える async・await を使った簡単な CGI を書いてみる
$ cat <<EOL > ~/public_html/test.cgi
#!/virtual/neo/.local/lib/node-v14.13.1-linux-x64/bin/node

process.stdout.write('Content-Type: text/html\n\n');
(async () => {
  await new Promise(r => setTimeout(r, 2000));
  console.log(process.version);
})();
EOL

# 実行権限を付与する
$ chmod 777 ~/public_html/test.cgi

# ブラウザや curl でアクセスしてみる。2秒ほど待たされた後に、インストールした Node.js のバージョンが表示されたら OK
$ curl http://neo.s21.xrea.com/test.cgi
v14.13.1

ついでに。

XREA の無料サーバ (s21) の内容はこんな感じだった。

$ cat /etc/os-release
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:7"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"

CENTOS_MANTISBT_PROJECT="CentOS-7"
CENTOS_MANTISBT_PROJECT_VERSION="7"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="7"

$ lscpu
アーキテクチャ: x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                48
On-line CPU(s) list:   0-47
コアあたりのスレッド数:2
ソケットあたりのコア数:12
Socket(s):             2
NUMAノード:         2
ベンダーID:        GenuineIntel
CPUファミリー:    6
モデル:             79
Model name:            Intel(R) Xeon(R) CPU E5-2650 v4 @ 2.20GHz
ステッピング:    1
CPU MHz:               2500.007
CPU max MHz:           2900.0000
CPU min MHz:           1200.0000
BogoMIPS:              4400.42
仮想化:             VT-x
L1d キャッシュ:   32K
L1i キャッシュ:   32K
L2 キャッシュ:    256K
L3 キャッシュ:    30720K
NUMAノード 0 CPU:   0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,44,46
NUMAノード 1 CPU:   1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31,33,35,37,39,41,43,45,47
Flags:                 fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch epb invpcid_single intel_pt ssbd ibrs ibpb stibp kaiser tpr_shadow vnmi flexpriority ept vpid fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm cqm rdseed adx smap xsaveopt cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local dtherm ida arat pln pts md_clear flush_l1d

$ lsmem
RANGE                                  SIZE  STATE REMOVABLE BLOCK
0x0000000000000000-0x000000007fffffff    2G online        no     0
0x0000000100000000-0x000000207fffffff  126G online        no  2-64

Memory block size:         2G
Total online memory:     128G
Total offline memory:      0B

$ free -h
              total        used        free      shared  buff/cache   available
Mem:           125G        2.5G        122G         30G        696M        122G
Swap:          127G        118G        9.1G

$ df -h
ファイルシス       サイズ  使用  残り 使用% マウント位置
lxd/containers/s21   4.7T   56G  4.7T    2% /
none                 492K  4.0K  488K    1% /dev
udev                  63G     0   63G    0% /dev/tty
tmpfs                100K     0  100K    0% /dev/lxd
tmpfs                100K     0  100K    0% /dev/.lxd-mounts
tmpfs                 63G  4.0K   63G    1% /dev/shm
tmpfs                 63G  4.4G   59G    7% /run
tmpfs                 63G     0   63G    0% /sys/fs/cgroup
/dev/shm             4.0G  140K  4.0G    1% /mnt/ram
/dev/shm              64M     0   64M    0% /mnt/ram2
tmpfs                 13G     0   13G    0% /run/user/1501
tmpfs                 13G     0   13G    0% /run/user/0
tmpfs                 13G     0   13G    0% /run/user/10002