Ось готовий урок, створений спеціально для тебе у стилі CS50. Вмикай уяву, ми починаємо!
🎓 Урок: Nginx + FastAPI. Як вивести Python у "великий світ"
Ласкаво просимо! Я радий бачити вас тут. Сьогодні ми перетворимо ваш "домашній" код на справжній, готовий до високих навантажень сервер.
1. 🔥 Вступ: проблема та мотивація
Уявіть собі, що ви відкрили ресторан високої кухні (це ваш FastAPI застосунок). У вас є геніальний шеф-кухар (Python), який готує неймовірні страви.
Але є проблема: у вашому ресторані немає дверей, офіціантів і хостес. Гості (клієнти з інтернету) просто ввалюються прямо на кухню до шефа. * Хтось кричить: "Де мій суп?!" * Хтось прийшов просто в туалет. * Хтось намагається вкрасти ножі.
Шеф-кухар замість того, щоб готувати, змушений розсаджувати гостей, перевіряти їхні документи та мити підлогу. Результат? Кухня зупиняється, їжа підгорає, ресторан банкрутує.
Питання до вас: Чи повинен Python, мова, яка створена для логіки та обробки даних, займатися тим, щоб віддавати картинки, шифрувати SSL-сертифікати або блокувати хакерські атаки?
Звісно, ні.
Ось тут на сцену виходить Nginx. Це ваш ідеальний менеджер залу. Він зустрічає гостей на вході, перевіряє їх, розсаджує за столики, а на кухню (до FastAPI) передає тільки чіткі замовлення.
Чому без цього не обійтись:
Запуск FastAPI через uvicorn main:app ідеальний для розробки. Але в реальному світі ("в продакшені") це небезпечно і повільно. Вам потрібен зворотний проксі (Reverse Proxy).
2. 🧠 Теоретична база (без сухої академічності)
Давайте заглянемо "під капот". У нас є три гравці:
- Клієнт (Браузер / Мобільний додаток).
- Nginx (Веб-сервер / Зворотний проксі).
- Uvicorn + FastAPI (Сервер застосунку).
Як це працює? (Логіка процесу)
- Клієнт стукає у двері сервера (зазвичай це порт 80 або 443).
- Там його зустрічає Nginx. Він дуже швидкий. Він написаний на C і може тримати тисячі з'єднань одночасно.
- Nginx дивиться на запит:
- "Ага, тобі потрібна картинка логотипу?" — Nginx віддає її сам (миттєво), не турбуючи Python.
- "Тобі потрібно розрахувати вартість кошика?" — Nginx розуміє, що це складно, і передає запит далі на Uvicorn (зазвичай на порт 8000).
- Uvicorn запускає код FastAPI, отримує результат і віддає його назад Nginx.
- 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. 💡 Мислення як у розробника
Як думають профі, коли налаштовують цю зв'язку?
-
"Розділяй і володарюй".
- Новачок: Намагається змусити FastAPI роздавати відеофайли.
- Профі: Знає, що Python — це для бізнес-логіки. Все, що є "файлом", має віддавати Nginx або CDN. Це економить CPU і гроші.
-
Безпека передусім.
- Nginx — це щит. Саме на ньому налаштовують HTTPS (SSL сертифікати). Ваш Python код навіть не знає, що з'єднання зашифроване. Він отримує вже "чистий" запит. Це називається SSL Termination.
-
Помилка новачка:
- Забути перезавантажити Nginx після зміни конфігу (
sudo systemctl reload nginx). Ви можете годину правити файл і не розуміти, чому нічого не змінюється. Завжди перевіряйте статус!
- Забути перезавантажити Nginx після зміни конфігу (
6. 🧩 Підсумок
Отже, що ми сьогодні зробили? Ми взяли наш "домашній" FastAPI і побудували навколо нього професійну інфраструктуру.
Тепер ви знаєте: 1. FastAPI (Uvicorn) — це шеф-кухар (готує контент). 2. Nginx — це менеджер залу (приймає гостей, фільтрує трафік, роздає статику). 3. Разом вони створюють швидкий, безпечний і надійний веб-сервер.
Що далі? Ви запитаєте: "Девіде, а що, якщо я хочу запустити це на іншому комп'ютері, і мені ліньки встановлювати бібліотеки?" О, це чудове питання. Саме для цього існує Docker та Docker Compose. Ми запакуємо наш Nginx і FastAPI у контейнери в наступному уроці.
А поки що — спробуйте "покласти" свій сервер і підняти його знову. Це найкращий спосіб навчання!
Це був CS50. Побачимось! 👋