FastCGI: 30 years old and still the better protocol for reverse proxies
FastCGI vs HTTP for Reverse Proxying
- Many agree FastCGI is technically safer and simpler than HTTP as a backend protocol: clearer framing, separation between client headers and server-set parameters, and fewer parsing footguns.
- HTTP “won” historically due to ubiquity and simplicity: one protocol everywhere, easier multi-layer proxy topologies, same app server for dev and prod, and strong nginx support.
- Using HTTP between reverse proxies and backends is seen by some as a “worse is better” story: not ideal technically, but good enough and broadly supported.
Security, Headers, and Design Principles
- FastCGI lets the web server control which parameters are trusted; headers from the client are clearly separated (e.g., via
HTTP_-prefixed vars). - HTTP backends are vulnerable to untrusted or conflicting headers (
X-Forwarded-For,X-Real-IP, CDN-specific headers, etc.), and cross-proxy parsing/desync problems. - One camp favors end-to-end HTTP for flexibility; another argues for least-privilege and strict allowlisting at the proxy, even if that’s operationally less convenient.
- Suggestions include stripping all unknown headers at the proxy or using standardized headers like
Forwarded, though adoption is uneven.
Developer Experience and Deployment Patterns
- Embedded HTTP servers in apps are popular for simplicity, but many libraries explicitly warn they’re not production-safe; this pushes people back to reverse proxies.
- Some dislike having separate modes (HTTP for dev, FastCGI for prod) due to divergence between environments.
- Others argue that if production uses a proxy, dev should too, to stay realistic.
Alternatives and Variants
- uWSGI is praised as a compact, feature-rich binary protocol (autoscaling, websockets, chrooting), but seen as underused and somewhat in decline.
- Custom protocols like Web Application Socket (WAS) are presented as FastCGI-like but more efficient (control socket + pipes, cancellable requests).
- CGI is revisited as “good enough” for small, “person-scale” workloads, though its env-var header model has known security issues (e.g., httpoxy).
Limitations & Practical Concerns
- FastCGI lacks native WebSocket support; SSE and streaming HTTP can cover some use cases.
- Some note FastCGI’s CGI heritage introduces quirks (e.g., lossy handling of certain URL/path encodings).
- Operationally, autoscaling FastCGI workers can cause memory surprises; fixed worker counts are preferred by some.