Skip to content

Nginx SSL uvicorn fastapi

nagaevkirill edited this page May 27, 2025 · 4 revisions

создать python проект

apt update
apt upgrade
apt install python3.10-venv
apt install python3-pip -y
python3 -m venv api-mq-sender
cd api-mq-sender

добавить FastAPI и Uvicorn. Если еще не установлено, выполните:

pip install fastapi uvicorn

добавить main.py:

from fastapi import FastAPI
app = FastAPI()

@app.get("/")
async def root():
    return {"message": "Hello World"}

Запустите FastAPI приложение:

Bash

uvicorn main:app --host 0.0.0.0 --port 8000

Здесь main:app предполагает, что ваш файл называется main.py и содержит объект app из FastAPI.

Установка Nginx:

sudo apt update
sudo apt install nginx

Получение SSL-сертификата с помощью Certbot:

Установите Certbot и настройте сертификаты:

sudo apt install certbot python3-certbot-nginx

sudo certbot --nginx -d own.domain.com

Следуйте инструкциям для завершения получения сертификата. По итогу создается серт и происходит автоматическое конфигурирование дефолтных конфигов nginx. Можно зайти на сайт и убедиться, что работает редирект с 80 на 443 порт и подтягивается сертификат.

Откройте файл конфигурации

nano /etc/nginx/sites-available/default

server {
    listen 80;
    server_name my.domain.ru;

    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl; 
    server_name my.domain.ru; 

    ssl_certificate /etc/letsencrypt/live/my.domain.ru/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/my.domain.ru/privkey.pem;

    location / {
        proxy_pass http://127.0.0.1:8000;  # Uvicorn api server deployed
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

Активируйте сайт и перезапустите Nginx:

sudo systemctl restart nginx

После выполнения этих шагов ваше FastAPI приложение будет работать на порту 8000 и обрабатываться Nginx с редиректом на HTTPS.

sudo apt install ufw
ufw allow 80
ufw allow 22
ufw allow 443
ufw enable

создать скрипт запуска

nano /home/api-mq-sender/start_api_server.sh

вставить

#!/bin/bash

HOST="127.0.0.1"
PORT="8000"

nc -z -w5 $HOST $PORT
STATUS=$?

if [ $STATUS -ne 0 ]; then
  echo "Port $PORT is closed. Restart script start_api_server.sh"
  #/home/api-mq-sender/start_api_server.sh
  source /home/api-mq-sender/venv/bin/activate
  cd /home/api-mq-sender
  uvicorn main:app --host 0.0.0.0 --port 8000
else
  echo "Port $PORT is open. Status - Ok "
fi

выдать прав

chmod +x /home/api-mq-sender/start_api_server.sh

добавить в cron

crontab -e

строкb

@reboot /home/api-mq-sender/start_api_server.sh
*/1 * * * * /home/api-mq-sender/start_api_server.sh

Clone this wiki locally