IP hash for session persistence in Nginx - Time & Space Complexity
When using IP hash in nginx, we want to see how the work grows as more clients connect.
We ask: How does nginx handle many client IPs to keep sessions sticky?
Analyze the time complexity of the following nginx configuration snippet.
upstream backend {
ip_hash;
server backend1.example.com;
server backend2.example.com;
server backend3.example.com;
}
server {
listen 80;
location / {
proxy_pass http://backend;
}
}
This config uses ip_hash to send clients to the same backend server based on their IP address.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Hashing the client IP and mapping it to one server.
- How many times: Once per client request to decide the backend server.
Each new client IP requires hashing and a lookup among a fixed number of servers.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | 10 hash calculations and 10 server selections |
| 100 | 100 hash calculations and 100 server selections |
| 1000 | 1000 hash calculations and 1000 server selections |
Pattern observation: The work grows linearly with the number of client requests.
Time Complexity: O(n)
This means the time to handle requests grows directly with the number of clients.
[X] Wrong: "The ip_hash method checks all servers for each request, so it's slow for many servers."
[OK] Correct: ip_hash uses a quick hash function to pick one server directly, so it does not check each server one by one.
Understanding how nginx uses ip_hash helps you explain how load balancing can be efficient and predictable in real systems.
"What if we added more backend servers dynamically? How would that affect the time complexity of ip_hash?"
Practice
ip_hash in an Nginx upstream block?Solution
Step 1: Understand the role of
Theip_haship_hashdirective 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 AQuick Check:
IP hash = session stickiness [OK]
- Confusing ip_hash with encryption
- Thinking ip_hash balances load evenly
- Assuming ip_hash caches files
Solution
Step 1: Recall the exact directive syntax
The correct directive to enable IP hash in Nginx isip_hash;placed inside theupstreamblock 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; } usesip_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 CQuick Check:
Correct directive is ip_hash; [OK]
- Misspelling ip_hash as iphash or hash_ip
- Adding = on which is invalid
- Placing ip_hash outside upstream block
ip_hash; enabled, what will happen if two requests come from the same client IP?Solution
Step 1: Understand ip_hash behavior on requests
Withip_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 BQuick Check:
Same IP = same server [OK]
- Assuming random distribution despite ip_hash
- Thinking load balancing ignores ip_hash
- Believing requests get rejected on IP reuse
ip_hash; inside your upstream block, but session stickiness is not working. Which of these is the most likely cause?Solution
Step 1: Verify correct placement of
Theip_hash;ip_hash;directive must be inside theupstreamblock, not inside individualserverblocks.Step 2: Analyze other options
Restarting Nginx is necessary but usually not the main cause. Backend servers don't affect ip_hash behavior. Usingip_hash on;is invalid syntax.Final Answer:
You placedip_hash;inside theserverblock instead ofupstream-> Option AQuick Check:
ip_hash must be inside upstream block [OK]
- Putting ip_hash in server block
- Using wrong syntax like ip_hash on;
- Blaming backend servers for ip_hash issues
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 DQuick Check:
Down server skipped, requests go to available servers [OK]
- Assuming Nginx keeps sending to down server
- Thinking requests get rejected automatically
- Believing ip_hash ignores server health
Ready to prove it?
Pass the test and this pattern moves unknown
