@littlelane/nohost-server
v0.0.4
Published
Multi-user & multi-env web debugging proxy based on whistle
Readme
Nohost
Nohost 是基于 Whistle 实现的多用户多环境配置及抓包调试系统,不仅具备 Whistle 的所有功能,并在 Whistle 基础上扩展了一些功能,且支持多人多环境同时使用,主要用于部署在公共服务器上供整个部门(公司)的同事共同使用,具有以下功能:
- 环境共享:前端无需配后台环境,后台无需配前端环境,其他人无需配任何环境
- 抓包调试:远程实时抓包调试,支持各种 Whistle 规则,以及通过链接分享抓包数据
- 历史记录:可以把环境配置及抓包数据沉淀下来,供后续随时切换查看
- 插件扩展:可以通过插件扩展实现诸如 inspect,vase,autosave 等功能
- 对外接口:提供对外接口,可供发布系统、CI等工具操作,实现自动化增删查改环境配置

目录
一. 准备
安装 Nohost 之前,建议先做好以下工作:
- 准备一台服务器,假设IP为:10.1.2.3(以你自己的服务器为准,建议4核8G以上的配置)
- 准备一个域名(以下假设为:nohost.imweb.io),并把 DNS 指向上述服务器(10.1.2.3)
- 收集涉及域名的证书对,只支持
xxx.key和xxx.crt(非必须,但建议用正式的证书,否则要么 Nohost 里面无法查看 HTTPS 的内容,要么每个访问 Nohost 的客户端都要安装一遍根证书)
申请域名的好处是可以直接用域名访问管理及账号页面,手机也可以通过域名设置代理访问 Nohost,方便记忆及输入
二. 安装
首先,需要安装Node(建议使用最新的LTS版本):Node
Node安装成功后,通过npm安装 nohost:
npm i -g @nohost/server --registry=https://r.npm.taobao.org安装完成后执行启动命令:
n2 start也可以启动时直接设置当前 Nohost 服务到域名
n2 restart -o nohost.imweb.ioNohost 的默认端口为 8080,如果需要自定义端口,可以通过n2 restart -p 80设置。 如果命令行提示没有对应命令,检查下系统环境变量PATH配置,看看 Nohost 安装后生成的命令所在目录是否已添加到PATH。
重启 Nohost:
n2 restart停止 Nohost:
n2 stop重置管理员账号:
n2 restart --reset三. 设置
安装启动成功后,打开管理员页面 http://10.1.2.3:8080/admin.html#system/administrator,输入默认用户名(admin)和密码(123456),打开系统配置后:
其中
10.1.2.3表示Nohost运行的服务器IP,具体根据实际 ServerIP 替换
- 修改管理员的默认账号名和密码(不建议使用默认账号及密码,如果忘记管理员账号名或密码,可以通过
n2 restart --reset重置) - 设置Nohost的域名(将申请的域名填上,如果需要设置多个域名,可以通过逗号
,分隔,也可以通过启动参数-o www.xxx.com,www.yyy.com设置) - 上传涉及的 key 和证书(证书只支持
.crt格式)

Note: 设置的域名 DNS 一定要指向该IP,否则可能出现不可用状态,上述配置会自动重启服务,建议避免频繁操作
四. 访问
Nohost 本身就是一个代理,可以直接配置浏览器或系统代理访问,也可以通过 Nginx反向代理访问,为方便大家使用,针对不同的人群可以使用不同的方案(以下用 nohost.imweb.io 表示 Nohost 的域名,具体域名需要自己申请及设置)。
前端开发
前端开发建议使用最新版的 Whistle,可以通过以下两种方式访问 Nohost:
直接在 Whistle 上配置远程规则
@http://nohost.imweb.io:8080/whistle.nohost/cgi-bin/plugin-rules上述配置表示 Whistle 从
http://nohost.imweb.io:8080/whistle.nohost/cgi-bin/plugin-rules获取 Nohost 的生成的入口规则,并且如果 Nohost 规则有变会自动更新规则,这些规则是由 Nohost 上传证书的域名及界面配置/入口配置配置的规则自动生成(具体参见后面的配置),这些规则可以自动过滤掉无关请求,只会把相关的请求转到Nohost。当然这种直接手动配置在 Whistle 上还不是最好的方式,更建议的方式是把这些规则集成到插件里面,这样开发者只需安装插件即可。
【强烈推荐】 集成 Whistle 插件,具体参考:https://github.com/nohosts/whistle.nohost-imweb/blob/master/dev.md
后台开发
后台开发推荐使用 Chrome 的 SwitchyOmega 配置代理规则 (如上述代理配置 nohost.imweb.io + 8080),如果不想所有请求都转到 Nohost,可以配置 SwitchyOmega 的自动切换或者用PAC脚本代替,也可以参考 nohost-client 打包一个客户端:https://github.com/nohosts/client。手机端可以直接配代理,或者通过 VPN App 设置代理,如 iPhone 可以用 detour。
其他人员
非开发人员尽量使用客户端、APP、或通过外网转发的方式,减少他们的接入成本,如何打包客户端参考:https://github.com/nohosts/client;手机等同后台开发的配置方式。
外网访问
一般 Nohost 是部署在公司内网,外网是不可以直接访问,需要通过接入层(如:Nginx)转发。
五. 账号
安装好插件或配置好代理后,打开相关页面(这些页面的域名必须在上面上传证书里面,如果没有需要额外配置,具体参考下方 配置 说明),即可看到页面左下脚出现一个小圆点,点击小圆点可以进行切换环境:




如果页面左下脚没出现小圆点,可以看下面 配置 说明 第一次打开小圆点只有一个 正式环境,需要管理员添加账号:
添加完账号后,打开独立的环境选择页面 http://nohost.imweb.io:8080:

创建完环境后,可以在环境里面配置任何 Whistle 规则,跟普通到本地 Whistle 功能一模一样,甚至更多。每个实例可以建立上百个账号,每个账号可以建立上百个环境,具体取决于你到机器性能。
六. 配置
默认情况下,只有证书里面域名的请求才会被转发到各个账号,且 html 类型的内容会自动注入小圆点,但在实际应用中你可能会遇到以下问题:
域名证书问题
有些域名只涉及 http 请求,不涉及 https 的请求不需要证书,或者某些敏感及第三方域名无法获得证书,这类域名可以通过在 配置 -> 入口配置 里面设置:

入口配置的规则有三种(#xxx表示注释):
pattern #转发到Nohost,如果是html页面则注入小圆点
-pattern #转发到Nohost,不注入小圆点
--pattern #不转发到Nohost,且不注入小圆点
x)-pattern #x为整数(正负数零都可以),表示手动设置优先级,默认为0pattern 参见:https://wproxy.org/whistle/pattern.html,匹配顺序是从上到下,每个请求只会匹配其中一个,证书里面到域名优先级默认最低,可以通过 1) 设置优先级。
如:
ke.qq.com
-*.url.cn
--localhost.**
-1)**.qq.com表示:
- 所有
ke.qq.com的请求都转发到Nohost,且所有 html 都注入小圆点 - 所有
xxx.url.cn的请求都转发到Nohost,但不注入小圆点 - 所有
localhost.xxx.yyy...的请求都不转发到Nohost,且不注入小圆点 - 所有
qq.com的子代域名请求都转发到Nohost,但不注入小圆点,并优先级设为-1,确保证书里面的qq.com子域名可以正常注入小圆点
七. 规则
这个是 Nohost 主进程 Whistle,所有请求都会通过该 Whistle,并通过该进程的 whistle.nohost 插件进行账号管理及请求转发,主进程 Whistle 在生产环境下无法查看抓包数据,可用于设置规则及全局插件管理,如:屏蔽一些请求等等,更多内容参见后面的文档。
详细内容参见文档:https://nohost.pro/
八. 开发
开发环境搭建:
git clone [email protected]:Tencent/nohost.git
# 切换到dev开发分支
git checkout dev
# 安装依赖
npm install
# 启动页面构建
npm run dev
# 启动 Nohost
npm start修改页面后需要手动刷新
九. 常用命令
Nohost 提供了 n2 / nohost / nohosts 三个等价的命令行入口,常用命令如下(完整参数可执行 n2 --help 查看):
# 启动(可用 -p 指定端口,-o 指定域名,-n/-w 指定管理员账号密码)
n2 start
n2 start -p 80 -o nohost.imweb.io
n2 start -n admin -w your_password -k your_auth_key
# 重启 / 停止
n2 restart
n2 stop
# 重置管理员账号为默认 admin/123456
n2 restart --reset
# 以集群模式启动(利用多核)
n2 start --cluster # 使用所有 CPU 核
n2 start --cluster 4 # 指定 4 个 worker
# 以开发 / 调试模式启动(前台运行,便于查看日志)
n2 run -b dev
# 插件管理
npm i -g whistle.xxx # 安装全局插件(Nohost 主进程 Whistle)
n2 i whistle.xxx # 安装到所有账号
n2 i whistle.xxx -a account-name # 只装到指定账号
n2 uni whistle.xxx # 卸载账号级插件
n2 i等价于n2 install,n2 uni等价于n2 uninstall;使用 tnpm / cnpm 源可用n2 ti/n2 ci。
十. 项目结构
nohost/
├── bin/ # 命令行入口(n2 / nohost / nohosts)
│ └── nohost.js
├── index.js # Node 库入口,供二次集成使用
├── lib/ # 后端核心代码
│ ├── main/ # 服务启动、请求分发等主流程
│ ├── plugins/ # 内置 Nohost 插件(whistle.nohost 等)
│ ├── service/ # 数据存储、环境 / 账号服务
│ ├── util/ # 通用工具
│ ├── config.js # 启动配置
│ └── whistle.js # 主进程 Whistle 封装
├── src/ # 管理后台 / 环境选择页等前端源码(React + Less)
│ └── config/ # Webpack 构建配置
├── public/ # 前端构建产物(运行时生成)
├── docs/ # VuePress 文档站点源文件
│ ├── .vuepress/ # 站点配置
│ ├── README.md # 概览页
│ └── zh/ # 中文文档(快速上手 / 管理员 / 开发 / 用户 / API / 高级)
├── test/ # 单元测试(Jest)
└── package.json常用 npm 脚本:
npm run dev # 前端开发模式,监听 src/ 变化
npm run dist # 前端生产构建
npm run server # 后端以 dev 模式运行一次
npm start # 前端构建 + 后端(nodemon 热重启)
npm run docs:dev # 启动 VuePress 本地文档站点
npm run docs:build # 构建文档静态产物
npm run lint # 代码风格检查
npm test # 跑单元测试(含覆盖率)十二. 完整文档
除本 README 外,仓库的 docs/ 目录提供了一份更完整的 VuePress 文档站点,按角色组织:
本地预览文档站点:
npm run docs:dev
# 默认监听 http://localhost:8081线上文档:https://nohost.pro/
十三. API 接口
Nohost 对外提供了一组 OpenAPI,便于发布系统、CI、测试平台自动化增删查改环境以及维护全局机器人链接。典型使用流程:
- 管理员在后台「系统」页设置
Auth Key - 调用方在请求头携带:
x-nohost-auth-key:上面配置的 AuthKeyx-nohost-account-name:目标账号名(机器人链接接口不需要)
- 按业务需要调用接口:
- 账号 / 环境增删查改:
/open-api/list、/open-api/add-env、/open-api/modify-env、/open-api/rename-env、/open-api/remove-env - 无鉴权只读:
/cgi-bin/list、/cgi-bin/get-env - 机器人槽位(与
miniprogram-ci的 robot 1–30 对齐,全表内置 30 条、不可增删):/open-api/robot-link/list、/update、/toggle、/set-in-use、/claim
- 账号 / 环境增删查改:
完整字段说明、响应格式与 cURL 示例见:docs/zh/api.md。
十三. 常见问题
Q1:页面左下角没有小圆点?
- 当前域名不在管理员上传的证书列表,也没在「入口配置」里显式加上 → 联系管理员
- 浏览器没有走 Nohost 代理 → 检查 Whistle / SwitchyOmega / 系统代理是否生效
- 页面是 HTTPS 但客户端没有信任证书 → 让管理员上传对应域名的
*.crt/*.key,或安装 Whistle 根证书
Q2:忘记管理员账号 / 密码?
n2 restart --reset会把管理员重置为默认 admin / 123456,登录后请立即修改。
Q3:端口被占用 EADDRINUSE?
- 先确认是否已有 Nohost 进程:
n2 stop停掉后再n2 start - 或换端口:
n2 restart -p 8081
Q4:HTTPS 请求抓不到包 / 内容显示为 tunnel?
- 该域名没有上传证书,也没安装 Whistle 根证书
- 推荐管理员在后台「证书」页上传对应业务域名的证书对
Q5:想让规则只在代码里临时生效?
- 请求头加
x-whistle-nohost-policy: none(不转发)或x-whistle-nohost-policy: 1(转发并注入小圆点)
Q6:大量用户接入后机器压力大?
- 使用
n2 start --cluster开启多 worker - 前置 Nginx 做 TLS 终止 / 限流
- 拆分多实例:按业务线或按团队独立部署,参见 高级应用
更多问题欢迎在 Issues 反馈。
参与贡献
如果你有好的意见或建议,欢迎给我们提 Issues 或 Pull Requests,为提升抓包调试体验贡献力量。 腾讯开源激励计划 鼓励开发者的参与和贡献,期待你的加入。

