諸般の事情でさくらのレンタルサーバ上で Node.js (npm) を使いたくなったので、調べたことやインストール手順を残しておく。
前提:
- 2022年5月時点の情報
- さくらのレンタルサーバではNode.js (npm) は提供していない (ので使えるようにすることも含めてすべて自己責任)
選択肢
(1) パッケージマネージャでNode.jsをインストールする
さくらのレンタルサーバはFreeBSDというOSが使われていて、FreeBSDではパッケージマネージャとして packages
と ports
が使えるらしい。
[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/
(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をダウンロード & コンパイルする。
[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/
参考にした資料
- OpenSSLが error while loading shared libraries libssl.so.1.1
- https://kaworu.jpn.org/security/OpenSSL%E3%81%8C_error_while_loading_shared_libraries_libssl.so.1.1
- ビルド後
node
コマンド実行時に「libssl.so.1.1見つからんのやが」って怒られたときに参考になった
- 共有ライブラリの確認(ldd)と設定(ldconfig)
- うっかりnohup無しで長時間かかるコマンドを実行したときに後から終了しないようにする
- https://blog.glidenote.com/blog/2013/09/26/bg-and-disown/
- 半年に一回ぐらいこの記事読みに行ってる (いい加減覚えろ)
- How to build native addon against their own version of OpenSSL - Ignoring Node.js shipped OpenSSL #1724