Web application áá áşááŻááᯠáááşááąáŹááşáá˛áˇáĄá፠server áá áşááŻáááşá¸ááᯠáĄááşááŹáááşáá˛áˇ áááŻááşáááŻááşááťáááşáááşááŹáᏠááŻáśááźáŻáśááąá¸áĄáá á á˝ááşá¸ááąáŹááşáááşáĄá áĄááźá˛áááşá¸ááąáŹááşá¸áá˝ááşáá˛áˇ áááşá¸áááşá¸áááŻááşááŤáá°á¸á áĽáááŹáĄáŹá¸ááźááˇáşá áááˇáşáá˛áˇ Node.js, Python, ááŤáážáááŻááş Apache server áá˝áąááᯠáĄááşááŹáááşáá˛áˇ áááŻááşáááŻááşáááá˝áąáˇá áąááŹáᏠáĄáášáááŹááşáážááááŻááşáááᯠtraffic ááťáŹá¸ááŹáá˛áˇáĄááŤáážáŹáááşá¸ server ááąá¸ááśááŹááťááŻá¸ ááźá áşáááŻááşááŤáááşá
ááŽáááŻááźáżááŹáá˝áąááᯠááźáąáážááşá¸áááŻáˇáĄáá˝ááş Reverse Proxy ááᯠáĄááŻáśá¸ááźáŻááźááŤáááşá ááŽááąáˇáážáŹááąáŹáˇ áĄááşááŹáááşáážáŹ áĄááŻáśá¸áĄááťáŹá¸ááŻáśá¸ reverse proxy áá áşááŻááźá áşáá˛áˇ Nginx áĄááźáąáŹááşá¸ááᯠáĽááᏠconfiguration áá˝áąáá˛áˇááá˝ áĄááąá¸á áááş ááąáˇááŹáá˝áŹá¸ááŤáááşá
Reverse Proxy áááŻáᏠááŹáá˛á
Reverse Proxy áááŻáᏠáááˇáşáá˛áˇ web servers (backend servers) áá˝áąáážáąáˇáážáŹ áááŻááşááąáá˛áˇ server áá áşááŻááźá áşááźáŽá¸á áááşááŹáá˛áˇ request áá˝áąáĄáŹá¸ááŻáśá¸ááᯠááźáŹá¸ááźááşáááşá¸áá°áᏠáááŻáĄááşáá˛áˇ backend server ááŽááᯠáááşá¸áá˝ážááşáááŻáˇááąáŹááşááąá¸ááŤáááşá
áááŻá¸áážááşá¸áá˛áˇ áĽáááŹáá áşááŻáá˛áˇ ááźáąáŹááááşá ááŻáášáááŽáá áşááŻáá˛áˇ áĄá ááşá¸áĄááąá¸áááşá¸áááᯠááŹáá˛áˇá§ááˇáşáááş (client) áᏠáááşá¸ááá˛áážáŹáážááá˛áˇ áááşáááşá¸áá áşáŚá¸ááťááşá¸á Ꭰ(backend server) áá˛áˇ áááŻááşáááŻááşááá˝áąáˇááŤáá°á¸á áá°áááŻáˇáᏠá§ááˇáşááś (receptionist) áá˛áˇ áĄáááşáá˝áąáˇááźáŽá¸ áááşáááşáááşá¸áá˛áˇ áá˝áąáˇááťááşáááşáááŻááŹááᯠááźáąáŹáááŤáááşá á§ááˇáşááśáááž áĄá˛ááŽáááşáááşá¸ááᯠáááşá¸áá˝ážááşááąá¸ááŤáááşá ááŽáĽáááŹáážáŹ á§ááˇáşááś (receptionist) áᏠReverse Proxy áá˛áˇ áĄááŹá¸ááášááŹááşáá°ááŤáááşá
Nginx ááᯠReverse Proxy áĄááźá áş ááŹááźáąáŹááˇáş ááŻáśá¸áááˇáşááŹáá˛á
- ááŻáśááźáŻáśááąá¸ááᯠááźážááˇáşáááşááąá¸ááźááşá¸ (Enhanced Security): Nginx áᏠáááˇáşáá˛áˇ backend server áá˝áąáá˛áˇ IP address áá˝áąáá˛áˇ identities áá˝áąááᯠááŻáśá¸áá˝ááşááąá¸ááŤáááşá ááŤááźáąáŹááˇáş áááŻááşáááŻááşáá°áá˝áąáᏠáááˇáşáá˛áˇ ááąáŹááşáá˝ááşá server áá˝áąááᯠáááŻááşáááŻááş access ááŻááşáááŻáˇááááŤáá°á¸á
- Load Balancing: Nginx áᏠáááşááŹáá˛áˇ traffic áá˝áąááᯠbackend servers ááťáŹá¸á á˝áŹááŽááᯠááťážáá á˝áŹ ááźááˇáşááąááąá¸áááŻááşááŤáááşá ááŤáᏠserver áá áşááŻáááşá¸ááᯠáĄááŻááşáá˝áą ááŻáśááťáááŹáĄáąáŹááş ááŹáá˝ááşááąá¸ááźáŽá¸ á á˝ááşá¸ááąáŹááşáááşááᯠááźážááˇáşáááşááąá¸ááŤáááşá
- SSL/TLS Termination: Nginx áᏠSSL certificate áá˝áąááᯠáááŻááşáá˝ááşáááŻááşááŤáááşá ááŤáᏠtraffic encryption/decryption ááŻááşáááşá¸á ááşááᯠNginx á ááŻááşááąáŹááşááąá¸ááŹááźáąáŹááˇáş backend servers áá˝áąáá˛áˇ CPU load ááᯠáááşááŹá áąááŤáááşá
- Caching: Nginx á frequently-accessed static content (ááŻáśáá˝áąá CSS áááŻááşáá˝áą) ááᯠcache ááŻááşáááŻááşááŹááźáąáŹááˇáş client request áá˝áąááᯠáááŻáááŻááźááşáááşá á˝áŹ ááŻáśáˇááźááşáááŻááşááŤáááşá
- áá áşááŻáááşá¸ááąáŹ Entry Point: áááˇáşáážáŹ server áá˝áą áĄááťáŹá¸ááźáŽá¸áážáááąáááşááąáŹááş Nginx áááąááááˇáş domain áá áşááŻáááşá¸áááŻáᏠááŻáśá¸ááźáŽá¸áááşáááŻááşáĄáąáŹááş ááŻááşááąá¸áááŻááşááŤáááşá
Nginx Reverse Proxy Configuration áĽáááŹááťáŹá¸
áĄáąáŹááşá፠configuration áĽáááŹáá˝áąáᏠ/etc/nginx/nginx.conf ááŤáážáááŻááş /etc/nginx/sites-available/ áážáŹáážááá˛áˇ ááŽá¸ááźáŹá¸ site configuration áááŻááşáá˛áážáŹ ááŤáááşáááŻááşááŤáááşá
áĽááᏠá- áĄááźáąááś Reverse Proxy (Single Server)
áᎠconfiguration á client request áá˝áąáĄáŹá¸ááŻáśá¸ááᯠbackend áážáŹáážááá˛áˇ server áá áşáᯠ(áĽáááŹ- port 3000 áážáŹ run ááąáá˛áˇ Node.js app) ááŽááᯠáááşá¸áá˝ážááşááąá¸ááŤááááˇáşáááşá
# Nginx basic reverse proxy configuration
# Nginx áĄááźáąááś reverse proxy configuration
server {
listen 80; # Listen for incoming HTTP traffic on port 80
server_name mywebsite.com www.mywebsite.com; # Specify your domain name
location / {
# Forward all requests to the backend server
# áááşááŹááąáŹ request áĄáŹá¸ááŻáśá¸ááᯠbackend server ááŽáááŻáˇ áááşá¸áá˝ážááşááŤá
proxy_pass http://localhost:3000;
# Pass the original host and IP to the backend
# áá°áááşá¸ host áážááˇáş IP ááťáŹá¸ááᯠbackend áááŻáˇ áááŻáˇááŤá
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
áĽááᏠá- Load Balancing
áááˇáşáážáŹ backend servers áá˝áą áĄááťáŹá¸ááźáŽá¸áážááááş Nginx áááą traffic ááᯠááťážáá
á˝áŹ ááźááˇáşááąááąá¸áááŻááşááŤáááşá ááŽáĽáááŹáážáŹ backend servers ááŻáśá¸ááŻááᯠbackend_servers áááŻáá˛áˇ group áá
áşááŻáĄááźá
áş áááşáážááşááźáŽá¸ proxy_pass ááᯠáĄá˛áᎠgroup ááŽááᯠáááşá¸áá˝ážááşááąá¸ááŹá¸ááŤáááşá
# Nginx load balancing configuration
# Nginx load balancing configuration
upstream backend_servers {
# Define a group of backend servers
# backend servers ááťáŹá¸ááᯠgroup áá
áşááŻáĄááźá
áş áááşáážááşááŤá
server 192.168.1.10:8000;
server 192.168.1.11:8000;
server 192.168.1.12:8000;
}
server {
listen 80;
server_name mywebsite.com;
location / {
# Pass requests to the upstream group
# Request ááťáŹá¸ááᯠupstream group ááŽáááŻáˇ áááŻáˇááŤá
proxy_pass http://backend_servers;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
áĽááᏠá- SSL/TLS Termination
áᎠconfiguration áááąáŹáˇ Nginx ááᯠSSL Certificate áá˝áąáá˛áˇ configure ááŻááşááźáŽá¸ HTTP request áá˝áąááᯠHTTPS áĄááźá áş auto-redirect ááŻááşááąá¸ááŤááááˇáşáááşá Nginx á HTTPS traffic (port 443) ááᯠáááşááśááźáŽá¸á encryption ááŻááşáááşá¸á ááşááᯠááźááşáááşá¸ááźáŽá¸áá˛áˇáĄá፠HTTP (port 3000) áĄááźá áş backend server ááŽááᯠááźááşáááŻáˇááąá¸ááŤáááşá
# Nginx SSL/TLS termination configuration
# Nginx SSL/TLS termination configuration
server {
listen 80; # Listen for HTTP traffic
server_name mywebsite.com;
# Redirect all HTTP requests to HTTPS
# HTTP request áĄáŹá¸ááŻáśá¸ááᯠHTTPS áááŻáˇ redirect ááŻááşááŤá
return 301 https://$host$request_uri;
}
server {
listen 443 ssl; # Listen for HTTPS traffic
server_name mywebsite.com;
# SSL certificate paths
# SSL certificate áááşá¸ááźáąáŹááşá¸ááťáŹá¸
ssl_certificate /etc/nginx/ssl/mywebsite.crt;
ssl_certificate_key /etc/nginx/ssl/mywebsite.key;
location / {
# Forward the decrypted traffic to the backend server
# Decrypted ááŻááşááźáŽá¸ááŹá¸ traffic ááᯠbackend server áááŻáˇ áááŻáˇááŤá
proxy_pass http://localhost:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
ááááŻáśá¸
Nginx ááᯠreverse proxy áĄááźá áş áĄááŻáśá¸ááźáŻááźááşá¸áᏠáááˇáşáá˛áˇ application áá˝áąááᯠáááŻáááŻááŻáśááźáŻáśá ááźááşáááşááźáŽá¸ á áááşááťááĄáąáŹááş áá°ááŽááąá¸áááŻááşááŤáááşá ááŤáᏠbackend server áá˝áąááᯠdirect exposure áááą ááŹáá˝ááşááąá¸ááŻáśááŹáá Load Balancing áá˛áˇ SSL Termination áááŻááťááŻá¸ áĄááąá¸ááźáŽá¸áá˛áˇ ááŻááşáááşá¸ááąáŹááşááŹáá˝áąáááŻá፠ááŻááşááąáŹááşááąá¸ááŹááźáąáŹááˇáş ááąááşááŽáá˛áˇ web architecture áá˝áąáĄáá˝ááş ááážááááźá áşáááŻáĄááşáá˛áˇ áĄá áááşáĄáááŻááşá¸áá áşááŻááźá áşááŤáááşá
áᎠconfiguration áĽáááŹáá˝áąááᯠáááˇáşáááŻááşáááŻááş project áážáŹ á áááşá ááşá¸áááşááźááˇáşááźáŽá¸ Nginx reverse proxy áá˛áˇ á á˝ááşá¸ááąáŹááşáááşáá˝áąááᯠáááşáá˝áąáˇááąáˇááŹáááŻááşááŤáááşá
English Version
The Internet’s Gatekeeper: A Deep Dive into Nginx Reverse Proxy with Examples
When building a web application, exposing a single server directly to the internet is often not the best practice, either for security or performance. For example, letting your Node.js, Python, or Apache server be directly accessible can be risky and may cause the server to slow down under heavy traffic.
To solve these problems, we use a Reverse Proxy. In this post, we’ll take a deep dive into Nginx, one of the most popular reverse proxies on the internet, and explore its configurations with practical examples.
What is a Reverse Proxy?
A reverse proxy is a server that sits in front of one or more web servers (backend servers). It intercepts all client requests and forwards them to the appropriate backend server, routing the response back to the client.
A simple analogy is a company’s front desk. A client (the visitor) doesn’t directly talk to a specific employee (the backend server) in the building. They first talk to the receptionist (the reverse proxy), who knows where to direct them.
Why Use Nginx as a Reverse Proxy?
- Enhanced Security: Nginx hides the IP addresses and identities of your backend servers, making them less vulnerable to direct attacks.
- Load Balancing: Nginx can distribute incoming traffic across multiple backend servers, preventing any single server from becoming overwhelmed and improving overall performance.
- SSL/TLS Termination: Nginx can handle the encryption and decryption of traffic, offloading this CPU-intensive task from your backend servers and allowing them to focus on serving your application.
- Caching: Nginx can cache frequently-accessed static content (images, CSS files), which significantly speeds up response times for subsequent requests.
- Single Entry Point: It provides a single point of entry for your application, simplifying domain management even if you have multiple backend services.
Nginx Reverse Proxy Configuration Examples
The following configuration examples can be included in your nginx.conf file or a separate site configuration file inside /etc/nginx/sites-available/.
Example 1: Basic Reverse Proxy (Single Server)
This configuration will forward all client requests to a single backend server (e.g., a Node.js app running on port 3000).
Nginx
# Nginx basic reverse proxy configuration
# Nginx áĄááźáąááś reverse proxy configuration
server {
listen 80; # Listen for incoming HTTP traffic on port 80
server_name mywebsite.com www.mywebsite.com; # Specify your domain name
location / {
# Forward all requests to the backend server
# áááşááŹááąáŹ request áĄáŹá¸ááŻáśá¸ááᯠbackend server ááŽáááŻáˇ áááşá¸áá˝ážááşááŤá
proxy_pass http://localhost:3000;
# Pass the original host and IP to the backend
# áá°áááşá¸ host áážááˇáş IP ááťáŹá¸ááᯠbackend áááŻáˇ áááŻáˇááŤá
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
Example 2: Load Balancing
If you have multiple backend servers, Nginx can distribute traffic evenly among them. In this example, we define a group of three backend servers in an upstream block and use proxy_pass to route traffic to this group.
Nginx
# Nginx load balancing configuration
# Nginx load balancing configuration
upstream backend_servers {
# Define a group of backend servers
# backend servers ááťáŹá¸ááᯠgroup áá
áşááŻáĄááźá
áş áááşáážááşááŤá
server 192.168.1.10:8000;
server 192.168.1.11:8000;
server 192.168.1.12:8000;
}
server {
listen 80;
server_name mywebsite.com;
location / {
# Pass requests to the upstream group
# Request ááťáŹá¸ááᯠupstream group ááŽáááŻáˇ áááŻáˇááŤá
proxy_pass http://backend_servers;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
Example 3: SSL/TLS Termination
This configuration shows how to set up Nginx to handle SSL certificates. It will listen on port 443 for HTTPS traffic, decrypt it, and then forward the unencrypted traffic to your backend server (e.g., on port 3000).
Nginx
# Nginx SSL/TLS termination configuration
# Nginx SSL/TLS termination configuration
server {
listen 80; # Listen for HTTP traffic
server_name mywebsite.com;
# Redirect all HTTP requests to HTTPS
# HTTP request áĄáŹá¸ááŻáśá¸ááᯠHTTPS áááŻáˇ redirect ááŻááşááŤá
return 301 https://$host$request_uri;
}
server {
listen 443 ssl; # Listen for HTTPS traffic
server_name mywebsite.com;
# SSL certificate paths
# SSL certificate áááşá¸ááźáąáŹááşá¸ááťáŹá¸
ssl_certificate /etc/nginx/ssl/mywebsite.crt;
ssl_certificate_key /etc/nginx/ssl/mywebsite.key;
location / {
# Forward the decrypted traffic to the backend server
# Decrypted ááŻááşááźáŽá¸ááŹá¸ traffic ááᯠbackend server áááŻáˇ áááŻáˇááŤá
proxy_pass http://localhost:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
Conclusion
Using Nginx as a reverse proxy helps make your applications more secure, faster, and more reliable. It protects your backend servers from direct exposure and provides essential services like Load Balancing and SSL Termination, making it a crucial component of modern web architecture.
