如何配置Traefik实现URL前缀路由转发至Node-Express应用
Traefik反向代理Node-Express应用的路径转发配置问题
现有一个运行在Docker内部8080端口的Node-Express应用,代码如下:
var express = require('express'); var app = express(); app.get("/", function(req, res) { res.send(` <h1> Application written in Node js</h1> <h3> Home page </h3> `) }); app.get("/info", function(req, res) { res.send(` <h1> Application written in Node js</h1> <h3> Info page </h3> `) }); app.get("/api", function(req, res) { res.send({success: 1}) }); const PORT = process.env.NODE_DOCKER_PORT || 8080; app.listen(PORT, () => { console.log(`Server is running on port ${PORT}.`); });
需求是通过Traefik实现以下路径转发:
localhost/node指向Node应用的/路由localhost/node/info指向Node应用的/info路由localhost/node/api指向Node应用的/api路由
当前使用的Traefik Docker Compose配置如下:
version: '3.1' services: nodeapp: build: ./node_app container_name: nodeapp labels: - "traefik.enable=true" - "traefik.http.routers.node-server.rule=Host(`localhost`) && PathPrefix(`/app`)" - "traefik.http.services.node-server.loadbalancer.server.port=8080" networks: - proxy reverse-proxy: image: traefik:v2.10 command: --api.insecure=true --providers.docker ports: - "80:80" - "8080:8080" volumes: # 让Traefik监听Docker事件 - /var/run/docker.sock:/var/run/docker.sock networks: - proxy networks: proxy:
尝试过使用stripprefix.prefixes和stripprefixregex.regex中间件,但问题仍未解决,需要帮助。
解决方案
问题核心有两个:一是路由规则的前缀写错,二是未正确配置并绑定StripPrefix中间件。修改后的node服务标签配置如下,替换原nodeapp的labels部分即可:
labels: - "traefik.enable=true" # 匹配localhost下所有以/node开头的请求 - "traefik.http.routers.node-server.rule=Host(`localhost`) && PathPrefix(`/node`)" # 定义StripPrefix中间件,移除请求路径中的/node前缀 - "traefik.http.middlewares.strip-node-prefix.stripprefix.prefixes=/node" # 将中间件绑定到对应路由,@docker表示该中间件通过Docker标签定义 - "traefik.http.routers.node-server.middlewares=strip-node-prefix@docker" - "traefik.http.services.node-server.loadbalancer.server.port=8080"
配置说明
- 修正路由规则:把原规则中的
/app改为/node,匹配需求中的路径前缀 - 定义StripPrefix中间件:创建名为
strip-node-prefix的中间件,作用是剥离请求URL里的/node前缀,让Node应用能识别剩余的路径 - 绑定中间件:将中间件关联到路由,确保请求转发前先执行前缀剥离操作
修改完成后重启Docker Compose:
docker-compose down && docker-compose up -d --build
此时访问:
localhost/node→ 转发至Node应用的/路由localhost/node/info→ 转发至/info路由localhost/node/api→ 转发至/api路由
如果Node应用包含静态资源且存在路径问题,可在Express代码中添加app.set('trust proxy', true),让应用正确识别代理后的请求路径。
内容的提问来源于stack exchange,提问作者subhadip pahari
相关产品推荐
相关产品推荐

