常用命令

在执行命令的时候请使用完整的路径或者使用相对路径,如:

/$CloudNode安装目录/bin/cloud-node -v

或者:

cd /$CloudNode安装目录
bin/cloud-node -v

如果使用的是CDN远程安装的节点,安装目录默认在 /$ssh用户名/cloud-node/cloud-node,请将其中的$ssh用户名换成你实际使用的用户名,比如root

节点初次启动后(cloud-node start)后,会在系统里自动生成软链接:创建文件 /usr/bin/cloud-node,以后可以执行使用cloud-node xxx命令执行。

注意:如果提示命令找不到 Unknown command: cloud-node,说明你没有指定命令所在目录,请在命令执行时使用完整的路径或者使用相对路径,参考本文开始说明。

注意:如果是使用非 root 用户执行命令,你需要使用 sudo 执行大部分命令,比如 sudo bin/cloud-node conns

打印帮助信息

cloud-node -h

打印版本信息

cloud-node -v

启动服务

启动服务并在后台运行:

cloud-node start

如果要在前端启动服务,并阻塞当前进程,可以使用:

cloud-node

测试服务

可以用下面命令检查服务是否可以正常工作:

cloud-node test

停止服务

cloud-node stop

对于集群中开启了systemd服务的(默认是开启状态),可以使用以下命令停止节点:

systemctl stop cloud-node

优雅退出

cloud-node quit

重启服务

cloud-node restart

查看服务状态

cloud-node status

重载节点配置

cloud-node reload

安装systemd系统服务

安装系统服务后,系统重新启动的时候,会自动启动 cloud-node 进程。使用此命令的前提是系统已经安装并启用了 systemd 服务。可以通过 systemctl --system 命令来确认 systemd 服务是否在正常运行。

cloud-node service

使用守护进程启动服务

自动安装的cloud-node会自动启动一个守护进程,手动启动的时候也可以通过 daemon 参数来启动守护进程。当守护进程在运行时,cloud-node 进程在遇到故障意外退出时,守护进程可以立即启动一个新的 cloud-node 进程,保障服务不会长时间宕机。

cloud-node daemon

调试

开启pprof

可以使用以下命令开启pprof模式,用来监控节点运行性能信息:

cloud-node pprof

默认pprof地址为127.0.0.1:6060,可以使用 --addr 指定地址:

cloud-node pprof --addr="192.168.1.100:6060"

启动后可以在浏览器上访问这个地址,比如 http://127.0.0.1:6060/debug/pprof/ ,或者使用go tool pprof命令来查看,比如查看所有alloc的heap信息:

go tool pprof -alloc_space  "http://127.0.0.1:6060/debug/pprof/heap"

查看正在使用的内存空间:

go tool pprof -inuse_space  "http://127.0.0.1:6060/debug/pprof/heap"

查看CPU调用信息:

go tool pprof  "http://127.0.0.1:6060/debug/pprof/profile"

查看当前正在运行的goroutine:

go tool pprof "http://localhost:6060/debug/pprof/goroutine"

还有更多的示例可以参考 https://jvns.ca/blog/2017/09/24/profiling-go-with-pprof/

打印正在运行的任务

cloud-node trackers

打印正在运行的goroutine

cloud-node goman

打印连接数

cloud-node conns

强制执行内存回收

默认2分钟回收一次运行时内存,使用此命令可以强制立即执行回收。此命令跟内存缓存无关。

cloud-node gc

防火墙相关

目前支持的本地防火墙:

  • Firewalld
  • nftables

在本地防火墙中丢弃数据包

# 丢弃来自 192.168.1.100 的数据包
cloud-node ip.drop 192.168.1.100 

# 丢弃来自 192.168.1.100 的数据包,有效期 30 秒
cloud-node ip.drop 192.168.1.100 --timeout=30 

在本地防火墙中拒绝连接

# 拒绝来自 192.168.1.100 的连接
cloud-node ip.reject 192.168.1.100 

# 拒绝来自 192.168.1.100 的连接,有效期 30 秒
cloud-node ip.reject 192.168.1.100 --timeout=30 

在本地防火墙中删除已有的IP

# 删除我们使用 ip.drop 和 ip.reject 添加的IP
cloud-node ip.remove 192.168.1.100

关闭某个IP所有连接

# 关闭来自 192.168.1.100 的所有连接
cloud-node ip.close 192.168.1.100

本地查询访问日志

可以在本地使用命令查询访问日志(前提是网站中已经启用了访问日志):

cloud-node accesslog

如果有访问时会出现类似以下输出:

1.2.3.4 [1/May/2024:19:28:08 +0800] "GET https://example.com/html HTTP/1.1" 200 83 "" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36" - 0.82ms
1.2.3.4 [1/May/2024:19:28:08 +0800] "GET https://example.com/favicon.ico HTTP/1.1" 200 12 "https://example.com/html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36" - 1.22ms
1.2.3.4 [1/May/2024:19:28:10 +0800] "GET https://example.com/html HTTP/1.1" 304 0 "" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36" - 0.80ms
1.2.3.4 [1/May/2024:19:28:10 +0800] "GET https://example.com/favicon.ico HTTP/1.1" 200 12 "https://example.com/html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36" - 0.55ms
1.2.3.4 [1/May/2024:19:28:12 +0800] "GET https://example.com/ HTTP/1.1" 200 1 "" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36" - 1.09ms
1.2.3.4 [1/May/2024:19:28:12 +0800] "GET https://example.com/favicon.ico HTTP/1.1" 200 12 "https://example.com/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36" - 0.55ms
1.2.3.4 [1/May/2024:19:28:24 +0800] "GET https://example.com/ HTTP/1.1" 200 1 "" "curl/8.4.0" - 1.38ms

格式为:

${remoteAddr} - [${timeLocal}] "${requestMethod} ${requestURI} ${proto}" ${status} ${bytesSent} "${referer}" "${userAgent}" - ${requestTime}

其中:

  • ${remoteAddr} - 访客IP地址
  • ${timeLocal} - 服务器所在本地时间
  • ${requestMethod} - 请求方法,比如GETPOST
  • ${requestURI} - 请求URI
  • ${proto} - 包含版本的HTTP请求协议,类似于HTTP/1.1
  • ${status} - 响应状态码,比如200
  • ${bytesSent} - 发送的内容长度
  • ${referer} - 请求来源
  • ${userAgent} - 客户端UserAgent
  • %{requestTime} - 处理请求花费时间,单位为ms

可以使用管道符(|)筛选访问日志:

cloud-node accesslog | grep "css"
输出类似于:
root@vm # bin/cloud-node accesslog | grep "css"
1.2.3.4 [15/Jun/2022:11:18:41 +0800] "GET https://flex.dd.ci/_/@default/@layout.css.map HTTP/2.0" 200 - 0.93ms
1.2.3.4 [15/Jun/2022:11:18:41 +0800] "GET https://flex.dd.ci/_/@default/docs/index.css.map HTTP/2.0" 200 - 0.81ms

可以使用重定向符号(>)将访问日志输出到文件中:

cloud-node accesslog > accesslog.log
如果要在后台执行,在命令后面加入&符号:
cloud-node accesslog > accesslog.log &

测试硬盘写入速度

可以在本地使用命令测试硬盘写入速度(目前无法区分不同的分区):

cloud-node disk speed

卸载

可以使用命令卸载一个节点程序:

cloud-node uninstall

卸载成功后,会自动删除cloud-node相关服务、目录、文件等。

卸载后,并不会删除缓存策略使用的缓存目录,如有必要,你需要手工删除;如果有遗留的cloud-node进程,可以使用 kill 对应进程ID 来停止。

清除垃圾缓存文件

可以使用以下命令来清理垃圾缓存文件(指的是跟索引失去关联的缓存文件):

# 统计垃圾缓存文件
cloud-node cache.garbage

# 统计并删除垃圾缓存文件
cloud-node cache.garbage --delete

配置节点

可以使用以下命令配置节点:

cloud-node config '
                rpc.endpoints: [ "http://192.168.2.1:8003" ]
                nodeId: "a186380dbd26ccd49e75d178ec59df1b"
                secret: "VOqilMFo62MsxgL8XlNFbmYFKgkkfboH"
                '
其中的配置内容(rpc.endpoints等)可以在”节点详情“ – “安装节点“界面获得。

执行后,会自动创建或覆盖 configs/api_node.yaml 中的配置。

执行top命令

可以使用 top 命令调用系统的 top 命令并传入cloud-node进程PID,以方便我们调试:

cloud-node top