Flutter Web应用部署至Caprover遇Nginx异常及路由问题求助
解决方案
一、修复Caprover上Nginx进程被终止的问题
- 调整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;"]
- 同步Caprover端口设置
部署时进入应用的「App Configs」页面,将「Container Port」设置为80,与容器暴露的端口保持一致,之后重新部署应用。
二、解决Flutter Web路由404问题
Flutter Web属于单页应用(SPA),所有路由请求需要转发到index.html才能正常工作,默认Nginx配置不支持该逻辑,需自定义配置:
- 在项目根目录创建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"; } }
- 更新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;"]
- 本地验证效果
重新构建镜像并运行:
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
相关产品推荐
相关产品推荐

