GitHubがブロックされている、10~30秒の遅延がある、またはnpm installが途中で止まるという状況は、ロシア、イラン、中国、その他の国の開発者にとって馴染みのあるものです。解決策はあり、それは思ったよりも簡単です:正しく設定されたプロキシは、VPNなしでリポジトリ、パッケージ、GitHubのAPIへの安定したアクセスを提供します。
なぜGitHubとnpmがブロックまたは遅延するのか
プロキシを設定する前に、何に直面しているのかを理解することが重要です。GitHubとnpmへのアクセスの問題は3つのタイプがあり、それぞれに異なるアプローチが必要です。
国家レベルでの完全なブロック
中国、イラン、北朝鮮、そして2022年以降は時折ロシアも、DNSレベルまたはIPによってGitHubをブロックしています。これは、github.comへのリクエストが全く通らないか、接続エラーを返すことを意味します。この場合、npmレジストリ(registry.npmjs.org)は正常に動作するか、ブロックされている可能性があります。
企業のファイアウォールとネットワーク制限
国家によるブロックがなくても、企業ネットワークはしばしば外部リポジトリへのアクセスを制限します。これは銀行、政府機関、大企業での標準的な慣行です:IT部門はポート443へのアウトバウンド接続を閉じるか、特定のドメインをブロックします。このようなネットワーク内の開発者は、回避策なしではgit cloneやnpm installを行うことができません。
地理的要因による遅い速度
技術的にはGitHubにアクセス可能ですが、500MBのリポジトリをクローンするのに40分かかり、npmを介して依存関係をインストールするのに永遠にかかります。これはルーティングの問題です:パッケージは混雑したノードや長いルートを通過します。アメリカやヨーロッパにあるプロキシサーバーは、ルートを短縮し、3~10倍の速度向上を実現します。
理解しておくべきこと:
プロキシはこれら3つの問題をすべて解決します:ブロックを回避し、許可されたポートを通じてトラフィックをトンネルし、地理的に近い出口ノードによって速度を向上させます。このプロキシは、特定のアプリケーション(Git、npm、ブラウザ)レベルで機能し、マシン上の他のトラフィックには影響を与えません。
プロキシ vs VPN:コード作業にどちらを選ぶべきか
多くの開発者は習慣的にVPNを選びます。これは理解できます—VPNは設定が簡単で、システム全体に対してすぐに機能します。しかし、GitHubやnpmを使用する場合、プロキシの方が便利なことが多いです。違いを見てみましょう。
| 基準 | プロキシ | VPN |
|---|---|---|
| トラフィックの範囲 | 特定のアプリケーションのみ(Git、npm) | システム全体のトラフィック |
| CI/CDでの設定 | 環境変数を通じて、簡単 | クライアントのインストールが必要、難しい |
| Dockerでの動作 | ENVを通じて渡され、問題なし | 特権モードが必要 |
| 速度 | 高速(全トラフィックの暗号化なし) | 暗号化のため遅い |
| 企業ネットワークとの衝突 | 最小限 | 頻繁(IT部門によってブロックされる) |
| サーバーでの使用 | env変数を通じてネイティブに | デーモンのインストールが必要 |
結論は簡単です:チームにGitHubとnpmへのアクセスを提供することが目的であれば、プロキシは一度設定すれば、各マシンのシステム設定に干渉することなく動作します。特にCI/CDパイプラインでは、VPNを物理的に立ち上げるのが難しいため、重要です。
GitHubとnpmに適したプロキシの種類
すべてのプロキシがGitとnpmで同じように機能するわけではありません。選択は、ブロックを回避する、ダウンロードを高速化する、または企業ネットワークから作業するというあなたの目的によって異なります。
HTTP/HTTPSプロキシ
最もシンプルなオプションです。Gitとnpmは、標準の環境変数を通じてHTTPプロキシをネイティブにサポートしています。リポジトリのクローン、パッケージのインストール、GitHub APIとの作業など、ほとんどのタスクに適しています。プロキシプロバイダーがHTTPアドレスを提供している場合は、そこから始めましょう。
SOCKS5プロキシ
より柔軟なプロトコルで、TCPレベルで機能します。SSH接続を含むあらゆるタイプのトラフィックをサポートします。GitをHTTPSではなくSSHを介して使用している場合、SOCKS5の方が好ましいです。Gitは、構成でsocks5://パラメータを通じてSOCKS5をサポートしています。
レジデンシャルプロキシ
レジデンシャルプロキシは、実際の家庭ユーザーのIPアドレスを使用します。GitHubにとって特に重要なのは、厳しいブロックがある国から作業している場合です:これらのIPは非常にまれにしかブラックリストに載らず、通常のユーザートラフィックのように見えます。データセンターのIPがプロバイダーのレベルでブロックされている状況に適しています。
データセンタープロキシ
データセンタープロキシは、ほとんどの開発者にとって最適な選択です。レジデンシャルプロキシよりも速く、安価で、安定した接続を提供します。GitHubが単に遅いだけでブロックされていない場合、アメリカやヨーロッパのデータセンタープロキシは、クローンやパッケージのダウンロード時に最大の速度向上を提供します。
| プロキシの種類 | 速度 | ブロック回避 | 最適な用途 |
|---|---|---|---|
| データセンターHTTP | ⭐⭐⭐⭐⭐ | 中程度 | ダウンロードの高速化、npm install |
| データセンターSOCKS5 | ⭐⭐⭐⭐⭐ | 中程度 | SSH経由のGit、柔軟な設定 |
| レジデンシャル | ⭐⭐⭐ | 高い | 厳しいブロック(イラン、中国) |
| モバイル | ⭐⭐⭐ | 非常に高い | 最大の回避、稀なケース |
Gitのためのプロキシ設定:ステップバイステップの指示
Gitは、組み込みの設定と環境変数を通じてプロキシをサポートしています。両方の方法を示しますので、あなたの作業プロセスに合った方を選んでください。
方法1:git configを通じて(推奨)
これは、マシン上のすべてのGit操作に適用される永続的な設定です。ターミナルを開いて、次のコマンドを実行します:
# HTTP/HTTPSプロキシの場合
git config --global http.proxy http://username:password@proxy-host:port
git config --global https.proxy http://username:password@proxy-host:port
# SOCKS5プロキシの場合
git config --global http.proxy socks5://username:password@proxy-host:port
git config --global https.proxy socks5://username:password@proxy-host:port
# 設定が適用されたか確認
git config --global --list | grep proxy
username:password@proxy-host:portをあなたのプロキシのデータに置き換えてください。プロキシが認証なしの場合は、username:password@を削除してください。
方法2:環境変数を通じて
一時的な使用やスクリプトで便利です。Gitは標準の環境変数HTTP_PROXYとHTTPS_PROXYを自動的に取得します:
# Linux / macOS — ~/.bashrcまたは~/.zshrcに追加
export HTTP_PROXY="http://username:password@proxy-host:port"
export HTTPS_PROXY="http://username:password@proxy-host:port"
export NO_PROXY="localhost,127.0.0.1,::1"
# Windows (PowerShell)
$env:HTTP_PROXY="http://username:password@proxy-host:port"
$env:HTTPS_PROXY="http://username:password@proxy-host:port"
# ターミナルを再起動せずに適用(Linux/macOS)
source ~/.bashrc
GitHub専用のプロキシ設定
GitHubへのリクエストのみをプロキシ経由で送信したい場合は、セクション設定を使用します:
# github.com専用のプロキシ
git config --global http.https://github.com.proxy http://username:password@proxy-host:port
# プロキシ経由でのクローン確認
git clone https://github.com/username/repo.git
SOCKS5経由のSSHでのGit
GitHubをSSH経由で使用している場合(HTTPSではなく)、設定は少し異なります。~/.ssh/configファイルを編集する必要があります:
# ~/.ssh/config
Host github.com
HostName github.com
User git
# Linux/macOSではnc(netcat)を使用
ProxyCommand nc -X 5 -x proxy-host:port %h %p
# またはconnect-proxyを使用(インストールが必要)
# ProxyCommand connect -S proxy-host:port %h %p
# WindowsではGit Bashを使用
# ProxyCommand connect -S proxy-host:port %h %p
これにより、git clone [email protected]:user/repo.gitやgit pushのコマンドが自動的にSOCKS5プロキシを通過するようになります。
プロキシ設定をリセットする方法
# グローバル設定からプロキシを削除
git config --global --unset http.proxy
git config --global --unset https.proxy
npm、yarn、pnpmのためのプロキシ設定
各パッケージマネージャーには独自のプロキシ設定方法があります。npm、yarn、pnpmの3つを具体的なコマンドとともに説明します。
npm
npmは、組み込みの設定を通じてプロキシをサポートしています:
# npmのためのプロキシを設定
npm config set proxy http://username:password@proxy-host:port
npm config set https-proxy http://username:password@proxy-host:port
# 設定を確認
npm config get proxy
npm config get https-proxy
# テスト:プロキシ経由でパッケージをインストール
npm install lodash
# プロキシをリセット
npm config delete proxy
npm config delete https-proxy
設定は~/.npmrcファイルに保存されます。直接編集することもできます:
# ~/.npmrc
proxy=http://username:password@proxy-host:port
https-proxy=http://username:password@proxy-host:port
strict-ssl=false
strict-ssl=falseパラメータ
プロキシがSSLトラフィックを傍受する場合(例えば、企業のプロキシ)、npmは証明書に対して警告を出すことがあります。strict-ssl=falseパラメータは検証を無効にします。企業ネットワーク内でのみ使用し、プロキシを信頼できる場合に限ります—公共のネットワークでは安全ではありません。
Yarn (v1 Classic)
# Yarn Classic (v1)
yarn config set proxy http://username:password@proxy-host:port
yarn config set https-proxy http://username:password@proxy-host:port
# 確認
yarn config get proxy
# リセット
yarn config delete proxy
yarn config delete https-proxy
Yarn Berry (v2+)
# Yarn Berryは環境変数を使用
# プロジェクトのルートにある.yarnrc.ymlに追加:
httpProxy: "http://username:password@proxy-host:port"
httpsProxy: "http://username:password@proxy-host:port"
# または環境変数を通じて
export HTTP_PROXY="http://username:password@proxy-host:port"
export HTTPS_PROXY="http://username:password@proxy-host:port"
pnpm
# pnpmはnpmと同じ.npmrcを使用
# npmがすでに設定されている場合、自動的に適用されます
# またはpnpm configを通じて明示的に
pnpm config set proxy http://username:password@proxy-host:port
pnpm config set https-proxy http://username:password@proxy-host:port
代替案:npmレジストリのミラー
npmレジストリが遅いがGitHubが利用可能な場合、ミラーに切り替えることができます。人気のオプション:Taobao(中国向け)、Verdaccio(セルフホスティング)。ただし、ミラーはパッケージのバージョンが遅れることが多いため、プロキシの方が信頼性があります:
# レジストリをミラーに切り替える(ブロック回避ではなく、速度向上のため)
npm config set registry https://registry.npmmirror.com
# 公式レジストリに戻す
npm config set registry https://registry.npmjs.org
CI/CDにおけるプロキシ:GitHub Actions、Docker、Jenkins
ローカルマシンでプロキシを設定することは半分の仕事です。真の課題は、隔離されたネットワークで動作するCI/CDパイプラインにGitHubとnpmへのアクセスを提供することです。最も一般的な3つのシナリオを見てみましょう。
GitHub Actions
GitHub Actionsでは、プロキシはworkflowファイル内の環境変数を通じて設定されます。リポジトリの設定(Settings → Secrets)にシークレットを追加し、その後workflow内で使用します:
# .github/workflows/build.yml
name: Build
on: [push]
jobs:
build:
runs-on: ubuntu-latest
env:
HTTP_PROXY: ${{ secrets.PROXY_URL }}
HTTPS_PROXY: ${{ secrets.PROXY_URL }}
NO_PROXY: "localhost,127.0.0.1"
steps:
- uses: actions/checkout@v3
- name: Node.jsのセットアップ
uses: actions/setup-node@v3
with:
node-version: '18'
- name: npmプロキシの設定
run: |
npm config set proxy ${{ secrets.PROXY_URL }}
npm config set https-proxy ${{ secrets.PROXY_URL }}
- name: 依存関係のインストール
run: npm ci
Docker
Dockerでは、プロキシは2つのレベルで必要です:イメージのビルド時(docker build)とコンテナ内です。これらは異なる設定です:
# --build-argを通じてビルド時にプロキシを渡す
docker build \
--build-arg HTTP_PROXY=http://user:pass@proxy-host:port \
--build-arg HTTPS_PROXY=http://user:pass@proxy-host:port \
-t myapp .
# Dockerfile内でプロキシのためにARGを使用
# Dockerfile
ARG HTTP_PROXY
ARG HTTPS_PROXY
ENV HTTP_PROXY=$HTTP_PROXY
ENV HTTPS_PROXY=$HTTPS_PROXY
RUN npm ci
# 依存関係のインストール後—プロキシをリセット(イメージに保存しない!)
ENV HTTP_PROXY=""
ENV HTTPS_PROXY=""
Dockerデーモンのためのグローバルプロキシ設定(docker pull用):
# /etc/docker/daemon.json
{
"proxies": {
"http-proxy": "http://user:pass@proxy-host:port",
"https-proxy": "http://user:pass@proxy-host:port",
"no-proxy": "localhost,127.0.0.1"
}
}
# 変更後にDockerを再起動
sudo systemctl restart docker
Jenkins
Jenkinsでは、プロキシはエージェントレベルでJenkinsfile内の環境変数を通じて設定されるか、システム設定でグローバルに設定されます:
// Jenkinsfile
pipeline {
agent any
environment {
HTTP_PROXY = credentials('proxy-url')
HTTPS_PROXY = credentials('proxy-url')
NO_PROXY = 'localhost,127.0.0.1'
}
stages {
stage('インストール') {
steps {
sh 'npm config set proxy $HTTP_PROXY'
sh 'npm config set https-proxy $HTTPS_PROXY'
sh 'npm ci'
}
}
stage('ビルド') {
steps {
sh 'npm run build'
}
}
}
}
よくあるエラーとその修正方法
プロキシが正しく設定されていても、何かがうまくいかないことがあります。最も一般的なエラーとその解決方法をまとめました。
エラー:ECONNREFUSEDまたはConnection refused
プロキシが応答していません。原因:不正なアドレスまたはポート、プロキシサーバーが利用できない、資格情報の有効期限が切れています。
解決策:次のコマンドでプロキシの可用性を確認してください:
curl -v --proxy http://user:pass@proxy-host:port https://github.com
エラー:SSL certificate problem / UNABLE_TO_VERIFY_LEAF_SIGNATURE
プロキシがSSLトラフィックを傍受し、自分の証明書を挿入していますが、Gitまたはnpmはそれを信頼していません。
Gitの解決策:
git config --global http.sslVerify false
# またはプロキシのルート証明書を追加:
git config --global http.sslCAInfo /path/to/proxy-ca.crt
エラー:npm ERR! code ENOTFOUND
npmがレジストリのDNS名を解決できません。プロキシは設定されていますが、DNSリクエストはそれを通過していません。
解決策:HTTPプロキシの代わりにSOCKS5を使用してください—DNSリクエストをトンネルします:
npm config set proxy socks5://user:pass@proxy-host:port
npm config set https-proxy socks5://user:pass@proxy-host:port
エラー:407 Proxy Authentication Required
プロキシが認証を要求していますが、資格情報が渡されていないか、不正確です。
# URL内のログインとパスワードが正しくエンコードされていることを確認してください
# パスワードに特殊文字(@、:、#)が含まれている場合は、それらをエンコードしてください:
# @ → %40, : → %3A, # → %23
# 例:パスワード "p@ss:word" → "p%40ss%3Aword"
npm config set proxy http://user:p%40ss%3Aword@proxy-host:port
Git cloneは動作するが、git pushは動作しない
Clone(読み取り)とpush(書き込み)は異なるプロトコルを使用する場合があります。プロキシがHTTPとHTTPSの両方に設定されていることを確認してください。pushにSSHを使用している場合は、上記のように~/.ssh/configに別の設定が必要です。
チェックリスト:すべてが機能しているか確認する
プロキシを設定した後、このチェックリストを確認して、すべてが正しく機能していることを確認してください。
✅ GitHubとnpmのためのプロキシ設定チェックリスト
- プロキシが利用可能:
curl -v --proxy PROXY_URL https://github.comが200を返す - Git configが設定されている:
git config --global --list | grep proxyがあなたのプロキシを表示する - クローンのテスト:
git clone https://github.com/torvalds/linux.git --depth=1が動作する - npmプロキシが設定されている:
npm config get proxyがあなたのプロキシを表示する - npm installのテスト:
npm install lodashが成功する - SSHを使用している場合:
ssh -T [email protected]が挨拶を返す - CI/CD:環境変数がシークレットに追加され、パイプラインが通過する
- Docker:
docker buildが--build-argでネットワークエラーなしで完了する - 速度:クローンがプロキシなしよりも明らかに速い
- プロキシの資格情報がコード内に平文で保存されていない(シークレットのみに)
1つのコマンドでの迅速な診断
何かがうまくいかず、問題の所在が不明な場合は、この診断スクリプトを実行してください:
#!/bin/bash
# GitHub/npmのためのプロキシ診断
PROXY="http://user:pass@proxy-host:port"
echo "=== 1. GitHubへの直接アクセス ==="
curl -s -o /dev/null -w "%{http_code}" https://github.com && echo " OK" || echo " FAIL"
echo "=== 2. プロキシ経由のアクセス ==="
curl -s -o /dev/null -w "%{http_code}" --proxy "$PROXY" https://github.com && echo " OK" || echo " FAIL"
echo "=== 3. プロキシ経由のnpmレジストリへのアクセス ==="
curl -s -o /dev/null -w "%{http_code}" --proxy "$PROXY" https://registry.npmjs.org && echo " OK" || echo " FAIL"
echo "=== 4. 現在のGitプロキシ設定 ==="
git config --global --list | grep proxy || echo "Gitプロキシが設定されていません"
echo "=== 5. 現在のnpmプロキシ設定 ==="
npm config get proxy
npm config get https-proxy
結論
GitHubとnpmのためのプロキシ設定は、正しい手順を知っていれば難しい作業ではありません。要点をまとめましょう:
- 遅いGitHubの高速化のために — アメリカやヨーロッパのデータセンタープロキシが適しています:速く、安定しており、安価です。
- ブロック回避のために — 実際のユーザーのIPを持つレジデンシャルプロキシが最大の信頼性を提供します。
- HTTPS経由のGitのために — git configで
http.proxyを設定してください。 - SSH経由のGitのために —
~/.ssh/configでProxyCommandを使用してください。 - npm/yarn/pnpmのために — configまたは環境変数を通じてプロキシを設定してください。
- CI/CDのために — プロキシのデータをシークレットを通じて渡し、コード内にハードコーディングしないでください。
一度10~15分を設定に費やすことで、インターネット接続の状態やブロックポリシーに依存せずに、GitHubとnpmへの安定したアクセスを得ることができます。チームは遅いダウンロードを待つ時間を失い、CI/CDパイプラインはネットワークエラーなしで通過し、異なる国の開発者が同じ条件で作業できるようになります。
制限されたアクセスのある国からGitHubとnpmを使用するための安定したプロキシを探している場合は、データセンタープロキシを検討することをお勧めします—これらは高い速度と接続の安定性を提供し、リポジトリのクローンや依存関係のインストール時に重要です。厳しいブロックのある地域には、レジデンシャルプロキシが最適です—これらのIPはほとんど制限にかかりません。