/rɪˈvɜrs ˈprɒksi/

noun — “the invisible middleman that shields and routes your web traffic.”

Reverse Proxy is a server that sits between clients (like web browsers) and one or more backend servers, handling requests on behalf of the backend and often performing tasks such as load balancing, caching, SSL termination, and security filtering. Unlike a traditional forward proxy, which hides the client from the server, a reverse proxy hides the server from the client, presenting a single unified endpoint for multiple services.

Reverse proxies are commonly used to improve performance, enhance security, and simplify architecture. For example, Nginx or Apache can act as a reverse proxy in front of web applications running on PHP, Python, Node.js, or Java servers. When a request arrives, the reverse proxy decides which backend server should handle it, optionally caches the response, applies compression, or enforces HTTPS. This allows multiple backend servers to operate behind a single public-facing interface, distributing load efficiently and preventing direct access to sensitive servers.

Historically, reverse proxies became essential as web applications grew in complexity and traffic volume. Early deployments used them to scale static websites across multiple servers, while modern implementations support sophisticated routing rules, content rewriting, and integration with CDNs (Content Delivery Networks). They also serve as a first line of defense against attacks, blocking malicious requests before they reach the backend servers.

In practice, a Reverse Proxy might include:

// Example 1: Nginx reverse proxy to PHP-FPM backend
server {
    listen 80;
    server_name app.example.com;
    location / {
        proxy_pass http://127.0.0.1:9000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

// Example 2: load balancing between multiple backend servers
upstream backend {
    server 192.168.1.10;
    server 192.168.1.11;
}
server {
    listen 80;
    server_name api.example.com;
    location / {
        proxy_pass http://backend;
    }
}

// Example 3: caching static responses
location /images/ {
    proxy_cache my_cache;
    proxy_pass http://backend;
}

Conceptually, think of a Reverse Proxy as a sophisticated concierge. It greets incoming requests, determines which internal “room” (backend server) should handle each one, ensures security, and may even speed things up with cached responses. To the client, the proxy is the service—it never sees the individual backend servers directly.

See Web Server, Server Environment, Nginx, Apache, PHP-FPM