Reverse Proxy
pyserve can act as a reverse proxy, forwarding requests to backend services.
Basic Proxy Configuration
Use the proxy_pass directive in routing:
extensions: - type: routing config: regex_locations: "~^/api/": proxy_pass: "http://localhost:9001"
All requests to /api/* will be forwarded to http://localhost:9001/api/*.
Proxy Headers
pyserve automatically adds standard proxy headers:
X-Forwarded-For |
Client's IP address |
X-Forwarded-Proto |
Original protocol (http/https) |
X-Forwarded-Host |
Original Host header |
X-Real-IP |
Client's real IP address |
Custom Headers
Add custom headers to proxied requests:
"~^/api/": proxy_pass: "http://localhost:9001" headers: - "X-Custom-Header: my-value" - "Authorization: Bearer token123"
Dynamic Headers with Captures
Use regex capture groups to build dynamic headers:
"~^/api/v(?P<version>\\d+)/(?P<service>\\w+)": proxy_pass: "http://localhost:9001" headers: - "X-API-Version: {version}" - "X-Service: {service}" - "X-Client-IP: $remote_addr"
Special variables:
{capture_name}— Named capture group from regex$remote_addr— Client's IP address
Proxy Timeout
Configure timeout for proxy requests:
# Global default timeout server: proxy_timeout: 30.0 # Per-route timeout extensions: - type: routing config: regex_locations: "~^/api/slow": proxy_pass: "http://localhost:9001" timeout: 120 # 2 minutes for slow endpoints
URL Rewriting
The proxy preserves the original request path by default:
# Request: GET /api/users/123 # Proxied: GET http://backend:9001/api/users/123 "~^/api/": proxy_pass: "http://backend:9001"
To proxy to a specific path:
# Request: GET /api/users/123 # Proxied: GET http://backend:9001/v2/users/123 (path preserved) "~^/api/": proxy_pass: "http://backend:9001/v2"
Load Balancing Example
Route different services to different backends:
extensions: - type: routing config: regex_locations: "~^/api/users": proxy_pass: "http://user-service:8001" "~^/api/orders": proxy_pass: "http://order-service:8002" "~^/api/products": proxy_pass: "http://product-service:8003"
Error Handling
pyserve returns appropriate error codes for proxy failures:
502 Bad Gateway |
Backend connection failed or returned invalid response |
504 Gateway Timeout |
Backend did not respond within timeout |
Note: pyserve uses
httpx for async HTTP requests
to backend services, supporting HTTP/1.1 and HTTP/2.