You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter Web应用部署至Caprover遇Nginx异常及路由问题求助

解决方案

一、修复Caprover上Nginx进程被终止的问题

  1. 调整Dockerfile端口配置
    Caprover默认期望容器暴露80端口,你当前修改Nginx监听8080,可能导致平台健康检查失败,进而发送SIGQUIT终止进程。同时你重复执行了静态文件复制操作,属于冗余步骤,修改后的Dockerfile如下:
# Build the Flutter web application
RUN flutter build web --release

# Use Nginx to serve the app
FROM nginx:alpine
# 仅复制一次静态文件到Nginx目录
COPY --from=0 /app/build/web /usr/share/nginx/html

# 保持默认监听80端口,匹配Caprover默认配置
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
  1. 同步Caprover端口设置
    部署时进入应用的「App Configs」页面,将「Container Port」设置为80,与容器暴露的端口保持一致,之后重新部署应用。

二、解决Flutter Web路由404问题

Flutter Web属于单页应用(SPA),所有路由请求需要转发到index.html才能正常工作,默认Nginx配置不支持该逻辑,需自定义配置:

  1. 在项目根目录创建Nginx配置文件
    新建nginx.conf文件,内容如下:
server {
    listen 80;
    server_name localhost;
    root /usr/share/nginx/html;
    index index.html;

    # 将所有路由请求转发到index.html,适配Flutter路由
    location / {
        try_files $uri $uri/ /index.html;
    }

    # 静态资源直接返回,提升加载效率
    location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
        expires 1y;
        add_header Cache-Control "public, immutable";
    }
}
  1. 更新Dockerfile引入自定义配置
    修改后的完整Dockerfile:
# Build stage
FROM cirrusci/flutter:stable AS build
WORKDIR /app
COPY . .
RUN flutter pub get
RUN flutter build web --release

# Serve stage
FROM nginx:alpine
# 替换Nginx默认配置文件
COPY nginx.conf /etc/nginx/conf.d/default.conf
COPY --from=build /app/build/web /usr/share/nginx/html

EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
  1. 本地验证效果
    重新构建镜像并运行:
docker build -t flutter-web-app .
docker run -p 8080:80 flutter-web-app

此时访问localhost:8080/another_page将正常加载对应页面,路由功能恢复。

额外说明

  • python3 -m http.server仅为基础静态文件服务器,不支持SPA路由重写逻辑,无法适配Flutter Web的路由需求,必须使用Nginx这类支持路由转发的服务器。
  • 若因特殊需求必须使用8080端口,需同步修改Nginx配置监听8080,同时在Caprover的「Container Port」设置中改为8080,确保端口映射一致。

内容的提问来源于stack exchange,提问作者Baptiste LEROYER

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 01:45:19