真正可行的本地缓存代理是用能上网的机器作中转站,通过mitmproxy或nginx缓存插件包,解决局域网无法直连marketplace.visualstudio.com的问题。

局域网内没有公网代理、又不能直连 marketplace.visualstudio.com 时,靠改 settings.json 或换镜像源往往失效——因为那些方案仍依赖外部网络。真正可行的本地缓存代理,是让一台能上网的机器充当「中转站」,把插件包提前拉下来并长期缓存,其他局域网机器只跟它通信。
为什么局域网直接配 http.proxy 常常不生效
VSCode 的 http.proxy 设置默认只走 HTTP/HTTPS 请求,但插件下载实际会发起大量对 vsextensions.blob.core.windows.net 的直连请求,这类 CDN 地址通常被系统 bypass 规则排除(尤其 Windows/macOS 默认绕过 127.0.0.1 和 localhost)。即使你填了 "http.proxy": "http://192.168.1.100:8080",VSCode 也可能根本没把请求发过去。
- 验证方法:在代理机器上运行
curl -x http://192.168.1.100:8080 https://httpbin.org/ip,再在客户端 VSCode 里安装插件,观察代理日志是否收到请求 - 常见失败点:代理服务未开启「允许局域网连接」(如 Clash 需设
allow-lan: true)、防火墙拦截端口、VSCode 启动方式绕过环境变量(GUI 启动不读~/.zshrc) - Remote-SSH 场景下,
http.proxy必须写在远程机器的~/.vscode-server/data/Machine/settings.json,而不是本地设置
用 mitmproxy 搭本地缓存代理(推荐)
mitmproxy 可以拦截、修改、缓存 HTTPS 流量,比单纯转发更可靠。它能把 marketplace 请求落地为本地文件,后续所有局域网机器都复用这份缓存。
- 在能联网的机器(比如你的开发主力机)上安装:
pip install mitmproxy - 启动带缓存的代理:
mitmproxy --mode regular --listen-host 0.0.0.0 --listen-port 8080 --set confdir=./mitmconf --set cache=true - 客户端 VSCode 的
settings.json中写入:"http.proxy": "http://192.168.1.100:8080"(替换为实际 IP),并确保"http.proxyStrictSSL": false - 首次安装插件后,缓存文件会生成在
./mitmconf/cache/下,格式为hash-xxxxxx;之后同一插件安装将直接返回缓存内容,无需重连外网
替代方案:用 nginx 反向代理 + 磁盘缓存
如果你已有 nginx 服务,且希望零 Python 依赖,可用它做纯静态缓存层。原理是把 marketplace 域名映射到本地,由 nginx 自动缓存响应体。
- 修改 hosts(所有客户端):
192.168.1.100 marketplace.visualstudio.com和192.168.1.100 vsextensions.blob.core.windows.net - nginx 配置片段(需支持 HTTPS 透传):
proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=vscode:10m max_size=5g; server { listen 443 ssl; server_name marketplace.visualstudio.com; location / { proxy_pass https://marketplace.visualstudio.com; proxy_cache vscode; proxy_cache_valid 200 1d; proxy_ssl_server_name on; } } - 注意:必须用真实域名 + SSL 证书(可自签,但客户端要信任),否则 VSCode 会拒绝连接;
proxy_ssl_server_name on是关键,否则后端无法识别 SNI
容易忽略的权限与路径细节
缓存代理不是配完就一劳永逸。最常卡住的地方其实是路径权限和证书信任:
-
mitmproxy生成的 CA 证书(~/.mitmproxy/mitmproxy-ca-cert.pem)必须手动导入到每台客户端的系统根证书库,否则 VSCode 报DEPTH_ZERO_SELF_SIGNED_CERT - nginx 缓存目录(如
/data/nginx/cache)需确保 nginx worker 进程有读写权限,否则缓存不生效,表现就是「第一次慢、第二次还是慢」 - VSCode 更新插件时会请求
/api/gallery/cache接口,如果代理没转发或缓存规则没覆盖该路径,依然会直连外网


















