Jump into concepts and practice - no test required
or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Setting Proxy Headers in Nginx
📖 Scenario: You are configuring an Nginx server to act as a reverse proxy for a backend application. To ensure the backend receives important client information, you need to set specific proxy headers.
🎯 Goal: Learn how to add proxy headers in an Nginx configuration to forward client IP and host information to the backend server.
📋 What You'll Learn
Create a basic Nginx server block listening on port 80
Add a proxy_pass directive to forward requests to http://localhost:3000
Add proxy_set_header directives for Host and X-Real-IP
Print the final Nginx configuration block
💡 Why This Matters
🌍 Real World
Nginx is often used as a reverse proxy to forward requests to backend servers. Setting proxy headers ensures the backend knows the original client details.
💼 Career
Understanding proxy headers is essential for DevOps roles managing web servers and load balancers to maintain accurate client information and logging.
Progress0 / 4 steps
1
Create basic Nginx server block
Create an Nginx server block that listens on port 80 and proxies requests to http://localhost:3000. Use location / with proxy_pass http://localhost:3000; inside.
Nginx
Hint
Use proxy_pass http://localhost:3000; inside the location / block.
2
Add proxy header for Host
Inside the location / block, add a line to set the proxy header Host to the original host using proxy_set_header Host $host;.
Nginx
Hint
Use proxy_set_header Host $host; to forward the original host header.
3
Add proxy header for client IP
Add another line inside the location / block to set the proxy header X-Real-IP to the client IP using proxy_set_header X-Real-IP $remote_addr;.
Nginx
Hint
Use proxy_set_header X-Real-IP $remote_addr; to forward the client IP address.
4
Print the final Nginx configuration
Print the entire Nginx server block configuration exactly as written, including the listen, proxy_pass, and both proxy_set_header lines.
Nginx
Hint
Use a print statement to display the full configuration exactly as shown.
Practice
(1/5)
1. What is the main purpose of setting proxy headers like X-Real-IP in an nginx configuration?
easy
A. To encrypt the data between nginx and the client
B. To cache the client's request on nginx
C. To pass the original client's IP address to the backend server
D. To block unwanted IP addresses from accessing the server
Solution
Step 1: Understand proxy headers role
Proxy headers like X-Real-IP carry client info through nginx to backend servers.
Step 2: Identify the purpose of X-Real-IP
This header specifically passes the original client's IP address to the backend for logging or processing.
Final Answer:
To pass the original client's IP address to the backend server -> Option C
Quick Check:
Proxy headers pass client info = B [OK]
Hint: Remember: X-Real-IP shows client's real IP to backend [OK]
Common Mistakes:
Confusing proxy headers with encryption settings
Thinking proxy headers cache requests
Assuming proxy headers block IPs
2. Which of the following is the correct nginx directive to set the X-Forwarded-Proto header to the client's protocol?
easy
A. proxy_set_header X-Forwarded-Proto $scheme;
B. set_header X-Forwarded-Proto $protocol;
C. proxy_header X-Forwarded-Proto $scheme;
D. header_set X-Forwarded-Proto $protocol;
Solution
Step 1: Recall nginx syntax for proxy headers
The correct directive to set headers in nginx proxy is proxy_set_header.
Step 2: Match variable for client protocol
The variable $scheme holds the client's protocol (http or https).
Final Answer:
proxy_set_header X-Forwarded-Proto $scheme; -> Option A
Quick Check:
proxy_set_header + $scheme = A [OK]
Hint: Use proxy_set_header with $scheme for protocol header [OK]
When reloading nginx, it fails with a syntax error. What is the problem?
medium
A. Missing semicolon at the end of the first proxy_set_header line
B. Incorrect variable name $proxy_add_x_forwarded_for
C. proxy_set_header cannot be used twice in one block
D. X-Real-IP header cannot be set manually
Solution
Step 1: Check nginx directive syntax
Each directive line must end with a semicolon in nginx configuration.
Step 2: Identify missing semicolon
The first line lacks a semicolon after $remote_addr, causing syntax error.
Final Answer:
Missing semicolon at the end of the first proxy_set_header line -> Option A
Quick Check:
Every directive needs semicolon = D [OK]
Hint: Always end nginx directives with semicolon [OK]
Common Mistakes:
Ignoring semicolon syntax rules
Assuming variable names are wrong without checking
Thinking headers can't be set multiple times
5. You want to ensure your backend server correctly logs the original client IP and protocol when nginx proxies requests. Which complete nginx proxy header configuration snippet achieves this?
hard
A. proxy_set_header X-Real-IP $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto $protocol;
B. proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
C. proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Real-IP $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
D. proxy_set_header X-Real-IP $remote_addr
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for
proxy_set_header X-Forwarded-Proto $scheme
Solution
Step 1: Verify correct variables for headers
X-Real-IP should be $remote_addr, X-Forwarded-For uses $proxy_add_x_forwarded_for, and X-Forwarded-Proto uses $scheme.
Step 2: Check syntax correctness
Each directive must end with a semicolon; proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme; has correct syntax and variables.