Bird
Raised Fist0
Flaskframework~10 mins

Nginx as reverse proxy in Flask - Step-by-Step Execution

Choose your learning style10 modes available
Concept Flow - Nginx as reverse proxy
Client sends HTTP request
↓
Nginx receives request
↓
Nginx forwards request to Flask app
↓
Flask app processes request
↓
Flask app sends response
↓
Nginx receives response
↓
Nginx sends response back to client
The client sends a request to Nginx, which forwards it to the Flask app. Flask processes and replies, then Nginx sends the response back to the client.
Execution Sample
Flask
server {
    listen 80;
    location / {
        proxy_pass http://127.0.0.1:5000;
    }
}
Nginx listens on port 80 and forwards all requests to the Flask app running on localhost port 5000.
Execution Table
StepActionRequest/ResponseSourceDestination
1Client sends HTTP GET /GET /ClientNginx
2Nginx receives requestGET /NginxNginx
3Nginx forwards requestGET /NginxFlask app (127.0.0.1:5000)
4Flask app processes requestGET /Flask appFlask app
5Flask app sends response200 OK with contentFlask appNginx
6Nginx receives response200 OK with contentNginxNginx
7Nginx sends response back200 OK with contentNginxClient
8Client receives response200 OK with contentClientClient
💡 Request cycle completes after client receives the response.
Variable Tracker
VariableStartAfter Step 3After Step 5Final
Request URL////
Request SourceClientNginxFlask appClient
Response StatusNoneNone200 OK200 OK
Key Moments - 3 Insights
Why does Nginx forward the request to 127.0.0.1:5000?
Because the proxy_pass directive tells Nginx to send incoming requests to the Flask app running locally on port 5000, as shown in execution_table step 3.
Does the client communicate directly with the Flask app?
No, the client only talks to Nginx. Nginx acts as a middleman forwarding requests and responses, as seen in execution_table steps 1, 3, and 7.
What happens if the Flask app is down?
Nginx will fail to get a response and usually returns an error to the client. This is because Nginx depends on Flask to handle the request after forwarding it.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution_table, at which step does Nginx forward the request to Flask?
AStep 1
BStep 3
CStep 5
DStep 7
💡 Hint
Check the 'Action' column for forwarding requests in execution_table row 3.
According to variable_tracker, what is the Response Status after Flask app processes the request?
ANone
B404 Not Found
C200 OK
D500 Internal Server Error
💡 Hint
Look at the 'Response Status' row after Step 5 in variable_tracker.
If Nginx did not send the response back to the client, which step would be missing in execution_table?
AStep 7
BStep 2
CStep 4
DStep 6
💡 Hint
Step 7 shows Nginx sending the response back to the client.
Concept Snapshot
Nginx as reverse proxy:
- Nginx listens on a public port (e.g., 80)
- Forwards client requests to Flask app (proxy_pass)
- Flask processes and replies
- Nginx sends Flask's response back to client
- Keeps client unaware of Flask's internal address
- Improves security and load management
Full Transcript
This visual trace shows how Nginx acts as a reverse proxy for a Flask app. The client sends a request to Nginx, which listens on port 80. Nginx forwards the request to the Flask app running locally on port 5000. The Flask app processes the request and sends back a response. Nginx receives this response and sends it back to the client. Variables like request URL and response status change as the request moves through these steps. Key points include that the client never talks directly to Flask, and Nginx manages the communication. If Flask is down, Nginx cannot fulfill the request. This setup helps keep the Flask app hidden and secure behind Nginx.

Practice

(1/5)
1. What is the main role of Nginx when used as a reverse proxy for a Flask application?
easy
A. Compile Flask Python code into machine code
B. Run the Flask application code directly
C. Forward client requests to the Flask app server
D. Store the Flask app's database

Solution

  1. Step 1: Understand Nginx's role

    Nginx acts as a middleman that receives client requests first.
  2. Step 2: Forward requests to Flask app

    Nginx sends these requests to the Flask app running on a backend server or port.
  3. Final Answer:

    Forward client requests to the Flask app server -> Option C
  4. Quick Check:

    Nginx forwards requests = D [OK]
Hint: Nginx passes requests, it does not run Flask code [OK]
Common Mistakes:
  • Thinking Nginx runs Flask code
  • Confusing Nginx with database storage
  • Believing Nginx compiles Python code
2. Which Nginx directive is used to specify the Flask app server URL in the reverse proxy configuration?
easy
A. proxy_pass
B. server_name
C. listen
D. root

Solution

  1. Step 1: Identify directive for backend URL

    The directive that tells Nginx where to send requests is proxy_pass.
  2. Step 2: Confirm other directives' roles

    server_name sets domain, listen sets port, root sets file path.
  3. Final Answer:

    proxy_pass -> Option A
  4. Quick Check:

    Backend URL = proxy_pass [OK]
Hint: proxy_pass points to Flask app URL in Nginx config [OK]
Common Mistakes:
  • Using server_name instead of proxy_pass for backend URL
  • Confusing listen with proxy_pass
  • Setting root for proxy backend
3. Given this Nginx snippet, what happens when a client requests http://example.com/api/data?
location /api/ {
    proxy_pass http://127.0.0.1:5000/;
}
medium
A. Request is served from Nginx's local files
B. Request is forwarded to http://127.0.0.1:5000/data
C. Request results in 404 error
D. Request is forwarded to http://127.0.0.1:5000/api/data

Solution

  1. Step 1: Understand proxy_pass with trailing slash

    Since proxy_pass ends with a slash, Nginx appends the full request URI after the location prefix.
  2. Step 2: Combine location and proxy_pass

    Request /api/data is forwarded as http://127.0.0.1:5000/api/data.
  3. Final Answer:

    Request is forwarded to http://127.0.0.1:5000/api/data -> Option D
  4. Quick Check:

    Trailing slash keeps full path = C [OK]
Hint: Trailing slash in proxy_pass keeps full path [OK]
Common Mistakes:
  • Removing /api/ from forwarded URL incorrectly
  • Assuming Nginx serves files locally
  • Expecting 404 without backend
4. You configured Nginx as below but get a 502 Bad Gateway error. What is the likely cause?
location / {
    proxy_pass http://127.0.0.1:8000;
}
Your Flask app runs on port 5000.
medium
A. Nginx is forwarding to wrong port 8000 instead of 5000
B. proxy_pass missing trailing slash causes error
C. Flask app must run on port 8000 for Nginx
D. Nginx cannot proxy to localhost

Solution

  1. Step 1: Check proxy_pass target port

    proxy_pass points to port 8000, but Flask runs on 5000, so no backend listens on 8000.
  2. Step 2: Understand 502 Bad Gateway cause

    502 means Nginx can't connect to backend server at specified address and port.
  3. Final Answer:

    Nginx is forwarding to wrong port 8000 instead of 5000 -> Option A
  4. Quick Check:

    Port mismatch causes 502 error = A [OK]
Hint: Match proxy_pass port to Flask app port exactly [OK]
Common Mistakes:
  • Blaming missing trailing slash for 502
  • Thinking Flask must run on 8000
  • Assuming Nginx can't proxy localhost
5. You want Nginx to forward requests from /app/ to your Flask app at http://127.0.0.1:5000/, but remove the /app prefix before forwarding. Which configuration achieves this?
hard
A.
location /app/ {
    proxy_pass http://127.0.0.1:5000/app/;
}
B.
location /app/ {
    proxy_pass http://127.0.0.1:5000;
}
C.
location /app/ {
    proxy_pass http://127.0.0.1:5000/;
}
D.
location /app {
    proxy_pass http://127.0.0.1:5000/;
}

Solution

  1. Step 1: Understand proxy_pass without trailing slash

    When proxy_pass URL has no trailing slash, Nginx replaces the matching location prefix with the proxy_pass path.
  2. Step 2: Apply to /app/ location

    With location /app/ and proxy_pass http://127.0.0.1:5000, the /app/ prefix is removed before forwarding.
  3. Step 3: Check other options

    The configuration with proxy_pass http://127.0.0.1:5000/; keeps /app/ prefix, the one with proxy_pass http://127.0.0.1:5000/app/; adds /app/ twice, and location without trailing slash causes mismatch.
  4. Final Answer:

    location /app/ { proxy_pass http://127.0.0.1:5000; } -> Option B
  5. Quick Check:

    proxy_pass without slash removes location prefix = A [OK]
Hint: No trailing slash on proxy_pass removes location prefix [OK]
Common Mistakes:
  • Adding trailing slash keeps prefix in forwarded URL
  • Using location without trailing slash causes mismatch
  • Duplicating /app/ in proxy_pass URL
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