configure-reverse-proxy
关于
This skill configures reverse proxy setups using Nginx, Traefik, and ShinyProxy for routing multiple services through a single entry point. It handles key tasks like WebSocket proxying, path/host-based routing, SSL termination, and Docker label auto-discovery. Use it when you need to expose backend services, proxy real-time connections, or add TLS to services without native SSL support.
快速安装
Claude Code
推荐npx skills add pjt222/agent-almanac -a claude-code/plugin add https://github.com/pjt222/agent-almanacgit 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 端點
步驟
步驟一:擇代理工具
| Feature | Nginx | Traefik |
|---|---|---|
| Configuration | Static files | Docker labels / dynamic |
| Auto-discovery | No (manual) | Yes (Docker provider) |
| Let's Encrypt | Via certbot | Built-in ACME |
| Dashboard | No (3rd party) | Built-in |
| WebSocket | Manual config | Automatic |
| Best for | Static config, high traffic | Dynamic Docker environments |
步驟二: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 尾 / 剝位置前綴。proxy_pass http://api:8000/; 配 location /api/ 將 /api/users 轉為 /users。
步驟三: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;
}
}
步驟四: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 已設。驗 Upgrade 與 Connection 頭。
步驟五: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 憑證供給。
步驟六: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"
步驟七: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"
步驟八:驗代理配置
# 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 終結運(若已配)
- 後端服務收正確之
Host、X-Real-IP、X-Forwarded-For頭 - Traefik 經標籤自動發現新服務(若用 Traefik)
- 配置於
docker compose restart後仍存
常見陷阱
- 尾斜線不符:
proxy_pass http://app/vshttp://app於 Nginx 中路徑剝之行為不同 - WebSocket 超時:預
proxy_read_timeout為 60s。長駐 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- 含 SSL 與安全頭之詳細 Nginx 配置deploy-shinyproxy- 容器化 Shiny 應用之 ShinyProxy 主機setup-compose-stack- 用反向代理之 compose 棧configure-api-gateway- 含 Kong 與 Traefik 之 API 閘道模式
GitHub 仓库
相关推荐技能
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节点的正确返回格式、数据访问方法和常见陷阱解决方案。
