Featured image of post 在zz.ac公益主机使用node js

在zz.ac公益主机使用node js

今天尝试在zz.ac公益主机使用node js环境搭建服务,但是运行npm install 提示:

1
2
3
npm error code ERR_INVALID_URL
npm error Invalid URL
npm error A complete log of this run can be found in: /home/bosh/.npm/_logs/2025-12-31T08_50_05_558Z-debug-0.log

查看了日志,经过询问gemini ,gemini回答是代理问题,运行:

1
2
3
4
bosh@h1:~/node-tanzhen$ npm config get proxy
null
bosh@h1:~/node-tanzhen$ npm config get https-proxy
null

显示是没有设置代理。

涛叔的网站说明:

这里的 eth0@if23 就是前面说的 veth 链路的用户端设备。注意它已经设置了 fe80::2/64 本地链接地址。登录之后无法直接访问外部网络环境。但你用 curl 访问 github.com 就会发现是通的。这是因为系统会自动设置 HTTP 代理环境变量:

$ export|grep http declare -x http_proxy=“http://[fe80::1%eth0]:8888” declare -x https_proxy=“http://[fe80::1%eth0]:8888”

再次咨询AI,回答:

你的容器只有 Link-local 地址 (fe80::/64),这意味着它不能直接通过路由访问公网,必须通过宿主机在 fe80::1(网关)上监听的 HTTP 代理来转发请求。

核心矛盾:npm 与环境变量的冲突

问题的根源是:curlwget 能够识别并解析包含 %eth0(Scope ID)的 IPv6 URL,但 Node.js (npm) 使用的 URL 解析器非常严格,它把 % 视为非法字符或错误的转义序列,导致了 ERR_INVALID_URL

为了让 npm install 跑通,必须解决npm的代理问题:经过多次尝试使用以下方法解决。

因为有过多次尝试,先删除错误的npm代理

1
2
bosh@h1:~/node-tanzhen$ npm config delete proxy
bosh@h1:~/node-tanzhen$ npm config delete https-proxy

再设置npm代理,成功运行npm install

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
bosh@h1:~/node-tanzhen$ npm config set proxy "http://[fe80::1]:8888"
bosh@h1:~/node-tanzhen$ npm config set https-proxy "http://[fe80::1]:8888"
bosh@h1:~/node-tanzhen$ 
bosh@h1:~/node-tanzhen$ npm install

added 77 packages, and audited 78 packages in 3s

17 packages are looking for funding
  run `npm fund` for details

found 0 vulnerabilities

关于[fe80::1]:8888

[fe80::1]:8888 表示:通过 IPv6 协议 访问当前局域网内某个物理标识为 1 的设备(通常是网关或特定主机)上运行在 8888 端口 的服务。

地址部分:fe80::1

这是一个 IPv6 链路本地地址 (Link-Local Address)

  • fe80::/10:以 fe80 开头的地址类似于 IPv4 中的私有地址(如 169.254.x.x)。它专门用于本地链路,也就是说,这个地址只在同一个局域网(或物理链路)内有效,不会经过路由器转发到互联网。

  • ::1:这是地址的具体标识符。在 IPv6 中,:: 代表中间全是 0。所以完整的地址形式是 fe80:0000:0000:0000:0000:0000:0000:0001

  • 常见用途:通常用于邻居发现协议(NDP)、自动配置,或者在没有 DHCP 服务器的情况下让设备之间进行基础通信。

端口部分:8888

紧跟在方括号后面的数字是 端口号

  • 方括号 [] 的作用:在 IPv6 中,地址本身包含冒号(:)。为了防止冒号与端口号的冒号混淆,标准规定必须将 IPv6 地址括在方括号内,后面再接端口。
  • 8888 端口:这是一个非常常用的非官方端口,经常被开发者用于:
    • Web 测试服务(如 Python 的 http.server 或 Node.js 开发环境)。
    • 代理软件(如 Fiddler 或 Charles)。
    • 特定应用(如 Jupyter Notebook 默认也会使用类似的端口)。

但是运行node app.js还是报错,经过AI寻求了解决方案:使用 https-proxy-agent

  1. 安装代理适配器:

    Bash

    1
    
    npm install https-proxy-agent
    
  2. 修改 index.js 中的下载逻辑: 找到 https.getaxios.get 的地方,参考如下修改:

    JavaScript

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    
    const { HttpsProxyAgent } = require('https-proxy-agent');
    const https = require('https');
    
    // 显式指定不带作用域的 IPv6 地址
    const proxy = 'http://[fe80::1]:8888';
    const agent = new HttpsProxyAgent(proxy);
    
    // 在下载请求中使用 agent
    https.get('url', { agent }, (res) => {
        // ... 处理下载流
    }).on('error', (e) => {
        console.error(`下载失败: ${e.message}`);
    });
    

经过修改app.js文件内容,运行node app.js 成功!

安装pm2,设置后台运行

1. 首先,全局安装 PM2。如果环境受限,可以尝试在本地安装。

Bash

1
2
3
4
5
# 全局安装
npm install -g pm2

# 验证安装是否成功
pm2 -v

提示:

1
2
pm2
-bash: pm2: command not found

2. 使用使用 npx 运行 PM2 启动APP

由于环境依赖特殊的 IPv6 代理环境变量,启动时必须把变量传给 PM2。

Bash

1
HTTP_PROXY="http://[fe80::1]:8888" HTTPS_PROXY="http://[fe80::1]:8888" npx pm2 start app.js --name "app"

运行结果

1
2
3
4
[PM2] Spawning PM2 daemon with pm2_home=/home/bosh/.pm2
[PM2] PM2 Successfully daemonized
[PM2] Starting /home/bosh/node-tanzhen/index.js in fork_mode (1 instance)
[PM2] Done.

PM2 会自动记录你启动时的环境变量,并在重启该进程时自动应用它们。


3. 常用管理命令

PM2 启动后,你可以使用以下命令进行监控和维护:

命令说明
npx pm2 list查看所有正在运行的进程状态
npx pm2 logs app实时查看运行日志(如下载进度、报错信息)
npx pm2 stop app停止进程
npx pm2 restart app重启进程(会重新触发下载逻辑)
npx pm2 delete app从 PM2 列表中彻底删除进程
npx pm2 monit打开仪表盘,查看内存和 CPU 占用情况

安装成功:

image

热爱生活 学无止境
使用 Hugo 构建
主题 StackJimmy 设计