An API gateway centralizes cross-cutting concerns (authentication, rate limiting, routing) for multiple backend services — this guide covers implementing this pattern using Nginx, achievable without a dedicated commercial API gateway product.
What an API Gateway Provides
Rather than every backend service independently implementing authentication, rate limiting, and request logging, an API gateway sits in front of all your services, handling these cross-cutting concerns centrally — individual backend services can then focus purely on their specific business logic.
Basic Routing Pattern with Nginx
location /api/users/ {
proxy_pass http://user-service:3001/;
}
location /api/orders/ {
proxy_pass http://order-service:3002/;
}
location /api/products/ {
proxy_pass http://product-service:3003/;
}
A single public-facing entry point routing to different internal backend services based on path — clients interact with one consistent API surface, unaware of your actual internal service topology.
Centralizing Authentication at the Gateway
location /api/ {
auth_request /validate-token;
proxy_pass http://backend;
}
location = /validate-token {
internal;
proxy_pass http://auth-service/validate;
}
See How to Set Up API Authentication with JWT for the underlying token validation — centralizing this at the gateway means individual backend services don't each need to independently implement authentication logic.
Centralizing Rate Limiting
limit_req_zone $binary_remote_addr zone=api_limit:10m rate=10r/s;
location /api/ {
limit_req zone=api_limit burst=20;
proxy_pass http://backend;
}
See How to Rate Limit an API with Nginx — applying rate limiting at the gateway layer provides consistent protection across all backend services without each needing individual rate limiting implementation.
Centralizing Request Logging
log_format api_log '$remote_addr - $request - $status - $request_time';
access_log /var/log/nginx/api_access.log api_log;
A single, consistent logging point for all API traffic simplifies observability compared to aggregating inconsistent logs from many independently-implemented services.
Handling CORS Centrally
add_header Access-Control-Allow-Origin "https://yourdomain.com";
add_header Access-Control-Allow-Methods "GET, POST, PUT, DELETE";
Centralized CORS configuration avoids inconsistent policy across different backend services, ensuring a coherent policy for browser-based API consumers.
Response Transformation/Aggregation (More Advanced Pattern)
Beyond simple routing, a gateway can aggregate responses from multiple backend calls into a single client-facing response, or transform response formats — more complex to implement with plain Nginx; consider a dedicated application-level gateway layer (a lightweight Node.js/Express service, for example) if you need this level of sophistication.
When a Dedicated API Gateway Product Makes Sense
For simpler routing/auth/rate-limiting needs, Nginx-based patterns are often perfectly sufficient and avoid additional infrastructure complexity — consider a dedicated API gateway product if you need more sophisticated features (complex request transformation, built-in API analytics, plugin ecosystems) beyond what a reverse-proxy-based approach conveniently provides.
Common Errors
Gateway becomes a single point of failure — ensure your gateway layer itself has appropriate redundancy/monitoring, since it's now sitting in front of every backend service; a gateway outage affects all services behind it, not just one.
Continue Reading
- How to Rate Limit an API with Nginx
- How to Set Up API Authentication with JWT
- How to Set Up Basic Load Balancing with Nginx
Browse more articles in Object Storage, Messaging & APIs.