モヒカンメモ

髪色が定期的に変わることに定評のある(比較的)若者Webエンジニアの備忘録

さくらのレンタルサーバ上で Node.js (npm) を使えるようにする

諸般の事情でさくらのレンタルサーバ上で Node.js (npm) を使いたくなったので、調べたことやインストール手順を残しておく。

前提:

  • 2022年5月時点の情報
  • さくらのレンタルサーバではNode.js (npm) は提供していない (ので使えるようにすることも含めてすべて自己責任)

選択肢

(1) パッケージマネージャでNode.jsをインストールする

さくらのレンタルサーバはFreeBSDというOSが使われていて、FreeBSDではパッケージマネージャとして packagesports が使えるらしい。

[pinkumohikan ~]$ uname -s
FreeBSD

https://docs.freebsd.org/ja/books/handbook/ports/

さくらのレンタルサーバはいわゆる "レンタルサーバ" なので、パッケージをグローバルインストールするのに必要なroot権限は (当然) 利用者には与えられていない。そのためパッケージマネージャを利用してNode.jsをインストールすることは出来ない。

(2) バイナリをダウンロードして使う

macOSやLinux等のメジャーOS用のバイナリは公開されているが、FreeBSD用の公式Node.jsバイナリは配布されてなかった。

https://nodejs.org/ja/download/

Download Node.js (npm) Binary

(3) バイナリをコンパイルして使う

Node.jsはOSSなのでソースコードが公開されている。

https://github.com/nodejs/node

コンパイルに必要なアレコレ (gccとか) はさくらのレンタルサーバへインストールされていたので、Node.jsのソースコードをダウンロードして自分でコンパイルすることでNode.js (npm) を使うことができそう。

Node.jsのインストール

今回は「(3) バイナリをコンパイルして使う」の方法でNode.jsを使えるようにしていく。

(1) OpenSSLをコンパイルする

標準で使えるOpenSSLはバージョンが古くてNode.jsのビルドに使えない (※) ため、新しめなOpenSSLをダウンロード & コンパイルする。

https://www.openssl.org/

[pinkumohikan ~/openssl]$ curl -sSf https://www.openssl.org/source/openssl-1.1.1o.tar.gz -O
[pinkumohikan ~/openssl]$ tar zxf openssl-1.1.1o.tar.gz

[pinkumohikan ~/openssl-1.1.1o]$ ./config --prefix=/home/pinkumohikan/openssl --openssldir=/home/pinkumohikan/local/openssl
[pinkumohikan ~/openssl-1.1.1o]$ make
[pinkumohikan ~/openssl-1.1.1o]$ make install

(2) Node.jsをコンパイルする

2022年5月時点の推奨LTSはNode.js 16系だが、Node.js 16からPython 3必須になる問題 (※) があって都合が悪いので今回はNode.js 14を使うことにする。

https://nodejs.org/ja/download/

[pinkumohikan ~]$ curl -sSf https://nodejs.org/dist/v14.9.0/node-v14.9.0.tar.gz -O
[pinkumohikan ~]$ tar zxf node-v14.9.0.tar.gz

[pinkumohikan ~/node-v14.9.0]$  ./configure --shared-openssl --shared-openssl-includes=/home/pinkumohikan/openssl/include/ --shared-openssl-libpath=/home/pinkumohikan/openssl/lib/
Package openssl was not found in the pkg-config search path.
Perhaps you should add the directory containing `openssl.pc'
to the PKG_CONFIG_PATH environment variable
Package 'openssl', required by 'virtual:world', not found
Node.js configure: Found Python 2.7.18...
INFO: configure completed successfully
[pinkumohikan ~/node-v14.9.0]$ export LD_LIBRARY_PATH=/home/pinkumohikan/openssl/lib
[pinkumohikan ~/node-v14.9.0]$ nohup make install DESTDIR=/home/pinkumohikan/local PREFIX=

make install には数十分かかるのでコネクション切断に備えてnohupつけておくのがオススメ。

(3) Pathを通す

モノができたらあとはパスを通すだけ。

[pinkumohikan ~/node-v14.9.0]$ echo "export PATH=$PATH:~/local/bin
export LD_LIBRARY_PATH=/home/pinkumohikan/openssl/lib" >> .bashrc

ログインし直すか source .bashrc して

[pinkumohikan ~]$ node -v
v14.9.0
[pinkumohikan ~]$ npm -v
6.14.8

完。

備考

OpenSSLが古くてNode.jsのコンパイルに使えない問題

標準のOpenSSLを利用してNode.jsをコンパイルしようとすると下記のようなエラーが出る。

[pinkumohikan ~/node-v14.9.0]$ make
...
../src/node_crypto.h:72:46: error: use of undeclared identifier
      'EVP_MD_CTX_free'; did you mean 'EVP_MD_CTX_create'?
using EVPMDPointer = DeleteFnPtr<EVP_MD_CTX, EVP_MD_CTX_free>;
                                             ^~~~~~~~~~~~~~~
                                             EVP_MD_CTX_create
[pinkumohikan ~]$ openssl version
OpenSSL 1.0.2o-freebsd  27 Mar 2018

GitHub Issueを軽く読んだ感じOpenSSLが古いせいらしい。

https://github.com/nodejs/node/issues/22025

Node.js 16からPython 3必須になる問題

さくらのレンタルサーバではPython 2系までしか使えないので、Python 3系が必須となるNode.js 16系は入れられない。

[pinkumohikan ~/node-v16.15.0]$ ./configure
Node.js configure: Found Python 2.7.18...
Please use python3.10 or python3.9 or python3.8 or python3.7 or python3.6.

Node.js 14系までならPython 2系でいける。

ただ、Python 3を自前コンパイルすればNode.js 16系もいけそうな気がするので誰か試してみて欲しい。

https://www.python.org/downloads/

参考にした資料