Bird
Raised Fist0
Nginxdevops~20 mins

Connection pooling to upstream in Nginx - Practice Problems & Coding Challenges

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
Connection Pooling Master
Get all challenges correct to earn this badge!
Test your skills under time pressure!
💻 Command Output
intermediate
2:00remaining
Nginx Upstream Connection Pooling Behavior

Given the following nginx upstream configuration, what is the maximum number of idle keepalive connections nginx will maintain to the upstream servers?

Nginx
upstream backend {
    server backend1.example.com max_fails=3 fail_timeout=30s;
    server backend2.example.com max_fails=3 fail_timeout=30s;
    keepalive 10;
}

server {
    location / {
        proxy_pass http://backend;
    }
}
A10 connections per each upstream server
B10 connections total shared across all upstream servers
CUnlimited connections, keepalive does not limit connections
D3 connections total due to max_fails setting
Attempts:
2 left
💡 Hint

Think about what the keepalive directive controls in the upstream block.

❓ Configuration
intermediate
2:00remaining
Configuring Upstream Keepalive Connections

Which of the following nginx upstream configurations correctly enables connection pooling with 20 keepalive connections per upstream server?

A
upstream backend {
    server backend1.example.com;
    server backend2.example.com;
    keepalive_connections 20;
}
B
upstream backend {
    server backend1.example.com keepalive=20;
    server backend2.example.com keepalive=20;
}
C
upstream backend {
    server backend1.example.com;
    server backend2.example.com;
    keepalive 20;
}
D
upstream backend {
    server backend1.example.com max_fails=20;
    server backend2.example.com max_fails=20;
}
Attempts:
2 left
💡 Hint

Remember the exact syntax for the keepalive directive inside the upstream block.

❓ Troubleshoot
advanced
2:00remaining
Diagnosing Connection Pooling Issues

An nginx server is configured with an upstream block using keepalive 15;. However, monitoring shows nginx opens many more than 15 connections to the upstream servers under load. What is the most likely cause?

AThe <code>max_fails</code> directive is set too low causing connections to reopen frequently
BThe <code>keepalive</code> directive only limits idle connections, active connections can exceed this number
CThe <code>keepalive</code> directive must be set inside the server block, not upstream
DNginx does not support connection pooling with HTTP upstreams
Attempts:
2 left
💡 Hint

Consider the difference between idle and active connections in nginx's connection pooling.

🔀 Workflow
advanced
2:00remaining
Implementing Connection Pooling for Upstream Servers

You want to configure nginx to reuse TCP connections to upstream servers to improve performance. Which sequence of steps is correct?

A2, 1, 3, 4
B1, 2, 4, 3
C1, 3, 2, 4
D1, 2, 3, 4
Attempts:
2 left
💡 Hint

Think about the order of defining upstream, enabling keepalive, and configuring proxy headers.

✅ Best Practice
expert
2:00remaining
Best Practice for Connection Pooling with Multiple Upstream Servers

When configuring connection pooling with multiple upstream servers in nginx, which practice helps ensure efficient connection reuse and load balancing?

AUse a single upstream block with multiple servers and a keepalive directive to share pooled connections across all servers
BCreate separate upstream blocks for each server with individual keepalive settings to isolate connections
CSet max_fails to 0 to prevent connection failures from closing pooled connections
DDisable keepalive and rely on nginx to open new connections for each request to balance load evenly
Attempts:
2 left
💡 Hint

Consider how nginx manages pooled connections and load balancing across servers.

Practice

(1/5)
1. What is the main purpose of using keepalive in an upstream block in nginx?
easy
A. To limit the number of client connections to nginx
B. To close all connections immediately after each request
C. To reuse open connections to backend servers and improve response speed
D. To enable caching of static files on the server

Solution

  1. Step 1: Understand the role of keepalive in upstream

    The keepalive directive in the upstream block tells nginx to keep a number of connections open to backend servers for reuse.
  2. Step 2: Identify the benefit of connection reuse

    Reusing connections avoids the overhead of opening new connections for each request, improving speed and reducing latency.
  3. Final Answer:

    To reuse open connections to backend servers and improve response speed -> Option C
  4. Quick Check:

    Connection pooling = reuse connections = To reuse open connections to backend servers and improve response speed [OK]
Hint: Remember: keepalive means keep connections open for reuse [OK]
Common Mistakes:
  • Thinking keepalive limits client connections
  • Confusing keepalive with caching
  • Assuming keepalive closes connections immediately
2. Which of the following is the correct syntax to enable connection pooling with 32 keepalive connections in an nginx upstream block?
easy
A. upstream backend { keepalive 32; server backend1.example.com; }
B. upstream backend { keepalive_connections 32; server backend1.example.com; }
C. upstream backend { keepalive=32; server backend1.example.com; }
D. upstream backend { keepalive 32 servers; server backend1.example.com; }

Solution

  1. Step 1: Recall the correct directive syntax

    The correct directive to set connection pooling count is keepalive followed by the number, ending with a semicolon.
  2. Step 2: Check each option's syntax

    upstream backend { keepalive 32; server backend1.example.com; } uses keepalive 32; which is correct. Options A, B, and C use incorrect directive names or syntax.
  3. Final Answer:

    upstream backend { keepalive 32; server backend1.example.com; } -> Option A
  4. Quick Check:

    Correct syntax = keepalive 32; = upstream backend { keepalive 32; server backend1.example.com; } [OK]
Hint: Use 'keepalive' followed by number and semicolon inside upstream [OK]
Common Mistakes:
  • Using incorrect directive names like keepalive_connections
  • Adding extra words after number
  • Using equal sign instead of space
3. Given this nginx configuration snippet, what will be the effect on connection reuse?
upstream backend {
    server backend1.example.com;
    keepalive 16;
}

server {
    location / {
        proxy_pass http://backend;
        proxy_http_version 1.1;
        proxy_set_header Connection "";
    }
}
medium
A. Connections will be closed immediately after each request
B. Connections will not be reused because proxy_http_version is 1.1
C. The configuration will cause a syntax error and fail to start nginx
D. Connections to backend will be reused up to 16 times, improving performance

Solution

  1. Step 1: Analyze upstream keepalive setting

    The keepalive 16; directive allows nginx to keep up to 16 idle connections open to the backend for reuse.
  2. Step 2: Check proxy settings for connection reuse

    Setting proxy_http_version 1.1; and proxy_set_header Connection ""; enables connection reuse by preventing the 'Connection: close' header.
  3. Final Answer:

    Connections to backend will be reused up to 16 times, improving performance -> Option D
  4. Quick Check:

    keepalive + proxy_http_version 1.1 + empty Connection header = reuse [OK]
Hint: Use HTTP/1.1 and clear Connection header to enable reuse [OK]
Common Mistakes:
  • Assuming HTTP/1.1 disables reuse
  • Not clearing Connection header disables pooling
  • Confusing keepalive with client connections
4. You configured connection pooling with keepalive 10; in your upstream block, but nginx is still opening new connections for every request. What is the most likely cause?
medium
A. You forgot to set proxy_http_version 1.1; and clear the Connection header
B. The keepalive directive only works with HTTP/2
C. You need to increase keepalive to at least 100
D. The backend server does not support keepalive connections

Solution

  1. Step 1: Check proxy settings required for connection reuse

    For connection pooling to work, nginx must use HTTP/1.1 and clear the Connection header to avoid closing connections.
  2. Step 2: Identify common misconfiguration

    If proxy_http_version 1.1; and proxy_set_header Connection ""; are missing, nginx will close connections after each request despite keepalive.
  3. Final Answer:

    You forgot to set proxy_http_version 1.1; and clear the Connection header -> Option A
  4. Quick Check:

    Missing proxy_http_version 1.1 + Connection header clear = no reuse [OK]
Hint: Always set proxy_http_version 1.1 and clear Connection header [OK]
Common Mistakes:
  • Believing keepalive works without proxy_http_version 1.1
  • Thinking backend server must be changed first
  • Assuming keepalive number is too low
5. You want to optimize nginx to reuse connections to multiple backend servers with different keepalive limits. Which configuration correctly sets 20 keepalive connections for backend1 and 10 for backend2?
hard
A. upstream backend { server backend1.example.com; keepalive 20; server backend2.example.com; keepalive 10; }
B. upstream backend1 { server backend1.example.com; keepalive 20; } upstream backend2 { server backend2.example.com; keepalive 10; }
C. upstream backend { server backend1.example.com keepalive=20; server backend2.example.com keepalive=10; }
D. upstream backend { server backend1.example.com; server backend2.example.com; keepalive 30; }

Solution

  1. Step 1: Understand keepalive scope

    The keepalive directive applies per upstream block, not per server inside it.
  2. Step 2: Check options for setting different keepalive values

    upstream backend1 { server backend1.example.com; keepalive 20; } upstream backend2 { server backend2.example.com; keepalive 10; } defines two separate upstream blocks, each with its own keepalive setting, which is correct. Options B, C, and D try to set different keepalive values inside one upstream block, which is invalid.
  3. Final Answer:

    upstream backend1 { server backend1.example.com; keepalive 20; } upstream backend2 { server backend2.example.com; keepalive 10; } -> Option B
  4. Quick Check:

    Separate upstream blocks for different keepalive values = upstream backend1 { server backend1.example.com; keepalive 20; } upstream backend2 { server backend2.example.com; keepalive 10; } [OK]
Hint: Use separate upstream blocks to set different keepalive values [OK]
Common Mistakes:
  • Trying to set keepalive per server inside one upstream
  • Using invalid syntax with equal signs
  • Setting one keepalive for multiple servers expecting different limits
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard