linuxBean14.04(107)nvmでnode.jsのインストールができない問題への対応

前の関連記事:linuxBean14.04(106)Bloggerに貼りつけたIPython Notebookの枠がはみ出る問題を修正 


久しぶりにlinuxBean14.04(9)node.jsとBracketsのインストールのnvmでnode.jsをインストールしようと思ったらできませんでした。あれこれ調べると原因はダンロード元がHTTPSになっていることにあるようでした。
(2016.5.19追記。さらに調べるとAnacondaのcurlへパスが切り替わっていたのが根本原因でした。記事の最終章参照。)

nvm install stableができない

pq@HP6730b1:~$ nvm install stable
Version 'stable' not found - try `nvm ls-remote` to browse available versions.
pq@HP6730b1:~$ nvm ls-remote
            N/A
nvm install stableとするとstableバージョンはない、といわれ、nvm ls-remoteとするとインストールできるバージョンはない、といわれます。

`nvm ls-remote` returns N/A prior to v0.17.3 · Issue #554 · creationix/nvm · GitHub

2014年10月21日nodejs.orgがHTTPからHTTPSに変更したのが原因のようです。

Issues · creationix/nvm · GitHub

nvmの開発者のGitHubにはこれに関する議論が載っています。

HTTPS certificate for latest.nvm.sh · Issue #614 · creationix/nvm · GitHub

nvmが使っているのフリーのURL redirecting serviceの関係でHTTPSへの対応が難しいようです。

2015年5月にlinuxBean14.04(9)node.jsとBracketsのインストールでnvm v0.25.1をインストールした時はとくに対策しなくてもnvm install stableができたので、その後またサーバー側の仕様変更があったようです。

対策1: nodejs.orgのHTTPのミラーサーバーを使う方法


nvm v0.17.3以降ではこの対策として環境変数のNVM_NODEJS_ORG_MIRRORを設定してHTTPのミラーサーバーからの取得に変更する方法があります。
export NVM_NODEJS_ORG_MIRROR="http://nodejs.org/dist"
nvm install stable
または
NVM_NODEJS_ORG_MIRROR=http://nodejs.org/dist nvm install stable
このいずれの方法でもnvm install stableができました。

ちなみに`nvm ls-remote` returns N/A prior to v0.17.3 · Issue #554 · creationix/nvm · GitHubの最初にでてくる方法ではexport NVM_NODEJS_ORG_MIRROR="https://nodejs.org/dist"となっていて、ミラーサーバーがHTTPになっていないためにうまくいきません。

この方法で問題は解決はするのですが、HTTPのミラーサーバーがいつまで継続されるのか不安だったので同じページの下の方に書いてあるもうひとつの方法を採用することにしました。

対策2: curlでUbuntuパッケージのCA証明書を使う方法


HTTPSのサーバーにアクセスするためには認証局(CA)の証明書があればよいのでUbuntuパッケージにある証明書を使います。


Synapticパッケージマネージャでca-certificatesを検索するとすでに3つのパッケージがインストールされていました。

使用するファイルは/etc/ssl/certs/ca-certificates.crtです。

これらのパッケージのプロパティのインストール済みファイルをみても/etc/ssl/certs/ca-certificates.crtは見つかりませんでしたが、ファイルはすでにインストール済でした。

curlでの設定方法が載っているのでまずcurlをインストールします。


7.35.0をインストールしました。
(2016.5.19追記。最後に書いているようにこのcurlのインストールは今回の問題解決には不要な手順です。)

環境変数でcurlにCA証明書のある場所を知らせます。
export CURL_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt
~/.bashrcの最後の行にこの1行を追加して保存します。

Terminalを起動します。

これでnvm install stableが実行できnode v6.0.0がインストール出来ました。

nvmのアンインストールと再インストール


この機会にnvmをアップグレードすることにしました。

アップグレードする方法はインストールと同じです、、、

ところが最初のインストール時にgitをインストールしておらず、nvmインストール後にgitをインストールした場合エラーがでてアップグレードできません。
pq@pq-VirtualBox:~$ nvm --version
0.25.1
pq@pq-VirtualBox:~$ curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.31.0/install.sh | bash
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  7766  100  7766    0     0  12861      0 --:--:-- --:--:-- --:--:-- 13482
=> Downloading nvm from git to '/home/pq/.nvm'
=> fatal: destination path '/home/pq/.nvm' already exists and is not an empty directory.
fatal: Not a git repository (or any of the parent directories): .git
fatal: Not a git repository (or any of the parent directories): .git

=> Source string already in /home/pq/.bashrc
=> Close and reopen your terminal to start using nvm
install script `git` detection should also check for `.git` · Issue #1028 · creationix/nvm

これは既知の問題でまだ対策されていないようなので、nvmを再インストールすることにしました。

まずはnvmのアンイストールです。

How to uninstall nvm? · Issue #298 · creationix/nvm

アンインストールは~/.nvmを削除すればnode.jsを含めてまるごとアンインストールされます。

rm -rf $NVM_DIR

環境変数NVM_DIRにnvmのインストール先のパスが入っているのでこれでnvmのフォルダが削除されます。
export NVM_DIR="/home/pq/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"  # This loads nvm
あとは~/.bashrcにあるnvmに関するこの部分を削除すればアンインストール完了です。

今回は再インストールするので.bashrcはそのままにしておきました。

インストールはGitHub - creationix/nvm: Node Version Manager - Simple bash script to manage multiple active node.js versionsのcurlの方法で行いました。
curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.31.0/install.sh | bash
上記のexport CURL_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crtの設定をしていないとerror setting certificate verify locationsとでてきてインストールできません。
pq@pq-VirtualBox:~$ curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.31.0/install.sh | bash
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  7766  100  7766    0     0   7447      0  0:00:01  0:00:01 --:--:--  8395
=> Downloading nvm from git to '/home/pq/.nvm'
=> Cloning into '/home/pq/.nvm'...
remote: Counting objects: 4588, done.
remote: Compressing objects: 100% (13/13), done.
remote: Total 4588 (delta 4), reused 0 (delta 0), pack-reused 4575
Receiving objects: 100% (4588/4588), 1.19 MiB | 490.00 KiB/s, done.
Resolving deltas: 100% (2709/2709), done.
Checking connectivity... done.
* (detached from v0.31.0)
  master

=> Source string already in /home/pq/.bashrc
=> Close and reopen your terminal to start using nvm
nvm v0.31.0がインストールできました。

今度は~/.nvmフォルダに.gitフォルダが含まれていました。

nvm install stable

node.jsもnvmと一緒にアンイストールされたのでstableバージョンを再インストールし直しました。

(H28.5.19以下追記。そもそもの原因がわかりました。Anacondaをインストールした影響が原因でした。)

AnacondaをインストールしてcurlがAnacondaのものになったのがそもそもの原因だった






  • curl や openssl などが Anaconda に乗っ取られる

    • Anaconda が標準で自身の prefix に curlopensslsqlite3redis などもろもろインストールしてしまうため





  • そもそも curl が壊れてて Debian だと動かない

    • CA 証明書が /etc/pki/tls/certs/ca-bundle.crt にないと動かない
    pyenv の Anaconda/Miniconda 対応について - Qiita
    これを読んでlinuxBean14.04(72)Anacondaで科学技術系Pythonパッケージを一括インストールするが思い当たりました。

    それでAnacondaをインストールする前のlinuxBean14.04でnvm install stableを実行すると問題なくインストールできてしまいました。

    その状態ではcurlはインストールしていないのでnvmはwgetでダウンロードしているはずです。

    Anacondaをインストールすると同時にAnacondaのcurlがインストールされます。
    pq@pq-VirtualBox:~$ which curl
    /home/pq/anaconda3/bin/curl
    pq@pq-VirtualBox:~$ curl -V
    curl 7.43.0 (i686-pc-linux-gnu) libcurl/7.43.0 OpenSSL/1.0.1k zlib/1.2.8
    Protocols: dict file ftp ftps gopher http https imap imaps pop3 pop3s rtsp smb smbs smtp smtps telnet tftp 
    Features: IPv6 Largefile GSS-API Kerberos SPNEGO NTLM NTLM_WB SSL libz TLS-SRP UnixSockets 
    pq@pq-VirtualBox:~$ nvm ls-remote
                N/A
    
    するとnvmからnodejs.orgにアクセスできなくなってしまいました。

    export CURL_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt~/.bashrcの最後の行に追加して保存してTerminalを起動し直すとnvmからnodejs.orgにアクセスできるようになりました。

    Anacondaのcurlがインストールされた後にSynapticパッケージマネージャーからcurlをインストールしてもcurlコマンドではAnacondaのcurlが起動するので状況は何も変わりません。

    これは環境変数のPATHの先頭に~/anaconda3/binが設定されているからです。

    Anacondaをインストールする前の状態でcurlをSynapticパッケージマネージャからインストールしてみました。
    pq@pq-VirtualBox:~$ which curl
    /usr/bin/curl
    
    curlをインストールしてもnvm ls-remoteでnodejs.orgにアクセスできました。

    ということでそもそもの原因はcurlがAnacondaのものに入れ替わっていたことでした。

    linuxBean14.04(115)pythonコマンドをpipコマンドとともに切り替えるで通常はAnacondaのパスは設定しないようにしました。

    参考にしたサイト


    `nvm ls-remote` returns N/A prior to v0.17.3 · Issue #554 · creationix/nvm · GitHub
    2014年10月21日にnodejs.orgがHTTPからHTTPSに変更したのが原因でnvmの動作に支障がでたようです。

    Issues · creationix/nvm · GitHub
    HTTPSに関するnvmの議論。

    HTTPS certificate for latest.nvm.sh · Issue #614 · creationix/nvm · GitHub
    nvmが使っているのフリーのURL redirecting serviceの関係でHTTPSへの対応が難しいようです。

    SSL サーバー証明書の基礎知識|サイバートラスト
    HTTPSの仕組みの解説。

    認証局 - Wikipedia
    認証局(CA)の解説。

    cURL - How To Use (マニュアルページ日本語訳)
    今回環境変数CURL_CA_BUNDLEにUbuntuパッケージのCA証明書を指定しました。

    install script `git` detection should also check for `.git` · Issue #1028 · creationix/nvm
    git未インストール状態でnvmをインストール後にgitをインストールするとnvmがアップグレードできません。

    How to uninstall nvm? · Issue #298 · creationix/nvm
    nvmのアンイストール方法。

    GitHub - creationix/nvm: Node Version Manager - Simple bash script to manage multiple active node.js versions
    nvmのGitHubリポジトリ。

    pyenv の Anaconda/Miniconda 対応について - Qiita
    Anacondaのインストール時にcurlなどの一部コマンドがAnaconda付属のものにパスが変わります。

    次の関連記事:linuxBean14.04(108)Visual Studio Codeのインストール

    PR

    0 件のコメント:

    コメントを投稿