Модуль 23

Nginx + FastAPI

Ось готовий урок, створений спеціально для тебе у стилі CS50. Вмикай уяву, ми починаємо!


🎓 Урок: Nginx + FastAPI. Як вивести Python у "великий світ"

Ласкаво просимо! Я радий бачити вас тут. Сьогодні ми перетворимо ваш "домашній" код на справжній, готовий до високих навантажень сервер.

1. 🔥 Вступ: проблема та мотивація

Уявіть собі, що ви відкрили ресторан високої кухні (це ваш FastAPI застосунок). У вас є геніальний шеф-кухар (Python), який готує неймовірні страви.

Але є проблема: у вашому ресторані немає дверей, офіціантів і хостес. Гості (клієнти з інтернету) просто ввалюються прямо на кухню до шефа. * Хтось кричить: "Де мій суп?!" * Хтось прийшов просто в туалет. * Хтось намагається вкрасти ножі.

Шеф-кухар замість того, щоб готувати, змушений розсаджувати гостей, перевіряти їхні документи та мити підлогу. Результат? Кухня зупиняється, їжа підгорає, ресторан банкрутує.

Питання до вас: Чи повинен Python, мова, яка створена для логіки та обробки даних, займатися тим, щоб віддавати картинки, шифрувати SSL-сертифікати або блокувати хакерські атаки?

Звісно, ні.

Ось тут на сцену виходить Nginx. Це ваш ідеальний менеджер залу. Він зустрічає гостей на вході, перевіряє їх, розсаджує за столики, а на кухню (до FastAPI) передає тільки чіткі замовлення.

Чому без цього не обійтись: Запуск FastAPI через uvicorn main:app ідеальний для розробки. Але в реальному світі ("в продакшені") це небезпечно і повільно. Вам потрібен зворотний проксі (Reverse Proxy).


2. 🧠 Теоретична база (без сухої академічності)

Давайте заглянемо "під капот". У нас є три гравці:

  1. Клієнт (Браузер / Мобільний додаток).
  2. Nginx (Веб-сервер / Зворотний проксі).
  3. Uvicorn + FastAPI (Сервер застосунку).

Як це працює? (Логіка процесу)

  1. Клієнт стукає у двері сервера (зазвичай це порт 80 або 443).
  2. Там його зустрічає Nginx. Він дуже швидкий. Він написаний на C і може тримати тисячі з'єднань одночасно.
  3. Nginx дивиться на запит:
    • "Ага, тобі потрібна картинка логотипу?" — Nginx віддає її сам (миттєво), не турбуючи Python.
    • "Тобі потрібно розрахувати вартість кошика?" — Nginx розуміє, що це складно, і передає запит далі на Uvicorn (зазвичай на порт 8000).
  4. Uvicorn запускає код FastAPI, отримує результат і віддає його назад Nginx.
  5. Nginx віддає відповідь клієнту.

🔑 Що треба запам’ятати залізно:

  • Reverse Proxy (Зворотний проксі): Це сервер, який стоїть перед вашим застосунком і приймає удари долі на себе.
  • FastAPI не повинен "дивитися" в інтернет напряму. Він має бути схованим за спиною Nginx.
  • Статичні файли (CSS, картинки): Їх завжди має віддавати Nginx. Python для цього занадто повільний і "дорогой".

3. 🧪 Приклади (від простого до реального)

Давайте перейдемо до коду.

Крок 1: Мінімальний FastAPI

Припустімо, у нас є файл main.py.

from fastapi import FastAPI

app = FastAPI()

@app.get("/")
def read_root():
    return {"message": "Привіт, я працюю за спиною Nginx!"}

Ми запускаємо його: uvicorn main:app --port 8000. Зараз він доступний тільки локально.

Крок 2: Конфігурація Nginx (The Magic)

Як сказати Nginx: "Усе, що приходить до тебе, кидай на порт 8000"? Ось як виглядає конфіг (зазвичай у /etc/nginx/sites-available/default):

server {
    listen 80;                 # Слухаємо порт 80 (стандартний HTTP)
    server_name my-site.com;   # Наш домен (або IP)

    location / {
        # Студенте, увага сюди! 👇
        proxy_pass http://127.0.0.1:8000;  # Перенаправляємо на Uvicorn

        # Передаємо заголовки, щоб FastAPI знав реальну IP клієнта
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

Питання до вас: Що станеться, якщо я вимкну Uvicorn, але залишу Nginx працювати? Що побачить користувач? (Подумайте секунду...)

Відповідь: Користувач побачить помилку 502 Bad Gateway. Це означає: "Привіт, я Nginx, я на місці, але той хлопець на кухні (FastAPI) не відповідає". Це важливо вміти розрізняти!

Крок 3: Обробка статики (Економія ресурсів)

Ускладнюємо задачу. У нас є папка /static з картинками.

server {
    listen 80;

    # Спочатку перевіряємо, чи це запит на картинку
    location /static/ {
        alias /home/user/myproject/static/; # Шлях до папки на диску
        # Nginx віддасть файл сам. Python навіть не дізнається про цей запит!
    }

    # Якщо це не статика, тоді вже йдемо до Python
    location / {
        proxy_pass http://127.0.0.1:8000;
    }
}

4. 🛠 Практична частина

Тепер ваша черга. Не бійтеся ламати, ми вчимося!

Завдання 1: "Рукостискання" 1. Запустіть простий FastAPI додаток на порту 8000. 2. Встановіть Nginx (sudo apt install nginx на Linux або використайте Docker). 3. Налаштуйте Nginx так, щоб при заході на localhost:80 ви бачили відповідь від FastAPI.

Завдання 2: "Детектив" Додайте у FastAPI ендпоінт, який повертає IP-адресу клієнта. Перевірте: якщо ви не налаштуєте proxy_set_header X-Real-IP, яку IP покаже Python? (Спойлер: він скаже, що клієнт — це 127.0.0.1, тобто сам Nginx). Виправте це.

Завдання 3: "Забастовка на кухні" Запустіть все. Переконайтеся, що працює. Тепер "вбийте" процес Python (Ctrl+C у терміналі Uvicorn). Зайдіть у браузер. Подивіться на помилку. Запам'ятайте цей екран 502 на все життя.

Завдання 4: Міні-кейс "Навантаження" Уявіть, що вам треба запустити два екземпляри вашого додатку (на портах 8000 і 8001), щоб обробляти більше запитів. Погугліть: Nginx upstream load balancing. Задача: Зробіть так, щоб Nginx по черзі кидав запити то на 8000, то на 8001.


5. 💡 Мислення як у розробника

Як думають профі, коли налаштовують цю зв'язку?

  1. "Розділяй і володарюй".

    • Новачок: Намагається змусити FastAPI роздавати відеофайли.
    • Профі: Знає, що Python — це для бізнес-логіки. Все, що є "файлом", має віддавати Nginx або CDN. Це економить CPU і гроші.
  2. Безпека передусім.

    • Nginx — це щит. Саме на ньому налаштовують HTTPS (SSL сертифікати). Ваш Python код навіть не знає, що з'єднання зашифроване. Він отримує вже "чистий" запит. Це називається SSL Termination.
  3. Помилка новачка:

    • Забути перезавантажити Nginx після зміни конфігу (sudo systemctl reload nginx). Ви можете годину правити файл і не розуміти, чому нічого не змінюється. Завжди перевіряйте статус!

6. 🧩 Підсумок

Отже, що ми сьогодні зробили? Ми взяли наш "домашній" FastAPI і побудували навколо нього професійну інфраструктуру.

Тепер ви знаєте: 1. FastAPI (Uvicorn) — це шеф-кухар (готує контент). 2. Nginx — це менеджер залу (приймає гостей, фільтрує трафік, роздає статику). 3. Разом вони створюють швидкий, безпечний і надійний веб-сервер.

Що далі? Ви запитаєте: "Девіде, а що, якщо я хочу запустити це на іншому комп'ютері, і мені ліньки встановлювати бібліотеки?" О, це чудове питання. Саме для цього існує Docker та Docker Compose. Ми запакуємо наш Nginx і FastAPI у контейнери в наступному уроці.

А поки що — спробуйте "покласти" свій сервер і підняти його знову. Це найкращий спосіб навчання!

Це був CS50. Побачимось! 👋