What is the difference between proxy_pass and fastcgi_pass in Nginx?
Understand the difference between proxy_pass and fastcgi_pass in Nginx: HTTP proxying versus the FastCGI protocol for PHP-FPM, with config examples.
Expected Interview Answer
`proxy_pass` forwards requests to an upstream server over HTTP, while `fastcgi_pass` forwards them over the FastCGI protocol to a FastCGI process such as PHP-FPM. In short, `proxy_pass` talks HTTP to another web server, and `fastcgi_pass` talks FastCGI directly to an application interpreter.
With `proxy_pass`, Nginx acts as a reverse proxy or load balancer in front of another HTTP server (Node.js, another Nginx, a container), so the upstream must speak HTTP. With `fastcgi_pass`, Nginx communicates using the binary FastCGI protocol and must supply CGI-style parameters via `fastcgi_param` (like `SCRIPT_FILENAME`), typically using the bundled `fastcgi_params` file. FastCGI avoids the overhead of a full HTTP layer between Nginx and the interpreter, which is why PHP is usually served through `fastcgi_pass` to PHP-FPM rather than a proxied HTTP server.
- proxy_pass integrates any HTTP-speaking backend
- fastcgi_pass connects directly to interpreters like PHP-FPM
- FastCGI avoids extra HTTP parsing overhead
- Both support Unix sockets or TCP upstreams
- Clear separation matches the backend's native protocol
AI Mentor Explanation
Think of two ways to relay a captain's instructions to the dressing room. `proxy_pass` is like radioing another coaching booth that already speaks the full match commentary language (HTTP) and relays it onward. `fastcgi_pass` is like using the team's private hand-signal code straight to the players — a leaner, purpose-built channel (FastCGI) that skips the full commentary format and speaks directly to those who execute the play.
Step-by-Step Explanation
Step 1
Identify the backend type
Determine whether the upstream speaks HTTP (a web app/server) or FastCGI (an interpreter like PHP-FPM).
Step 2
Choose the directive
Use `proxy_pass` for HTTP backends and `fastcgi_pass` for FastCGI processes.
Step 3
Set the upstream address
Provide a TCP host:port or a Unix socket for either directive.
Step 4
Supply required parameters
For FastCGI, include `fastcgi_params` and set `SCRIPT_FILENAME`; for proxy, set headers like `Host` and `X-Forwarded-For`.
Step 5
Test and reload
Run `nginx -t` and reload, then verify the response from the correct backend.
What Interviewer Expects
- Knowing proxy_pass uses HTTP and fastcgi_pass uses the FastCGI protocol
- That PHP is typically served via fastcgi_pass to PHP-FPM
- Awareness of required fastcgi_param directives like SCRIPT_FILENAME
- Understanding both support TCP and Unix sockets
- Why FastCGI reduces overhead versus proxying HTTP
Common Mistakes
- Using proxy_pass to reach PHP-FPM, which does not speak HTTP
- Forgetting to include fastcgi_params or SCRIPT_FILENAME
- Assuming both directives use the same protocol
- Not setting proxy headers, breaking Host or client IP forwarding
- Mixing up the socket path and TCP address formats
Best Answer (HR Friendly)
“Both directives tell Nginx where to send a request, but they use different languages. proxy_pass forwards to another web server that understands normal web traffic, while fastcgi_pass talks directly to an application engine like PHP using a leaner, specialized protocol.”
Code Example
location /api/ {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}location ~ \.php$ {
include fastcgi_params;
fastcgi_pass unix:/run/php/php-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}Follow-up Questions
- Why is PHP typically served with fastcgi_pass instead of proxy_pass?
- What does the SCRIPT_FILENAME parameter do?
- Can you use a Unix socket with proxy_pass?
- How do you load balance across multiple upstreams with proxy_pass?
- What is the role of the fastcgi_params file?
MCQ Practice
1. Which directive should serve requests to a PHP-FPM process?
PHP-FPM speaks the FastCGI protocol, so `fastcgi_pass` is the correct directive.
2. What protocol does proxy_pass use to reach the upstream?
`proxy_pass` forwards requests over HTTP to an upstream that must speak HTTP.
3. Which parameter is essential when using fastcgi_pass for PHP?
`SCRIPT_FILENAME` tells the FastCGI interpreter which script file to execute.
Flash Cards
proxy_pass protocol? — HTTP — forwards to any HTTP-speaking upstream server.
fastcgi_pass protocol? — FastCGI — talks directly to interpreters like PHP-FPM.
Why not proxy_pass to PHP-FPM? — PHP-FPM speaks FastCGI, not HTTP, so proxy_pass cannot communicate with it.
Key FastCGI parameter? — SCRIPT_FILENAME, which points to the script the interpreter runs.