返回技能列表

configure-reverse-proxy

pjt222
更新于 2 days ago
2 次查看
17
2
17
在 GitHub 上查看
文档general

关于

This skill configures reverse proxy setups using Nginx, Traefik, or ShinyProxy to route traffic to backend services. It handles WebSocket proxying, path/host-based routing, SSL termination, and Docker label auto-discovery. Use it when you need to expose multiple services through a single entry point, proxy WebSocket connections, or add SSL to services that don't natively support TLS.

快速安装

Claude Code

推荐
主要方式
npx skills add pjt222/agent-almanac -a claude-code
插件命令备选方式
/plugin add https://github.com/pjt222/agent-almanac
Git 克隆备选方式
git clone https://github.com/pjt222/agent-almanac.git ~/.claude/skills/configure-reverse-proxy

在 Claude Code 中复制并粘贴此命令以安装该技能

技能文档

配置反向代理

使用 Nginx、Traefik 或 ShinyProxy 设置反向代理模式,将流量路由到后端服务。

适用场景

  • 将多个服务路由到单一入口点后面
  • 代理 WebSocket 连接(Shiny、Socket.IO、实时重载)
  • 使用 Traefik 标签自动发现 Docker 服务
  • 基于路径或基于主机的路由到不同后端
  • 为不处理 TLS 的服务添加 SSL 终止

输入

  • 必需:需要代理的后端服务(host:port)
  • 必需:路由策略(基于路径、基于主机或两者兼用)
  • 可选:代理工具偏好(Nginx、Traefik)
  • 可选:用于基于主机路由的域名
  • 可选:需要代理的 WebSocket 端点

步骤

第 1 步:选择代理工具

功能NginxTraefik
配置方式静态文件Docker 标签 / 动态
自动发现否(手动)是(Docker 提供者)
Let's Encrypt通过 certbot内置 ACME
仪表板否(第三方)内置
WebSocket手动配置自动
最适合静态配置、高流量动态 Docker 环境

第 2 步:Nginx — 基于路径的路由

server {
    listen 80;

    location /api/ {
        proxy_pass http://api:8000/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }

    location /app/ {
        proxy_pass http://webapp:3000/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }

    location / {
        root /usr/share/nginx/html;
        try_files $uri $uri/ /index.html;
    }
}

注意: proxy_pass 上的尾部 / 会去除 location 前缀。proxy_pass http://api:8000/; 配合 location /api/ 会将 /api/users 转发为 /users

第 3 步:Nginx — 基于主机的路由

server {
    listen 80;
    server_name api.example.com;

    location / {
        proxy_pass http://api:8000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

server {
    listen 80;
    server_name app.example.com;

    location / {
        proxy_pass http://webapp:3000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

第 4 步:Nginx — WebSocket 代理

WebSocket 需要升级头。对于 Shiny、Socket.IO 和实时重载至关重要:

location /ws/ {
    proxy_pass http://app:3000;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $host;
    proxy_read_timeout 86400;
}

专门针对 Shiny 应用:

map $http_upgrade $connection_upgrade {
    default upgrade;
    ''      close;
}

server {
    location / {
        proxy_pass http://shiny:3838;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
        proxy_set_header Host $host;
        proxy_read_timeout 86400;
        proxy_buffering off;
    }
}

预期结果: WebSocket 连接建立并保持。

失败处理: 检查是否设置了 proxy_http_version 1.1。验证 UpgradeConnection 头。

第 5 步:Traefik — Docker 标签自动发现

docker-compose.yml

services:
  traefik:
    image: traefik:v3.2
    command:
      - "--providers.docker=true"
      - "--providers.docker.exposedbydefault=false"
      - "--entrypoints.web.address=:80"
      - "--entrypoints.websecure.address=:443"
      - "[email protected]"
      - "--certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json"
      - "--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web"
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - letsencrypt:/letsencrypt

  api:
    image: myapi:latest
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.api.rule=Host(`api.example.com`)"
      - "traefik.http.routers.api.entrypoints=websecure"
      - "traefik.http.routers.api.tls.certresolver=letsencrypt"
      - "traefik.http.services.api.loadbalancer.server.port=8000"

  webapp:
    image: myapp:latest
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.webapp.rule=Host(`app.example.com`)"
      - "traefik.http.routers.webapp.entrypoints=websecure"
      - "traefik.http.routers.webapp.tls.certresolver=letsencrypt"
      - "traefik.http.services.webapp.loadbalancer.server.port=3000"

volumes:
  letsencrypt:

预期结果: Traefik 通过标签自动发现服务,自动配置 SSL 证书。

第 6 步:Traefik — 使用标签的基于路径路由

services:
  api:
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.api.rule=Host(`example.com`) && PathPrefix(`/api`)"
      - "traefik.http.routers.api.middlewares=strip-api"
      - "traefik.http.middlewares.strip-api.stripprefix.prefixes=/api"
      - "traefik.http.services.api.loadbalancer.server.port=8000"

第 7 步:Traefik — 速率限制和安全头

labels:
  - "traefik.http.middlewares.ratelimit.ratelimit.average=100"
  - "traefik.http.middlewares.ratelimit.ratelimit.burst=50"
  - "traefik.http.middlewares.security.headers.stsSeconds=63072000"
  - "traefik.http.middlewares.security.headers.contentTypeNosniff=true"
  - "traefik.http.middlewares.security.headers.frameDeny=true"
  - "traefik.http.routers.app.middlewares=ratelimit,security"

第 8 步:验证代理配置

# Nginx: test config
docker compose exec nginx nginx -t

# Check routing
curl -H "Host: api.example.com" http://localhost/health

# Check WebSocket (needs wscat: npm install -g wscat)
wscat -c ws://localhost/ws/

# Traefik dashboard (if enabled)
# http://localhost:8080/dashboard/

预期结果: 请求路由到正确的后端。WebSocket 升级成功。

验证清单

  • HTTP 请求根据路径或主机路由到正确的后端
  • WebSocket 连接建立并保持
  • SSL 终止正常工作(如已配置)
  • 后端服务接收到正确的 HostX-Real-IPX-Forwarded-For
  • Traefik 通过标签自动发现新服务(如使用 Traefik)
  • 配置在 docker compose restart 后依然有效

常见问题

  • 尾部斜杠不匹配proxy_pass http://app/http://app 在 Nginx 路径去除方面行为不同
  • WebSocket 超时:默认 proxy_read_timeout 为 60 秒。长连接的 WebSocket 需要设置为 86400(24小时)
  • Docker socket 安全:在 Traefik 中挂载 /var/run/docker.sock 给予其完整的 Docker 访问权限。使用 ro 挂载并考虑使用 socket 代理
  • DNS 解析:Nginx 在启动时解析上游。对于动态服务使用 resolver 127.0.0.11 来使用 Docker 内部 DNS
  • 缺少 proxy_buffering off:Shiny 和 SSE 端点需要 proxy_buffering off 以实现实时流式传输

相关技能

  • configure-nginx — 详细的 Nginx 配置,包含 SSL 和安全头
  • deploy-shinyproxy — 用于容器化 Shiny 应用托管的 ShinyProxy
  • setup-compose-stack — 使用反向代理的 compose 栈
  • configure-api-gateway — 使用 Kong 和 Traefik 的 API 网关模式

GitHub 仓库

pjt222/agent-almanac
路径: i18n/zh-CN/skills/configure-reverse-proxy
0
agentsagentskillsai-assisted-developmentclaude-codeskillsteams

相关推荐技能

railway-docs

文档

Railway Docs Skill可实时获取最新的Railway官方文档,确保回答的准确性。当开发者询问Railway功能特性、工作原理或分享docs.railway.com链接时,应优先使用此技能。它通过专门的LLM优化文档源提供最新信息,避免依赖过时记忆来回答技术问题。

查看技能

n8n-code-python

文档

该Skill为在n8n平台的Python代码节点中编写代码提供专家指导,特别适用于需要使用_input/_json/_node语法、Python标准库或了解n8n中Python限制的场景。它强调JavaScript应作为首选方案,仅当需要特定Python功能或对Python语法更熟悉时才使用Python。Skill提供了快速入门模板和关键注意事项,帮助开发者在n8n中高效编写Python代码。

查看技能

archon

文档

Archon Skill为开发者提供了基于RAG的语义搜索和项目任务管理功能,可通过REST API访问知识库。它支持文档搜索、网站爬取、文件上传和版本控制,适用于技术文档查询和项目管理场景。首次使用时需要配置Archon主机地址,建议在处理外部文档时优先使用该Skill。

查看技能

n8n-code-javascript

文档

这个Skill为n8n工作流中的JavaScript代码节点提供专业指导,涵盖数据处理、HTTP请求和日期操作等核心场景。它详细解释了如何正确使用n8n特有的`$input`/`$json`语法、`$helpers`工具以及DateTime对象,并包含关键的错误排查和模式选择建议。开发者通过该Skill能快速掌握Code节点的正确返回格式、数据访问方法和常见陷阱解决方案。

查看技能