🌟

エックスサーバー等でNode20を無理やり動かす方法: 非公式ビルド

2024/04/27に公開

最終更新: 2023-12-11

  • nvm 0.39.7
  • glibc 2.17
  • NodeのLTSが 20.10.0

Node16が死んだ。

エックスサーバーといった、安価な共用レンタルサーバーユーザーにとっては、かなりの痛手である。

$ cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)

試しに契約しているエックスサーバーでOSバージョンを調べてみた。自分のマシンではCentOS7になっている。

https://github.com/nodejs/node/blob/main/BUILDING.md#platform-list

つまり、上記のサーバーではNode18以降が使えない。というのも、ビルドに必要なglibcの要求が2.28以上になってしまったので、上記のマシンはOSの更新が必要ということである。

https://github.com/nodejs/unofficial-builds/pull/69

と思っていたら、ヒーローが現れ、glibc 2.17しかない環境でも動く非公式ビルドが提供されるようになった。Node18以降の要求はglibbc2.28なのに対し、実際は2.17でもコンパイルできるらしい。

https://unofficial-builds.nodejs.org/download/release/

つまり、こちらに列挙されている中で、バージョンの末尾のアーキテクチャ部分が linux-x64-glibc-217 となっているビルドは、CentOS7環境でも動く。当然非公式なので完全な動作の保証はない。


以下自己責任ゾーン

https://unofficial-builds.nodejs.org/download/release/v20.10.0/

ということで、2023年12月11日時点のLTS node-v20.10.0-linux-x64-glibc-217.tar.xz を、nvmで入手して、エックスサーバーで動かしてみる。

https://gist.github.com/dotenorio/474f26e4048764e9f082cdc5fbcb5581

NVM_NODEJS_ORG_MIRROR=https://unofficial-builds.nodejs.org/download/release を指定すれば、非公式ビルドにサーバーを変更できる。だが、ここで問題発生。nvm 0.39.7 時点では非公式ビルドのバリエーションなんか知らんので、非公式ビルドのうちlinux-x64を探してしまい404になる。

そこでnvm.shを直接編集する。 すまんがパッチを作ってる余裕がねえ。誰かがレンタルサーバーのnvmを上書きしない限り永続するという前提。

https://github.com/nvm-sh/nvm/blob/v0.39.7/nvm.sh#L2213-L2229

つまり nvm_get_download_slug 関数の返り値に -glibc-217を無理やりつける。

vi +2225 ~/.nvm/nvm.sh 
-     nvm_echo "${FLAVOR}-${VERSION}-${NVM_OS}-${NVM_ARCH}"
+     nvm_echo "${FLAVOR}-${VERSION}-${NVM_OS}-${NVM_ARCH}-glibc-217"

決してARCH変数に手を加えてはいけない。あくまでスラッグ部分だけを編集する。こうすることで、後続の処理に影響が出ないようにする。

source .bash_profile
NVM_NODEJS_ORG_MIRROR=https://unofficial-builds.nodejs.org/download/release nvm install v20.10.0
nvm use v20.10.0

これで使えるはず。

https://github.com/nvm-sh/nvm/issues/3041

そもそも、マシンに応じて各種非公式ビルドに自動で切り替えるようになったら、めちゃくちゃ楽。

上記のリクエストでは、RISC-V用のビルドを無視してコンパイルしやがるからめんどいと言われている。そこらへんもnvmが判断するようになれば、この記事の手順は不要になる。

更新履歴

  • 2023/11/04 master更新されてたのでv0.39.5との比較URL追記
  • 2023/12/01 埋め込んだソースコードをv0.39.7に更新

Discussion