ghost在linux上需严格满足node.js v18.x、非root用户、nginx反向代理及config.js中url/server.host/database等字段手动校验,任一缺失或错误均导致502/err_empty_response或页面异常。

Ghost 在 Linux 上不是装完 nodejs 就能跑的服务,它对 Node.js 版本、用户权限、配置字段和反向代理有硬性要求。跳过任一环节,npm start 可能成功,但浏览器访问会返回 502、ERR_EMPTY_RESPONSE 或图片全挂。
Node.js 必须用 v18.x,不能靠系统默认源
Ubuntu/Debian 自带的nodejs 包通常是 v12 或 v16,ghost install 或 npm install --production 会卡在兼容性检查或直接报错。官方明确支持的是 v18.17+(如 v18.20.2),v20.x 部分可用,v22.x 不被验证。
- 卸载旧版:
sudo apt remove nodejs npm,再删掉/usr/lib/node_modules下残留 - 加 NodeSource v18 源:
curl -fsSL @#@#@#@#@#@#@#@#@#@0 | sudo -E bash - - 安装:
sudo apt install -y nodejs - 验证:
node -v输出必须是v18.x.x,npm -v≥10.2.0 - 别用
n或fnm切版本——ghost-cli只认$PATH里第一个node,容易误读
必须用非 root 用户部署,ghost-cli 会直接拒绝 root
ghost install 从 v5 起强制校验 UID,root 运行会立刻报错:Error: You cannot run ghost-cli as root。这不是提示,是中断。
- 创建专用用户:
sudo adduser ghostadmin - 加入
sudo组(仅首次配置需要):sudo usermod -aG sudo ghostadmin - 切换并保持在此用户下:
su - ghostadmin - 后续所有操作(包括
ghost install、npm start、文件权限调整)都必须在此用户上下文完成 - 别在 root 下
chown后又用sudo启动——这会导致 systemd service 文件绑定失败、日志写不进/var/log/ghost
config.js 里 url 和 server.host 错一个,网站就打不开
config.js 不是复制 config.example.js 改两行就能用。Ghost 启动时只读这个文件,字段缺失或值非法不会报错,但会导致:
- 图片路径变成 https://www.php.cn/link/c5f30fe2589446ef4430d425003243d0/content/...(前端加载失败)
- 管理后台登录后跳转到错误地址
- Nginx 反代后页面空白或无限重定向
必须手动确认以下字段:
-
url:填对外完整地址,如@#@#@#@#@#@#@#@#@#@1,不能是@#@#@#@#@#@#@#@#@#@2或留空 -
server.host:生产环境必须是127.0.0.1,不是0.0.0.0或公网 IP;否则 Nginx 无法 proxy_pass,且暴露端口 -
database:SQLite 路径要存在且可写,比如/var/www/ghost/content/data/ghost.db,检查ghostadmin对该目录有rwx权限 - 第一次
npm start失败生成的config.js往往字段残缺,务必逐行核对
Nginx 配置必须拆 location,否则静态资源全走 Node
Ghost 不托管 CSS/JS/图片等静态文件,全靠 Nginx 缓存并透传。如果/etc/nginx/conf.d/ghost.conf 只写一个 location /,所有请求都会打到 Node 进程,结果是:
- 页面加载慢、易超时
- gzip 不生效
- 图片 404(因为 Node 没配静态路由)
标准配置至少含两段:
server {
listen 80;
server_name blog.example.com;
<pre class="brush:php;toolbar:false;">location / {
proxy_pass http://127.0.0.1:2368;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-Proto $scheme;
}
location ~* \.(jpg|jpeg|png|gif|ico|css|js|woff2|ttf|eot|svg)$ {
proxy_pass http://127.0.0.1:2368;
expires 30d;
add_header Cache-Control "public, immutable";
}}
改完后运行 sudo nginx -t 测试语法,再 sudo systemctl reload nginx。
真正麻烦的从来不是命令敲几行,而是每个环节都得对:node -v 的输出、ghostadmin 的 UID、config.js 里那个 url 的末尾有没有斜杠、Nginx 的 proxy_pass 后面有没有多余空格——错一个,你就得重查日志。











