📖 Scenario: You are setting up a simple web server load balancer using Nginx. Your goal is to ensure that users keep connecting to the same backend server during their session. This is important for applications that store session data locally on each server.
🎯 Goal: Configure Nginx to use the ip_hash method for load balancing, so that each user's requests are consistently sent to the same backend server based on their IP address.
📋 What You'll Learn
Create an Nginx upstream block named backend with three servers: 192.168.1.10, 192.168.1.11, and 192.168.1.12
Add the ip_hash directive inside the upstream block to enable session persistence
Configure the server block to proxy requests to the backend upstream
Print the final Nginx configuration to verify the setup
💡 Why This Matters
🌍 Real World
Many web applications require users to stay connected to the same server during their session to keep their data consistent. Using IP hash in Nginx helps achieve this without complex session sharing.
💼 Career
Understanding how to configure load balancing and session persistence is a key skill for DevOps engineers managing scalable web services.
Progress0 / 4 steps
1
Create the upstream block with backend servers
Create an Nginx upstream block called backend with these exact servers: 192.168.1.10, 192.168.1.11, and 192.168.1.12. Use the syntax: server 192.168.1.10; for each server.
Nginx
Hint
Use the upstream directive to group backend servers.
2
Add the ip_hash directive for session persistence
Inside the existing upstream backend block, add the directive ip_hash; on its own line before the server entries.
Nginx
Hint
The ip_hash directive must be inside the upstream block before the servers.
3
Configure the server block to proxy requests to backend
Create an Nginx server block that listens on port 80 and proxies all requests to the backend upstream using proxy_pass http://backend; inside the location / block.
Nginx
Hint
Use proxy_pass inside location / to forward requests to the upstream.
4
Print the final Nginx configuration
Print the entire Nginx configuration including the upstream backend block with ip_hash and the server block proxying to backend.
Nginx
Hint
Use a print statement to show the full configuration exactly as written.
Practice
(1/5)
1. What is the main purpose of using ip_hash in an Nginx upstream block?
easy
A. To ensure requests from the same client IP go to the same backend server
B. To encrypt traffic between Nginx and backend servers
C. To balance load evenly regardless of client IP
D. To cache static files on the client side
Solution
Step 1: Understand the role of ip_hash
The ip_hash directive in Nginx is used to route requests from the same client IP address to the same backend server.
Step 2: Identify the purpose in session persistence
This helps keep user sessions sticky, meaning the user stays connected to the same server, which is important for apps storing session data locally.
Final Answer:
To ensure requests from the same client IP go to the same backend server -> Option A
Quick Check:
IP hash = session stickiness [OK]
Hint: ip_hash keeps same IP on same server for session stickiness [OK]
Common Mistakes:
Confusing ip_hash with encryption
Thinking ip_hash balances load evenly
Assuming ip_hash caches files
2. Which of the following is the correct way to enable IP hash in an Nginx configuration for upstream servers?
easy
A. upstream backend { hash_ip; server 192.168.1.10; server 192.168.1.11; }
B. upstream backend { iphash; server 192.168.1.10; server 192.168.1.11; }
C. upstream backend { ip_hash; server 192.168.1.10; server 192.168.1.11; }
D. upstream backend { ip_hash = on; server 192.168.1.10; server 192.168.1.11; }
Solution
Step 1: Recall the exact directive syntax
The correct directive to enable IP hash in Nginx is ip_hash; placed inside the upstream block without any assignment or spelling changes.
Step 2: Check each option for syntax correctness
upstream backend { ip_hash; server 192.168.1.10; server 192.168.1.11; } uses ip_hash; correctly. Options A and C have wrong directive names. upstream backend { ip_hash = on; server 192.168.1.10; server 192.168.1.11; } uses an invalid assignment syntax.
Final Answer:
upstream backend { ip_hash; server 192.168.1.10; server 192.168.1.11; } -> Option C
Quick Check:
Correct directive is ip_hash; [OK]
Hint: Use exact directive 'ip_hash;' inside upstream block [OK]
Common Mistakes:
Misspelling ip_hash as iphash or hash_ip
Adding = on which is invalid
Placing ip_hash outside upstream block
3. Given this Nginx upstream configuration with ip_hash; enabled, what will happen if two requests come from the same client IP?
medium
A. Both requests will be sent to different backend servers randomly
B. Both requests will be sent to the same backend server
C. Requests will be load balanced based on server load
D. Requests will be rejected due to IP conflict
Solution
Step 1: Understand ip_hash behavior on requests
With ip_hash; enabled, Nginx uses the client's IP address to decide which backend server to send the request to, ensuring the same IP always maps to the same server.
Step 2: Apply this to two requests from the same IP
Since both requests come from the same IP, they will be routed to the same backend server for session persistence.
Final Answer:
Both requests will be sent to the same backend server -> Option B
Quick Check:
Same IP = same server [OK]
Hint: Same IP means same backend server with ip_hash [OK]
Common Mistakes:
Assuming random distribution despite ip_hash
Thinking load balancing ignores ip_hash
Believing requests get rejected on IP reuse
4. You added ip_hash; inside your upstream block, but session stickiness is not working. Which of these is the most likely cause?
medium
A. You placed ip_hash; inside the server block instead of upstream
B. You forgot to restart Nginx after adding ip_hash;
C. Your backend servers do not support IP hashing
D. You used ip_hash on; instead of ip_hash;
Solution
Step 1: Verify correct placement of ip_hash;
The ip_hash; directive must be inside the upstream block, not inside individual server blocks.
Step 2: Analyze other options
Restarting Nginx is necessary but usually not the main cause. Backend servers don't affect ip_hash behavior. Using ip_hash on; is invalid syntax.
Final Answer:
You placed ip_hash; inside the server block instead of upstream -> Option A
Quick Check:
ip_hash must be inside upstream block [OK]
Hint: ip_hash belongs inside upstream, not server block [OK]
Common Mistakes:
Putting ip_hash in server block
Using wrong syntax like ip_hash on;
Blaming backend servers for ip_hash issues
5. You have three backend servers and want to use IP hash for session persistence. However, one server is down. What will Nginx do with requests from an IP previously mapped to the down server?
hard
A. Nginx will randomly distribute requests ignoring IP hash
B. Nginx will keep sending requests to the down server causing errors
C. Nginx will reject the requests with a 503 error
D. Nginx will send requests to a different available backend server
Solution
Step 1: Understand ip_hash behavior with unavailable servers
When a backend server is down, Nginx detects it as unavailable and will not send requests to it, even if IP hash maps to it.
Step 2: Determine fallback behavior
Nginx will route requests to another available backend server to keep service running, though session stickiness is temporarily lost for that IP.
Final Answer:
Nginx will send requests to a different available backend server -> Option D
Quick Check:
Down server skipped, requests go to available servers [OK]
Hint: Down servers skipped; requests go to other servers [OK]
Common Mistakes:
Assuming Nginx keeps sending to down server
Thinking requests get rejected automatically
Believing ip_hash ignores server health
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.