Appwrite 不能走 XAMPP 的 Apache,因其是独立 Node.js 后端服务,自带 HTTP 服务器,不依赖 PHP 或 Apache;强行挂载会导致 404/403,且端口冲突需显式分配(如 8081),并同步修改 APPWRITE_ENDPOINT、防火墙及 Docker 配置。

Appwrite 本地部署不能直接用 XAMPP 默认的 80 端口,必须显式分配独立端口(如 8081、8082),否则会和 Apache 冲突或被拒绝访问。
为什么 Appwrite 不能走 XAMPP 的 Apache
Appwrite 是一个基于 Node.js 的后端服务,自带完整 HTTP 服务器(使用的是自研的 appwrite:server 容器),它不依赖 PHP 或 Apache。XAMPP 的 Apache 只负责托管静态文件或 PHP 应用,对 Appwrite 的 REST API、WebSocket、队列等完全无感知。强行把 Appwrite 套在 DocumentRoot 下只会返回 404 或 403。
常见错误现象:
- 浏览器访问
http://localhost/v1显示 “Not Found” —— 因为 Apache 根本没转发请求给 Appwrite - 启动
docker-compose up后提示port already in use—— XAMPP 的 Apache 正占着 80/443 - Appwrite 控制台能打开,但 API 调用失败(CORS 或连接拒绝)—— 端口未暴露或防火墙拦截
必须改掉 Apache 的默认监听端口
Appwrite 推荐使用 8081(HTTP)和 8443(HTTPS),所以你要先腾出 80 和 443 给它,方法是让 XAMPP 的 Apache 改用其他端口,比如 8000:
- 编辑
C:\xampp\apache\conf\httpd.conf - 找到
Listen 80,改成Listen 8000 - 再找
ServerName localhost:80,改成ServerName localhost:8000 - 保存后,在 XAMPP 控制面板里重启 Apache
改完后,原来 http://localhost 就要变成 http://localhost:8000 才能访问 XAMPP 首页。这步跳过,Appwrite 启动时会直接报端口占用。
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
Appwrite 的 docker-compose.yml 端口映射必须显式声明
Appwrite 官方 docker-compose.yml 默认把容器内 80 映射到宿主机 80,但在 Windows + XAMPP 环境下,你得手动改成空闲端口:
services:
appwrite:
ports:
- "8081:80" # 宿主机 8081 → 容器内 80(HTTP API)
- "8443:443" # 宿主机 8443 → 容器内 443(HTTPS,可选)
environment:
- APPWRITE_ENDPOINT=http://localhost:8081注意:APPWRITE_ENDPOINT 必须和你对外暴露的端口一致,否则 SDK 初始化会失败。别写成 http://localhost 或 http://127.0.0.1 —— 容器内解析不到宿主机的 localhost。
Windows 防火墙和 Docker Desktop 权限容易被忽略
Docker Desktop 在 Windows 上默认不允许任意端口入站,尤其非标准端口(如 8081)。即使 docker-compose up 显示成功,浏览器也可能连不上:
- 检查 Windows 防火墙是否放行了 8081 入站规则(控制面板 → Windows Defender 防火墙 → 高级设置 → 入站规则 → 新建规则 → 端口 → TCP 8081)
- 确保 Docker Desktop 设置里启用了 “Use the WSL 2 based engine”(旧版 Hyper-V 模式兼容性差)
- 首次运行
docker-compose up -d后,等 2–3 分钟再访问http://localhost:8081/console,容器初始化需要时间
最常被跳过的点:改完 Apache 端口后没重启服务,或改了 docker-compose.yml 却没 docker-compose down && docker-compose up -d 彻底重建容器 —— 缓存的旧配置会让端口映射失效。

















