Ghost 无法在 XAMPP 中直接运行,因其依赖 Node.js 长进程监听端口(如2368),而 XAMPP 提供的是 Apache+PHP 短连接模型;强行放入 htdocs 会导致 404/500 错误;正确做法是启用 Apache 反向代理模块,将请求转发至本地 Ghost 服务,并严格配置 config.production.json 的 url 和 host。

XAMPP 不能直接运行 Ghost 博客——Ghost 是基于 Node.js 的应用,而 XAMPP 自带的是 Apache + PHP 环境,两者运行机制、进程模型和依赖栈完全不同。强行把 Ghost 放进 htdocs 或配成 VirtualHost 不会启动服务,只会返回 404 或 500 错误。
为什么 Ghost 在 XAMPP 下启动就报错或打不开
Ghost 启动依赖 node 进程长期驻留(监听端口如 2368),靠 ghost start 或 npm start 触发;Apache 则是 HTTP 请求到达后 fork 子进程处理 PHP 脚本,不维持长连接。两者无法共用同一服务入口。
- 常见错误现象:
EADDRINUSE(端口被占)、Cannot find module 'ghost'(Node 模块未安装)、浏览器空白页但控制台无响应(Apache 拦截了请求,没转发给 Node) - 误操作典型:把 Ghost 项目丢进
C:/xampp/htdocs/ghost,然后访问http://localhost:8080/ghost—— 这只是让 Apache 尝试解析一个不存在的 PHP 文件,不是运行 Ghost - Ghost 官方明确要求:生产环境必须用 Nginx 或 Apache 做反向代理,把
/请求转发到本地127.0.0.1:2368,而不是让 Apache 直接托管
Apache 配置反向代理必须启用 mod_proxy
默认 XAMPP 的 Apache 是禁用代理模块的,不手动开启,ProxyPass 指令会被忽略,配置无效且无报错提示。
- 打开
C:/xampp/apache/conf/httpd.conf,取消以下三行的注释(删掉开头#):LoadModule proxy_module modules/mod_proxy.soLoadModule proxy_http_module modules/mod_proxy_http.soLoadModule rewrite_module modules/mod_rewrite.so - 若使用 HTTPS 或 WebSocket(如 Ghost Admin 实时预览),还需启用:
LoadModule proxy_wstunnel_module modules/mod_proxy_wstunnel.so - 改完后务必执行
httpd -t验证语法,再重启 Apache;否则 XAMPP 控制面板里 Start 按钮会瞬间变灰
Ghost + Apache 反向代理的关键配置项
在 C:/xampp/apache/conf/extra/httpd-vhosts.conf 中添加一个 VirtualHost,不要复用 *:80 默认站点,避免冲突:
XAMPP 8.0.30 是一款免费、开源的跨平台 Web 服务器集成包,专为快速搭建本地 PHP 开发环境而设计。该版本核心组件包括:Apache 2.4.56、MySQL 8.0.33、PHP 8.0.30、phpMyAdmin 5.2.1 等。它支持 Windows、Linux 和 macOS 系统,可让开发者在个人电脑上轻松模拟服务器环境,无需复杂配置即可运行 WordPress、Thin
<VirtualHost *:80>
ServerName ghost.local
ProxyPreserveHost On
ProxyRequests Off
<pre class='brush:php;toolbar:false;'># 主站路由
ProxyPass / http://127.0.0.1:2368/
ProxyPassReverse / http://127.0.0.1:2368/
# 管理后台 WebSocket 支持(Ghost v5+ 必需)
ProxyPass /ghost/ http://127.0.0.1:2368/ghost/
ProxyPassReverse /ghost/ http://127.0.0.1:2368/ghost/
ProxyPass /socket.io/ ws://127.0.0.1:2368/socket.io/</VirtualHost>
-
ServerName ghost.local必须与 Windowshosts文件中映射一致,否则 DNS 解析失败 -
ProxyPreserveHost On确保 Ghost 收到原始 Host 头,用于生成正确 URL(如邮件链接、图片路径) - Ghost 默认监听
127.0.0.1:2368,不是0.0.0.0:2368;若改过config.production.json中的host字段为0.0.0.0,Apache 代理可能因跨网段拒绝连接 - 如果 Ghost 启动后访问白屏,检查浏览器开发者工具 Network 面板:所有请求是否都返回 200?若出现 404(如
/assets/css/screen.css),说明url配置不对,需在 Ghost 的config.production.json中设置"url": "http://ghost.local"
Ghost 本身必须用 production 模式启动并监听正确地址
开发模式(ghost start --development)默认只监听 127.0.0.1:2368,且不校验 url 配置,上线后链接全错。必须走 production 流程:
- 初始化配置:
ghost install local→ 手动修改config.production.json,确保:"url": "http://ghost.local""server": {"host": "127.0.0.1", "port": 2368} - 不能用
ghost start直接跑;要用ghost start --no-stack(跳过内置 Nginx/MySQL 检查),或更稳妥地:npm start --production - 启动后执行
curl -I http://127.0.0.1:2368,确认返回HTTP/1.1 200 OK;否则 Apache 代理转发过去也是 502 Bad Gateway - Windows 下若 Ghost 启动卡住无响应,检查是否开了杀毒软件拦截 node 进程,或 PowerShell 执行策略限制(需管理员运行
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser)
真正麻烦的从来不是配 Apache,而是 Ghost 自身的 Node 环境隔离、url 和 host 的耦合逻辑、以及 Windows 下权限与防火墙对 localhost 回环的干扰。只要 Ghost 进程没在 127.0.0.1:2368 稳定响应,前面所有 Apache 配置都是空转。

















