程式碼抓取卡住、容器映像檔拉不下來、套件安裝逾時,通常不只是「網路速度不夠快」這麼單純。GitHub、Docker Registry、npm、PyPI 以及各種 API 服務,可能使用不同的網域、DNS、TLS 連線方式與長連線策略;瀏覽器能開啟某個網站,也不代表 Git、Docker 或終端機中的套件管理器一定能正常工作。
這篇指南依照開發者每天可能經歷的工作流程,整理 GitHub 程式碼抓取、Docker 映像檔下載、npm 與 pip 套件安裝,以及 API 連線的設定方式。核心原則是先判斷問題位於 DNS、TCP、TLS、代理分流還是遠端服務本身,再選擇全域代理、規則代理或只為特定工具設定代理。這樣既能改善連線穩定性,也能避免把本地服務、公司內網與容器內部請求不必要地送到遠端線路。
開發者網路加速的基本判斷
開發工具的網路問題大致可以分成四類。第一類是名稱解析失敗,例如 DNS 無法找到 GitHub、Registry 或套件來源的位址;第二類是連線建立緩慢,TCP 或 UDP 路徑受到當前網路環境影響;第三類是 TLS 握手或長連線中斷,常見於大型檔案、串流下載與需要持續連線的 API;第四類是工具本身沒有使用你以為已經開啟的代理。
因此,不建議一開始就反覆更換節點。應先用最小化測試確認問題層級。瀏覽器測試只能說明瀏覽器的請求結果,不能代替 Git、Docker daemon 或容器內部的測試。相反地,命令列工具回報的錯誤訊息通常更有價值,例如「Could not resolve host」偏向 DNS 問題,「Connection timed out」可能涉及路由或防火牆,「SSL certificate problem」則應優先檢查系統時間、憑證鏈與企業中間人代理。
5
本文工作流程
4
主要故障層級
2
常見代理方向
1
先做的原則
代理方向通常有兩種。第一種是由 VPN 用戶端或相容客戶端建立系統層級的通道,再用規則模式決定哪些網域經過代理;第二種是讓特定命令列工具讀取 HTTP、HTTPS 或 SOCKS5 代理。前者設定較集中,適合多種工具都需要使用同一套分流規則;後者控制範圍較小,適合只處理 GitHub、Docker Registry 或套件安裝。
GitHub 與 Git:先處理抓取和推送
GitHub 相關問題通常分成網頁存取、Git over HTTPS、Git over SSH,以及大型儲存庫或子模組下載。網頁能開不代表 Git clone 一定成功,因為 Git 可能沒有繼承系統代理,SSH 也不會自動使用瀏覽器的 HTTP 代理。
Git over HTTPS 的代理設定
如果儲存庫使用 HTTPS 位址,可以先讓 Git 讀取專用的 HTTP 代理。以下設定只會影響 Git,不會改變其他應用程式:
git config --global http.proxy http://127.0.0.1:連接埠
git config --global https.proxy http://127.0.0.1:連接埠
git config --global --get http.proxy
git config --global --get https.proxy
實際連接埠應以你使用的 VPN 用戶端或相容客戶端顯示內容為準,不要直接照抄他人設定。若工具提供 SOCKS5 入口,也可以使用相應的代理格式,但要確認 Git 版本與本機代理程式是否支援該方式。代理設定完成後,先用小型公開儲存庫測試,再處理大型專案,這樣更容易判斷是權限問題還是網路問題。
若不希望長期保留代理,可以只為單次命令設定:
git -c http.proxy=http://127.0.0.1:連接埠 \
-c https.proxy=http://127.0.0.1:連接埠 \
clone https://github.com/組織/專案.git
使用完畢後,若要移除全域設定,可執行:
git config --global --unset http.proxy
git config --global --unset https.proxy
SSH、子模組與大型專案
SSH 連線與 HTTPS 的代理設定不同。若專案使用 SSH 位址,請先確認本地 SSH 金鑰、代理轉送與遠端主機驗證,不要因為連線困難就關閉主機金鑰檢查。若所在網路不允許直接建立 SSH 連線,可以考慮改用 HTTPS,或依照受信任的網路管理規範設定 SSH 代理跳轉。
子模組是另一個常見陷阱。主專案 clone 成功後,子模組可能使用另一個 HTTPS 或 SSH 位址,導致後續初始化失敗。可以先查看設定檔中的子模組來源,再逐一確認它們是否能用同一種代理方式存取。大型儲存庫若包含 Git LFS,也要另外確認 LFS 是否繼承 Git 的代理設定;只配置 Git 本身,不一定能涵蓋所有大型檔案請求。
- ✅ 先確認遠端位址是 HTTPS 還是 SSH,再選擇代理設定方式。
- ✅ 檢查 Git、Git LFS 與子模組是否使用相同的網路路徑。
- ✅ 只為 Git 設定代理時,優先採用命令列單次設定降低影響範圍。
- ❌ 不要用關閉 TLS 驗證或忽略主機金鑰的方式掩蓋連線問題。
Docker:區分 Docker CLI 與 daemon
Docker 最容易讓人誤判的地方,是執行命令的 Docker CLI 與真正下載映像檔的 Docker daemon 可能不在同一個環境。你在終端機中設定了代理,並不代表 Docker daemon 也能使用它。尤其在 Linux 上,daemon 常以 systemd 服務執行;在 Windows 或 macOS 上,Docker Desktop 也有自己的虛擬化環境與網路設定。
先用簡單命令確認目前環境:
docker version
docker info
docker pull 映像檔:標籤
如果錯誤出現在拉取映像檔階段,應優先檢查 daemon 的 DNS、代理與 Registry 存取,而不是隻修改 Shell 的 HTTP_PROXY。對 systemd 管理的 Docker,可以依照發行版文件建立服務覆寫設定,並在變更後重新載入服務。設定內容應由管理員依照實際代理位址填寫,且要明確列出不應經過代理的本機網段。
[Service]
Environment="HTTP_PROXY=http://127.0.0.1:連接埠"
Environment="HTTPS_PROXY=http://127.0.0.1:連接埠"
Environment="NO_PROXY=localhost,127.0.0.1,.local"
# 儲存後依系統文件重新載入並重啟 Docker 服務
Docker Desktop 使用者則應在應用程式的網路或代理設定中檢查,而不是隻修改終端機環境變數。若公司環境使用自訂憑證或 TLS 檢查,必須按照管理政策將受信任的 CA 憑證配置到正確位置;不要用關閉安全驗證的方式解決憑證錯誤。
映像檔拉取與建置階段的差異
docker pull 主要由 daemon 存取 Registry;docker build 則可能同時涉及基礎映像檔、Dockerfile 中的套件下載、Git URL 與多階段建置。即使基礎映像檔成功拉取,建置階段的 RUN npm install 或 RUN pip install 仍可能因容器內的 DNS 與代理設定不同而失敗。
若建置需要使用外部套件來源,應明確設計代理傳入方式,並避免把帳號、密碼或訂閱連結直接寫入 Dockerfile。可以使用建置參數或建置環境提供短期設定,但仍要確認敏感資訊不會出現在映像檔 layer、建置記錄或快取中。完成測試後,清理不再需要的代理環境變數,避免應用程式執行階段意外沿用建置代理。
| 操作 | 主要請求來源 | 優先檢查 | 常見誤區 |
|---|---|---|---|
| docker pull | Docker daemon | daemon 代理、DNS、Registry 憑證 | 只設定終端機代理 |
| docker build | daemon 與建置容器 | 基礎映像檔、Dockerfile、容器內 DNS | 以為 pull 成功就代表 RUN 一定成功 |
| docker push | Docker daemon | Registry 權限、登入狀態、上傳路徑 | 忽略上傳方向的代理限制 |
npm 與 pip:套件來源、快取與逾時
套件管理器的問題不一定需要全域加速。npm 會讀取 registry 設定、環境變數與使用者設定檔;pip 則可能受到 index URL、憑證、代理與快取影響。先確認目前使用的套件來源,再決定是調整來源、使用代理,還是修復本地憑證。
npm 的 registry 與代理檢查
可以先查看 npm 的有效設定:
npm config get registry
npm config get proxy
npm config get https-proxy
npm cache verify
如果套件來源本身可用,但當前網路無法穩定連線,可以為 npm 指定與其他工具一致的代理。若只需要暫時測試,建議使用命令列參數或環境變數,而不是立即修改所有專案的設定。若專案包含 lockfile,切換 registry 後要注意套件解析結果、私有套件權限與完整性校驗,不要為了速度刪除 lockfile。
npm 安裝逾時也可能與某個套件的 postinstall 腳本、Git 依賴或二進位檔下載有關。此時應查看詳細記錄,確認卡住的是 registry 請求、Git 下載,還是套件安裝腳本中的其他 API。只增加 timeout 可能讓等待時間更長,卻不會修復錯誤的代理或 DNS。
pip 的 index、憑證與代理
pip 可以透過命令列、設定檔或環境變數指定套件來源。排查時先查看目前設定,尤其要留意專案虛擬環境與系統 Python 是否讀取不同的設定檔。若使用 HTTPS 套件來源,請保留憑證驗證,並確認系統 CA 憑證已更新。
python -m pip config list
python -m pip install --upgrade pip
python -m pip install 套件名稱 --timeout 時間
使用 python -m pip 通常比直接輸入 pip 更容易確認套件管理器屬於哪個 Python 環境。若下載速度不穩定,先清楚區分公共套件來源、公司私有 Registry 與本地快取的角色。私有套件來源若需要 Token,請放在權限受控的設定中,不要把憑證提交到 Git 儲存庫或寫入 Dockerfile。
- ✅ 先記錄 npm registry 或 pip index,再判斷是否需要更換來源。
- ✅ 使用虛擬環境與 lockfile,讓加速設定不改變依賴版本。
- ✅ 對私有套件與 Token 使用最小權限,並避免出現在終端機共享記錄。
- ❌ 不要把關閉 SSL 驗證當成套件安裝逾時的通用解法。
API 連線:從命令列測到應用程式
API 常見問題包括 DNS 解析不一致、SNI 或 TLS 握手失敗、代理未被 SDK 繼承、長連線中斷,以及本地時間不正確導致簽名失效。排查時不要只在瀏覽器打開 API 網址,應使用與應用程式接近的請求方式測試 HTTP 方法、標頭、重導向與回應內容。
可先用 curl 觀察名稱解析、TLS 與 HTTP 回應:
curl -I https://api.example.com
curl -v https://api.example.com/health
curl --proxy http://127.0.0.1:連接埠 https://api.example.com/health
如果直接連線失敗、透過代理成功,問題可能位於本地路徑或 DNS;如果兩者都失敗,則要檢查 API 位址、憑證、權限與服務狀態;如果命令列成功但程式失敗,應回到 SDK 的代理參數、環境變數與連線池設定。Node.js、Python、Go 等語言的 HTTP 函式庫對代理的支援方式不同,不能假定所有 SDK 都會自動讀取系統代理。
對 API 金鑰、Bearer Token、Cookie 與訂閱連結要採取同樣的安全標準。不要將完整請求內容貼到公開工單或聊天羣組,也不要把含有敏感標頭的 verbose log 直接提交到儲存庫。測試時可先使用健康檢查端點或不含敏感參數的請求,再逐步加入認證與業務參數。
一套可重複的實作流程
下面是一個適合 Windows、macOS、Linux,以及使用官方 VPN 用戶端或 Clash Verge、sing-box、Shadowrocket 等相容客戶端的排查順序。不同客戶端對 HTTP、SOCKS5、TUN 與規則模式的名稱可能不同,請以實際介面為準。這裡的重點不是固定某個節點,而是讓測試結果可以重現。
- 確認代理入口。 記下本地 HTTP 或 SOCKS5 代理的位址與連接埠,確認客戶端目前確實處於已連線狀態。
- 測試名稱解析。 分別測試 GitHub、Docker Registry、npm 或 PyPI 使用的網域,記錄錯誤是解析失敗還是連線逾時。
- 測試最小 HTTP 請求。 使用 curl 先確認 API 或網站能否建立 HTTPS 連線,再測試完整下載。
- 單獨配置 Git。 先處理 Git over HTTPS,確認 clone 能完成,再檢查子模組與 Git LFS。
- 配置 Docker daemon。 不要只改 Shell 環境變數,確認 daemon 或 Docker Desktop 的代理已生效,然後測試 pull。
- 檢查套件管理器。 確認 npm registry、pip index、私有來源與憑證設定,避免把所有逾時都歸因於速度。
- 縮小分流範圍。 如果只有特定開發工具需要代理,優先採用工具層設定;本地服務、內網位址與資料庫應加入適當的直連規則。
- 清除臨時設定。 測試完成後移除不再需要的全域代理、Shell 變數與建置參數,避免後續在不同網路環境中產生難以追蹤的錯誤。
若使用訂閱連結匯入節點,建議先在用戶端中更新訂閱,再挑選適合的線路與協定。Shadowsocks、VMess、Trojan、Hysteria2 與 WireGuard 的握手和傳輸特性不同,某一協定在行動網路表現較好,不代表在公司或校園網路也一定相同。若需要更細緻的應用程式分流,可在支援規則的相容客戶端中,將 GitHub、Registry、套件來源與 API 分別納入規則,但不要把所有網域一概送往代理。
安全性、分流與長期維護
開發者網路加速的目標不是讓所有流量都經過同一條通道,而是在需要的地方改善連線,同時保持本地服務與敏感資料的控制範圍。全域模式雖然容易理解,但可能讓雲端同步、公司內網、資料庫連線與本機開發服務一起受到代理影響;規則模式較靈活,卻需要定期檢查規則是否過期或誤判。
建議將以下內容視為日常自查項目:代理與訂閱連結只保存在受控位置;不同工具不共用不必要的帳號 Token;Docker 建置記錄不包含祕密;Git 不關閉 SSL 驗證;私有 npm 或 pip 來源使用最小權限;API log 遮蔽授權標頭與個人資料;更換網路或 VPN 線路後,重新確認 DNS、出口位址與本地服務是否仍正常。
如果連線突然變慢,先回到最後一次成功的設定,逐項比較代理入口、分流規則、協定、DNS 與工具設定。不要同時開啟兩個會建立 TUN 或系統代理的客戶端,也不要在沒有記錄變更內容的情況下反覆修改 Docker daemon、npm registry 與 pip index。保留一份可還原的設定,通常比追求單次峯值速度更有價值。