Node.js
npm

npmのプロキシ設定の優先順位

はじめに

altJSのライブラリ(elm)を導入するのにnpmを使っており、npmの設定の優先順位の勘違いにより、プロキシ設定でハマったので他にも同じように困っている人の助けになればと思っています。

実行環境

  • OS:CentOS 7.3
  • Node:v6.11.3
  • npm: v3.10.10
  • nodebrew: v0.9.7
  • 導入したかったパッケージ: elm

npmの設定の優先順位

  1. コマンドラインの指定
  2. 環境変数
  3. ユーザー別設定ファイル(~/.npmrc)
  4. グローバル設定ファイル(インストールディレクトリのnpmrc)
  5. ビルトインの設定ファイル(ビルド時に導入されるファイル)
  6. デフォルト設定(npm内部に含まれる設定)

2.の環境変数はもっと優先順位が低いと勘違いしていて、3.のユーザー別設定ファイルを変更していて全然反映されずにハマっていました。

エラー内容

$ npm install -g elm
-----<中略>-----
> elm@0.18.0 install /home/myname/.nodebrew/node/v4.8.4/lib/node_modules/elm
> node install.js

Error communicating with URL https://dl.bintray.com/elmlang/elm-platform/0.18.0/linux-x64.tar.gz Error: tunneling socket could not be established, cause=write EPROTO 140258489431872:error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol:../deps/openssl/openssl/ssl/s23_clnt.c:794:

npm ERR! Linux 3.10.0-514.16.1.el7.x86_64
npm ERR! argv "/home/myname/.nodebrew/node/v4.8.4/bin/node" "/home/myname/.nodebrew/current/bin/npm" "install" "-g" "elm"
npm ERR! node v4.8.4
npm ERR! npm  v2.15.11
npm ERR! code ELIFECYCLE

npm ERR! elm@0.18.0 install: `node install.js`
npm ERR! Exit status 1
npm ERR! 
npm ERR! Failed at the elm@0.18.0 install script 'node install.js'.
npm ERR! This is most likely a problem with the elm package,
npm ERR! not with npm itself.
npm ERR! Tell the author that this fails on your system:
npm ERR!     node install.js
npm ERR! You can get information on how to open an issue for this project with:
npm ERR!     npm bugs elm
npm ERR! Or if that isn't available, you can get their info via:
npm ERR! 
npm ERR!     npm owner ls elm
npm ERR! There is likely additional logging output above.

npm ERR! Please include the following file with any support request:
npm ERR!     /home/myname/elm/npm-debug.log

どうやらelmのダウンロード先とSSLのコネクションが張れずにダウンロードできないことが原因で失敗しているようです。

Webで検索して出てきた対策とその結果

npm config set(もしくは.npmrc)で以下の設定をする

※proxyserver、portは実際の環境に合わせて変更する。
.npmrcに設定を書き込むも状況は変わらず。
他にも、strict-sslの設定などもありましたが、状況は変わらず。

効果のあった対策

環境変数HTTPS_PROXYを書き換える。
具体的には次のように設定する。(https://をhttp://にする)

$ export HTTPS_PROXY=http://proxyserver:port

Web検索結果の3つの設定値はデフォルトで問題なかったので、.npmrcファイルは不要で、環境変数の書き換えのみでうまくいきました。

実行結果を見るとDownloadがうまくいっているのが分かります。

$ npm install -g elm
-----<中略>-----
> elm@0.18.0 install /home/myname/.nodebrew/node/v6.11.3/lib/node_modules/elm
> node install.js

Downloading Elm binaries from https://dl.bintray.com/elmlang/elm-platform/0.18.0/linux-x64.tar.gz
/home/myname/.nodebrew/node/v6.11.3/lib
└─┬ elm@0.18.0 
  ├─┬ mkdirp@0.5.1 
  │ └── minimist@0.0.8 
-----<中略>-----

原因

自分の環境では、環境変数にproxy関係で多く設定されており、npmはnpmrcではなく環境変数を見に行っていたようです。環境変数HTTPS_PROXYの設定値はhttps://となっており、そこでSSLコネクションがうまくいっていなかったのが原因だと思います。

npmの設定はnpmrcが優先されると思いこんでいましたが、環境変数の方が優先される仕様のようです。

自分の環境で設定されていた環境変数を参考のために記述します。

$ env | grep proxy
http_proxy=http://proxyserver:port
ftp_proxy=http://proxyserver:port
FTP_PROXY=http://proxyserver:port
https_proxy=http://proxyserver:port
HTTPS_PROXY=https://proxyserver:port
no_proxy=localhost,127.0.0.0/8,172.27.0.0/16,129.249.0.0/16
HTTP_PROXY=http://proxyserver:port

思っていたよりも多かったので、npmで設定が反映されずに困っている人は、一度環境変数を確認してみるのも良いかもしれません。

参考リンク