云主机部署dify
1. **API 服务未正常运行** - docker-api-1 容器未启动或崩溃。2. **Nginx 反向代理配置错误** - proxy_pass 地址不正确。2. **API 服务未正常运行** - docker-api-1 服务有问题。1. **Nginx 反向代理配置错误** - API 请求未正确转发到后端。4. **API 服务监听地址错误** - 服务未监听在正确地址。3. *
- 云主机操作系统:centos7(建议用更高的版本)
- 通过docker 部署dify,可以使用公网访问
- 依赖工具 yum
一、安装docker&dify
1、docker
清理并生成缓存
yum clean all
yum makecache
安装基础依赖
yum install -y yum-utils device-mapper-persistent-data lvm2
安装docker引擎
# 安装最新版本
yum install -y docker-ce docker-ce-cli containerd.io
启动docker服务
#验证docker版本
docker --version
# 启动服务
systemctl start docker
# 设置开机自启
systemctl enable docker
# 验证服务状态 输出为running正常
systemctl status docker
配置镜像加速
#创建配置文件目录(已存在可跳过)
mkdir -p /etc/docker
#通过命令行生成配置(推荐新手)
vi /etc/docker/daemon.json
{
"registry-mirrors": [
"https://docker.m.daocloud.io",
"https://docker.imgdb.de",
"https://docker-0.unsee.tech",
"https://docker.hlmirror.com"
]
}
#使用配置生效
sudo systemctl daemon-reload
sudo systemctl restart docker
安装docker compose
yum install docker compose
# 验证安装(V2版本)
docker compose version
2、dify
可以先克隆到本地,使用xftp上传,也可以直接下载
git clone https://github.com/langgenius/dify.git
#cd 进入目录
cd dify/docker
配置环境变量.env
#复制环境变量
cp .env.example .env
#编辑
vi .env
#修改访问地址
CONSOLE_API_URL=http://服务器地址:端口
CONSOLE_WEB_URL=http://服务器地址
SERVICE_API_URL=http://服务器地址
APP_API_URL=http://服务器地址
APP_WEB_URL=http://服务器地址
#修改默认端口 80端口需要备案才可以使用
EXPOSE_NGINX_PORT=端口号
拉取dify镜像
docker compose up -d
#查看服务状态
docker ps
浏览器访问dify
http://服务器地址:端口
3、测试访问
确保云主机的安全策略配置了入站和出站
# 在云主机上测试
curl http://localhost:修改后的端口
# 从外网测试(使用您的公网 IP)
curl http://服务器地址:端口
#如果不通
#查看防火墙是否开放
sudo firewall-cmd --list-all
检查 Docker 端口映射
docker ps --format "table {{.Names}}\t{{.Ports}}"
# 测试本地访问
curl -I http://localhost:8080
curl -I http://localhost:3000
# 检查 Nginx 日志
docker logs docker-nginx-1 --tail 50
# 检查 Web 服务日志
docker logs docker-web-1 --tail 50
问题 1:端口已开放但仍无法访问
检查项:
- 确认云主机有公网 IP
- 确认安全组规则已生效(可能需要等待几分钟)
- 检查 Nginx 配置中的 `server_name` 是否正确
问题 2:访问时显示 502 Bad Gateway
错误表现:
- 浏览器控制台显示:`502 (Bad Gateway)`
- API 请求 `/console/api/setup` 返回 502 错误
- 返回 HTML 错误页面而不是 JSON:`Unexpected token '<', "<html><h"... is not valid JSON`
问题原因:
Nginx 无法连接到后端 API 服务,可能的原因:
1. **API 服务未正常运行** - docker-api-1 容器未启动或崩溃
2. **Nginx 反向代理配置错误** - proxy_pass 地址不正确
3. **Docker 网络问题** - 容器间无法通信
4. **API 服务监听地址错误** - 服务未监听在正确地址
检查步骤一:检查 API 服务状态(最重要)
# 检查 API 容器是否运行
docker ps | grep api
# 如果容器未运行,查看原因
docker ps -a | grep api
# 查看 API 服务详细日志
docker logs docker-api-1 --tail 200
# 检查 API 服务是否正常响应
docker exec docker-api-1 curl -I http://localhost:5001/health
# 或
docker exec docker-api-1 curl http://localhost:5001/console/api/setup
检查步骤二:如果 API 服务未运行
# 启动 API 服务
docker compose start api
# 或重启 API 服务
docker compose restart api
# 如果启动失败,查看详细错误
docker compose logs api
检查步骤三:#检查 Docker 网络连接
# 检查容器是否在同一网络
docker network inspect docker_default | grep -A 10 "Containers"
# 从 Nginx 容器测试能否访问 API 容器
docker exec docker-nginx-1 ping -c 3 api
# 从 Nginx 容器测试 API 服务
docker exec docker-nginx-1 curl -I http://api:5001/health
docker exec docker-nginx-1 curl http://api:5001/console/api/setup
# 检查 API 服务监听地址
# 检查 API 服务监听的地址和端口
docker exec docker-api-1 netstat -tlnp | grep 5001
# 或
docker exec docker-api-1 ss -tlnp | grep 5001
# 应该显示类似:0.0.0.0:5001 或 :::5001
# 如果是 127.0.0.1:5001,则只能本机访问,需要修改配置
检查步骤四:查看 Nginx 错误日志
# 查看 Nginx 错误日志(最详细的错误信息)
docker logs docker-nginx-1 2>&1 | grep -i error | tail -50
# 查看 Nginx 访问日志
docker logs docker-nginx-1 2>&1 | tail -50
修复方案
方案 A:API 服务未启动**
docker compose up -d api
docker compose logs -f api # 查看启动日志
方案 B:Nginx 配置错误
- 检查 docker-compose.yml 中的 Nginx 配置
- 确保有正确的 API 反向代理配置
- 重启 Nginx:`docker compose restart nginx`
方案 C:Docker 网络问题
# 重新创建网络
docker compose down
docker compose up -d
方案 D:端口冲突
# 检查端口占用
netstat -tlnp | grep 5001
# 如果被占用,修改 docker-compose.yml 中的端口配置
问题 3:访问时显示 403 Forbidden
可能原因:
- Nginx 配置权限问题
- 检查 Nginx 配置中的文件路径和权限
问题 4:浏览器控制台显示 `ERR_CONNECTION_TIMED_OUT` 和 `Failed to fetch`
错误表现:
- 页面可以打开,但显示加载中或空白
- 控制台报错:`net::ERR_CONNECTION_TIMED_OUT`
- API 请求失败:`/console/api/setup` 无法访问
- `TypeError: Failed to fetch`
可能原因:
1. **Nginx 反向代理配置错误** - API 请求未正确转发到后端
2. **API 服务未正常运行** - docker-api-1 服务有问题
3. **网络连接问题** - 容器间网络不通
4. **CORS 跨域问题** - 前端和后端域名/端口不匹配
排查步骤:
步骤 1:检查 API 服务状态
# 检查 API 服务是否正常运行
docker ps | grep api
# 查看 API 服务日志
docker logs docker-api-1 --tail 100
# 检查 API 服务健康状态
docker exec docker-api-1 curl -I http://localhost:5001/health
# 或
docker exec docker-api-1 curl http://localhost:5001/console/api/setup
步骤 2:检查 Nginx 反向代理配置
# 查看 Nginx 配置文件
docker exec docker-nginx-1 cat /etc/nginx/conf.d/default.conf
# 检查 Nginx 日志
docker logs docker-nginx-1 --tail 100
# 测试 Nginx 是否能访问 API
docker exec docker-nginx-1 curl http://api:5001/health
**关键检查点:**
- Nginx 配置中应该有类似这样的反向代理配置:
```nginx
location /console/api {
proxy_pass http://api:5001;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
步骤 3:检查 Docker 网络连接
# 检查容器网络
docker network ls
docker network inspect docker_default
# 测试容器间网络连通性
docker exec docker-nginx-1 ping -c 3 api
docker exec docker-nginx-1 ping -c 3 web
步骤 4:检查环境变量配置
# 查看 docker-compose.yml 中的环境变量
cat docker-compose.yml | grep -A 20 "api:"
# 检查 API 服务的环境变量(特别是 API_URL、CONSOLE_API_URL 等)
docker exec docker-api-1 env | grep -i url
docker exec docker-web-1 env | grep -i url
**常见配置问题:**
- `CONSOLE_API_URL` 应该指向正确的 API 地址
- 如果通过 Nginx 访问,应该是 `http://114.80.38.139:8081` 或相对路径 `/console/api`
步骤 5:直接测试 API 端点
# 在云主机上直接测试 API
curl http://localhost:5001/console/api/setup
curl http://localhost:5001/health
# 通过 Nginx 测试
curl http://localhost:8081/console/api/setup
步骤 6:检查防火墙和安全组
确保 API 服务端口(5001)在 Docker 网络内部可访问,虽然不需要对外暴露,但容器间必须能通信。
步骤 7:重启相关服务
cd /path/to/docker
# 重启 API 服务
docker compose restart api
# 重启 Nginx
docker compose restart nginx
# 如果还不行,重启所有服务
docker compose restart
步骤 8:查看完整错误日志
# 查看所有相关服务日志
docker logs docker-api-1 --tail 200
docker logs docker-nginx-1 --tail 200
docker logs docker-web-1 --tail 200
docker logs docker-worker-1 --tail 200
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐
所有评论(0)