对于近几日无法访问该网站的问题公告
在近几日,不少用户反馈本网站和在访问时会出现Cloudflare的522错误,现该错误已解决
问题来源
为什么会有这个问题
本网站基于Hexo,而Hexo又是基于Node.js,此次错误是因为 服务器使用的NVM(Node.js版本管理器)未及时配置PATH 导致Hexo找不到Node.js而运行出错
影响范围
服务器上所有基于Node.js的项目
刨根究底
问题历史
为了庆祝77的生日,我去Github上找了一个基于Node.js的生日祝福网页,而Node项目在运行前,需要运行npm install安装项目依赖
服务器使用的是Ubuntu自带源的Node.js 18.19.1,该版本已停止支持,同时该版本在使用npm的时候,会出现io死锁的问题导致系统卡死,最终我们通过NVM安装了新版本的Node.js才解决问题
但是,通过NVM安装的Node.js默认会在/home/USER/.nvm/versions/node/VERSION/bin,这并不是常见的PATH
我们的Hexo服务-g全局安装使用自带的hexo s启动并通过配置Systemd服务实现
在安装NVM后,环境变量需要手动添加,但Systemd服务没有这个PATH,导致启动服务时因为找不到Node而出错无法启动
解决过程
既然知道了问题的来源,那么解决就很简单了
在新的Node.js环境中安装Hexo
NVM提供了一个把自己添加到环境变量的命令,添加到.bashrc等地方
export NVM_DIR="$([ -z "${XDG_CONFIG_HOME-}" ] && printf %s "${HOME}/.nvm" || printf %s "${XDG_CONFIG_HOME}/nvm")"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm
安装并使用Node.js
安装
nvm install node #这里的node指最新版本
使用
nvm use node
随后安装Hexo
npm install -g hexo-cli
这样的话你的hexo就被安装在了新的Node.js里面
修改Systemd文件
现在编辑Systemd文件,建议使用绝对路径的Hexo并把新的Node.js添加到Systemd的环境里面
# EXAMPLE
[Unit]
Description=Hexo Server
After=network.target
[Service]
Type=simple
WorkingDirectory=/path/to/hexo
User=USER # 注意这个用户需要有能访问下文环境的权限
Group=USER
# 关键:把 NVM node/bin 加入 PATH
Environment=PATH=/home/USER/.nvm/versions/node/VERSION/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# 用绝对路径执行 hexo
ExecStart=/home/USER/.nvm/versions/node/VERSION/bin/hexo server
Restart=on-failure
RestartSec=5s
[Install]
WantedBy=multi-user.target
此时应该就能正常运行了
到此问题解决