FastAPI + NGINX + Gunicorn: le enseñará paso a paso cómo implementar una aplicación web Python de alto rendimiento

I. Introducción

Implementar una aplicación FastAPI en su servidor es una tarea compleja. Si no está familiarizado con tecnologías como NGINX , Gunicorn y Uvicorn , puede perder mucho tiempo. Si es nuevo en el lenguaje Python o desea utilizar Python para crear su propia aplicación web, el contenido de este artículo puede ahorrarle tiempo durante su primera implementación.

FastAPI es una de las bibliotecas de Python más populares para desarrollar aplicaciones API. Es conocido por su excelente rendimiento y facilidad de uso. Si utiliza modelos de aprendizaje automático en aplicaciones web, probablemente sea su herramienta preferida.

NGINX, Gunicorn y Uvicorn son tecnologías probadas que a menudo se utilizan como servidores proxy inversos y servidores ASGI para implementar aplicaciones web Python. Si está familiarizado con Django o Flask, probablemente haya oído hablar de algunos de ellos antes.

A continuación, mostraré cómo combinar estas herramientas para implementar una aplicación web FastAPI. Los siguientes son los contenidos principales:

  • Introduzca los conocimientos básicos de FastAPI, NGINX, Gunicorn y Uvicorn.

  • Configure Gunicorn + Uvicorn como servidor ASGI.

  • Configure NGINX como servidor proxy inverso.

  • Genere un certificado SSL gratuito con Let's Encrypt.

2. Introducción al marco técnico.

2.1 、 API rápida

FastAPI es un marco web moderno y de alto rendimiento para crear API en Python y se basa en sugerencias de tipo estándar.

Tiene las siguientes características principales:

  • Operación eficiente : con Starlette y pydantic, FastAPI proporciona un rendimiento excelente similar a NodeJS y Go. FastAPI es mucho más rápido que Flask; en realidad, es uno de los marcos web más rápidos para Python. El único marco que es más rápido que FastAPI es Starlette (FastAPI en realidad está construido sobre Starlette).

  • Desarrollo rápido : puede aumentar significativamente la velocidad de desarrollo.

  • Errores reducidos : Reduce la posibilidad de error humano.

  • Intuitivo y fácil de usar : admite potentes funciones de edición, autocompletado y menos tiempo de depuración.

  • Fácil de aprender : el diseño es simple y claro, por lo que podrá dedicar menos tiempo a leer la documentación.

  • Reducir la cantidad de código duplicado : se minimiza la duplicación de código.

  • Robusto y confiable : proporciona código listo para producción y generación automática de documentación interactiva.

  • Basado en estandarización : siga estándares abiertos como API, OpenAPI y JSON Schema.

El marco está diseñado para optimizar la experiencia del desarrollador, permitiéndole crear API con las mejores prácticas y listas para producción con código limpio.

2.2、Gunicornio

Gunicorn es una implementación de un servidor WSGI para aplicaciones Python.

Gunicorn es un servidor web compatible con WSGI para aplicaciones Python que recibe solicitudes enviadas desde el cliente al servidor web y las reenvía a la aplicación Python o al marco web , como Flask o Django, para atender la solicitud. Ejecute el código de aplicación apropiado .

2.3、Uvicornio

A diferencia del marco Flask, FastAPI no incluye ningún servidor de desarrollo integrado. Por tanto, necesitamos Uvicorn . Implementa el estándar ASGI y es increíblemente rápido. ASGI significa Interfaz de puerta de enlace de servidor asíncrono .

  • Uvicorn es una implementación de servidor web ASGI para Python.

  • Uvicorn actualmente soporta HTTP/1.1 y WebSockets.

2.4、Nginx

Nginx es un servidor web de marco asíncrono que también se puede utilizar como proxy inverso, equilibrador de carga y caché HTTP. El software fue creado por Igor Sysoev y lanzado públicamente por primera vez en 2004. La empresa del mismo nombre se fundó en 2011 para brindar soporte. Nginx es un software gratuito de código abierto publicado bajo los términos de una licencia similar a BSD. Una gran cantidad de servidores web utilizan Nginx, normalmente como equilibrador de carga.

Nginx tiene las siguientes características:

  • Más rápido : una sola solicitud recibirá una respuesta más rápida; en un entorno de alta concurrencia, Nginx tiene una respuesta más rápida que otros servidores WEB.

  • Alta escalabilidad : Nginx se basa en un diseño modular y consta de múltiples módulos con un acoplamiento extremadamente bajo, por lo que tiene una alta escalabilidad. Muchos sitios web con mucho tráfico tienden a desarrollar módulos personalizados que se adaptan a las características de su negocio.

  • Alta confiabilidad : la confiabilidad de Nginx proviene del excelente diseño de su código de marco central y la simplicidad del diseño de su módulo. Además, los módulos de uso común proporcionados por el funcionario son muy estables y cada proceso de trabajo es relativamente independiente. Cuando un proceso de trabajo falla, el proceso maestro puede iniciar rápidamente un nuevo subproceso de trabajo para brindar servicios.

  • Bajo consumo de memoria : en circunstancias normales, 10,000HTTP Keep-Aliveconexiones inactivas consumen solo la memoria en Nginx2.5MB, que es la base para que Nginx admita conexiones concurrentes altas; una sola máquina admite más de 100,000 conexiones concurrentes: en teoría, el límite superior de conexiones concurrentes admitidas por Nginx Dependiendo de la memoria, 100.000 está lejos del límite.

  • Implementación en caliente : el diseño de separación del proceso maestro y el proceso de trabajo permite a Nginx proporcionar una función de implementación en caliente, es decir, actualizar el archivo ejecutable de Nginx bajo la premisa de un servicio ininterrumpido las 24 horas del día, los 7 días de la semana. Por supuesto, también admite funciones como actualizar elementos de configuración y reemplazar archivos de registro sin detener el servicio.

  • El acuerdo de licencia BSD más liberal : Esta es una poderosa fuerza impulsora para el rápido desarrollo de Nginx. El acuerdo de licencia de BSD no solo permite a los usuarios usar Nginx de forma gratuita, sino que también les permite usar o modificar directamente el código fuente de Nginx en sus propios proyectos y luego publicarlo.

3. Configuración de seguridad del servidor

Si su aplicación está implementada en una LAN, es posible que no necesite prestar atención a esto por el momento, pero si su aplicación está implementada en un servidor en la nube o VPS, para garantizar la seguridad de su aplicación, se recomienda que Aún necesita realizar algunas configuraciones de seguridad necesarias en el servidor para evitar ser atacado.

3.1. Habilitar actualizaciones automáticas

Primero, asegúrese de que su servidor tenga el software más reciente:

sudo apt update && sudo apt upgrade -y

Los siguientes son comandos comunes que verá cuando utilice servidores basados ​​en Debian:

  1. Utilice el comando sudo apt updatepara actualizar el índice de la lista de paquetes en su sistema.

  2. Utilice el comando sudo apt upgrade -ypara actualizar los paquetes instalados a la última versión. Utilice -yla bandera para omitir el paso de confirmación y proceder directamente a la instalación.

A continuación, configure las actualizaciones de seguridad automáticas para no tener que realizarlas manualmente. Para hacer esto necesita instalar y habilitar unnattended-upgrades:

sudo apt install unattended-upgrades

Una vez completada la instalación, edite el archivo /etc/apt/apt.conf.d/20auto-upgradesy configúrelo de acuerdo con la siguiente configuración:

APT::Periodic::Update-Package-Lists "1";  # 每天自动更新软件包列表
APT::Periodic::Unattended-Upgrade "1";    # 系统将自动升级到最新版本的软件包
APT::Periodic::AutocleanInterval "7";     # 每周运行一次自动清理操作,删除旧的和不必要的包文件

Finalmente, /etc/apt/apt.conf.d/50unattended-upgradesrealice modificaciones en el archivo para garantizar que el sistema se reinicie automáticamente cuando se requiera una actualización del kernel:

Unattended-Upgrade::Automatic-Reboot "true";

Después de completar los pasos anteriores, su sistema realizará automáticamente actualizaciones de seguridad y se reiniciará si es necesario para aplicar las actualizaciones del kernel.

3.2 Crear un usuario no root

Para reducir el daño causado por los ataques de piratas informáticos, es necesario crear un usuario que no sea root. A continuación se muestran algunos comandos para crear un usuario no root y configurar el inicio de sesión con clave SSH:

  • Cree un nuevo usuario no root:
sudo adduser fastapi-user # 将fastapi-user替换为您喜欢的用户名
  • Agregue este usuario al grupo sudo para obtener derechos de administrador:
sudo usermod -aG sudo fastapi-user # 将fastapi-user替换为您创建的用户名
  • Inicie sesión en el servidor utilizando el usuario recién creado:
su - fastapi-user # 使用新用户登录,将fastapi-user替换为您创建的用户名
  1. Configure la autenticación mediante claves SSH:

Si aún no tiene una clave SSH, abra una terminal en su máquina local y ejecute el siguiente comando (tenga en cuenta que debe reemplazar su-correo-electrónico-reemplazar-con-su-correo electrónico con su correo electrónico real):

ssh-keygen -t ed25519 -C "your-email-replace-with-your-email"

Esto generará un par de claves SSH.

Copie la clave SSH pública y péguela en el servidor remoto (tenga en cuenta que debe reemplazar su clave pública con su clave pública con la clave pública real):

echo "your-public-key-replace-with-your-public-key" >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
  • Deshabilite la autenticación de inicio de sesión y contraseña de root:

Edite el archivo con permisos sudo /etc/ssh/sshd_config(por ejemplo, usando sudo vim /etc/ssh/sshd_configel comando).

Cambie los valores de las siguientes líneas para mostrar:

PermitRootLogin no
PasswordAuthentication no

Esto deshabilitará el inicio de sesión de root y el uso de contraseñas para la autenticación SSH.

  • Después de guardar y cerrar el archivo, reinicie el servicio SSH para que los cambios surtan efecto:
sudo service ssh restart

Una vez que complete los pasos anteriores, inicie sesión con su usuario no root recién creado y su clave SSH, y asegúrese de que el inicio de sesión de root y la autenticación de contraseña estén deshabilitados.

3.3 Otras medidas de seguridad

La mayoría de los proveedores de la nube ofrecen servicios de firewall. Si su proveedor de nube no proporciona servicios de firewall, puede configurar manualmente el firewall para limitar el tráfico entrante solo a los puertos necesarios, como los puertos 80 , 443 y 22 .

Además, puede instalar y configurar fail2ban para evitar ataques de autenticación de fuerza bruta. Fail2ban es una herramienta para proteger servidores Linux de intentos de inicio de sesión maliciosos. Supervisa los archivos de registro del sistema y prohíbe automáticamente las direcciones IP de origen según reglas establecidas.

Si desea obtener más información sobre las mejores prácticas para proteger sus servidores Linux, consulte esta guía de Linode. Estas guías le proporcionarán información detallada sobre cómo configurar y mejorar la seguridad del servidor.

4. Instalar herramientas de software

Para instalar las herramientas de software necesarias, siga estos pasos:

4.1 Instalar Python:

sudo add-apt-repository ppa:deadsnakes/ppa
sudo apt update
sudo apt install python3.11 python3.11-venv -y

4.2 Instalar Supervisor y NGINX:

sudo apt install supervisor nginx -y

Supervisor es un sistema de control de procesos para sistemas operativos tipo Unix (incluido Linux) que se utiliza para monitorear y administrar procesos de programas. NGINX es un software multipropósito de uso común que a menudo se usa como proxy inverso para implementar aplicaciones web.

4.3 Habilitar e iniciar Supervisor:

sudo systemctl enable supervisor
sudo systemctl start supervisor

El uso enabledel comando garantizará que Supervisor se inicie automáticamente al arrancar y el uso startdel comando inicie el servicio de Supervisor inmediatamente.

Después de completar los pasos anteriores, ha instalado correctamente Python, Supervisor y NGINX, y ha habilitado e iniciado el servicio Supervisor.

5. Configure la aplicación FastAPI

Primero, clone la aplicación de muestra en /home/fastapi-userun directorio:

git clone https://github.com/dylanjcastillo/fastapi-nginx-gunicorn

Esto clonará el código del repositorio público. Si está implementando una aplicación desde un repositorio privado de GitHub, configure una clave de implementación de GitHub y use esa clave para clonar el repositorio.

A continuación, cree un entorno virtual y actívelo:

cd /home/fastapi-user/fastapi-nginx-gunicorn
python3.11 -m venv .venv
source .venv/bin/activate

Estos comandos lo llevarán al directorio del proyecto, crearán un entorno virtual allí y lo activarán. Una vez activado con éxito, la línea de comando debería aparecer frente a usted .venv.

Ahora, instale los paquetes requeridos usando las dependencias especificadas en el archivo requisitos.txt :

pip install -r requirements.txt

Esto instalará paquetes como fastapi , gunicorn y uvicorn en el entorno virtual actual .

Para verificar que todo salió bien ejecuta la aplicación:

uvicorn main:app

No debería haber errores al ejecutar este comando. También puede verificar que esté funcionando abriendo una nueva ventana de terminal, conectándose al servidor y realizando una solicitud usando el siguiente comando:

curl http://localhost:8000

Debería recibir la siguiente respuesta:

{"message":"It's working!"}

Ahora que ha ejecutado con éxito su aplicación FastAPI, configurará Gunicorn como servidor WSGI.

6. Configurar Gunicorn

Hay dos pasos para configurar Gunicorn. Primero, especifique explícitamente los requisitos de configuración de Gunicorn . En segundo lugar, configure el programa Supervisor para ejecutar Gunicorn.

6.1 Configuración de Gunicorn

Primero, cree un archivo llamado gunicorn_start en el directorio del proyecto :

vim gunicorn_start

Luego, agregue el siguiente contenido al archivo:

#!/bin/bash

NAME=fastapi-app
DIR=/home/fastapi-user/fastapi-nginx-gunicorn
USER=fastapi-user
GROUP=fastapi-user
WORKERS=3
WORKER_CLASS=uvicorn.workers.UvicornWorker
VENV=$DIR/.venv/bin/activate
BIND=unix:$DIR/run/gunicorn.sock
LOG_LEVEL=error

cd $DIR
source $VENV

exec gunicorn main:app \
  --name $NAME \
  --workers $WORKERS \
  --worker-class $WORKER_CLASS \
  --user=$USER \
  --group=$GROUP \
  --bind=$BIND \
  --log-level=$LOG_LEVEL \
  --log-file=-

Aquí hay una explicación de su configuración:

  • La línea 1 indica que este script será ejecutado por el shell bash.

  • Las líneas 3 a 11 especifican las opciones de configuración que pasará a Gunicorn. La mayoría de los parámetros son intuitivos, excepto WORKERS , WORKER_CLASS y BIND :

  • TRABAJADORES : Defina la cantidad de procesos de trabajo a utilizar, generalmente se recomienda la cantidad de núcleos de CPU + 1.

  • WORKER_CLASS : especifica el tipo de proceso de trabajo que se utilizará. En este ejemplo, especifica Uvicorn Worker como servidor ASGI.

  • BIND : Especifica el socket del servidor al que está vinculado Gunicorn.

  • Las líneas 13 y 14 cambian la ubicación actual al directorio del proyecto y activan el entorno virtual.

  • Las líneas 16 a 24 ejecutan Gunicorn con los parámetros especificados.

Guarde y cierre el archivo. Luego, hazlo ejecutable ejecutando el siguiente comando:

chmod u+x gunicorn_start

Finalmente, cree una carpeta en el directorio del proyecto para almacenar los archivos de socket Unix que definió en los parámetros BIND:

mkdir run

6.2 Configurar supervisor

Primero, cree un directorio llamado logs en el directorio del proyecto para almacenar los registros de errores de la aplicación:

mkdir logs

A continuación, cree el archivo de configuración del Supervisor ejecutando el siguiente comando:

sudo vim /etc/supervisor/conf.d/fastapi-app.conf

Copie y pegue lo siguiente en el archivo:

[program:fastapi-app]
command=/home/fastapi-user/fastapi-nginx-gunicorn/gunicorn_start
user=fastapi-user
autostart=true
autorestart=true
redirect_stderr=true
stdout_logfile=/home/fastapi-user/fastapi-nginx-gunicorn/logs/gunicorn-error.log

Este archivo de configuración especifica el script gunicorn_start creado anteriormente y establece fastapi-user como usuario. Supervisor iniciará la aplicación cuando se inicie el servidor y la reiniciará si falla. El registro de errores se registrará en el archivo logs/gunicorn-error.log en el directorio del proyecto.

Vuelva a cargar la configuración del Supervisor y reinicie el servicio ejecutando los siguientes comandos:

sudo supervisorctl reread
sudo supervisorctl update

Finalmente, puede verificar el estado de su programa ejecutando el siguiente comando:

sudo supervisorctl status fastapi-app

Si todo va bien, el estado del servicio fastapi-app debería mostrar EN EJECUCIÓN .

También puede probarlo abriendo una nueva ventana de terminal, conectándose al servidor y realizando una solicitud GET usando:

curl --unix-socket /home/fastapi-user/fastapi-nginx-gunicorn/run/gunicorn.sock localhost

Deberías ver el siguiente resultado:

{"message":"It's working!"

Finalmente, si realiza cambios en su código, puede reiniciar el servicio para aplicar los cambios ejecutando:

sudo supervisorctl restart fastapi-app

Ahora tienes una aplicación que utiliza Gunicorn y Uvicorn como servidor ASGI. A continuación, configurará un servidor proxy inverso utilizando NGINX.

7. Configurar NGINX

Cree un nuevo archivo de configuración NGINX para su proyecto :

sudo vim /etc/nginx/sites-available/fastapi-app

Abra el archivo de configuración de NGINX y pegue lo siguiente:

upstream app_server {
    server unix:/home/fastapi-user/fastapi-nginx-gunicorn/run/gunicorn.sock fail_timeout=0;
}

server {
    listen 80;

    # add here the ip address of your server
    # or a domain pointing to that ip (like example.com or www.example.com)
    server_name XXXX;

    keepalive_timeout 5;
    client_max_body_size 4G;

    access_log /home/fastapi-user/fastapi-nginx-gunicorn/logs/nginx-access.log;
    error_log /home/fastapi-user/fastapi-nginx-gunicorn/logs/nginx-error.log;

    location / {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_redirect off;

        if (!-f $request_filename) {
            proxy_pass http://app_server;
            break;
        }
        }
}

Este es el archivo de configuración de NGINX. Así es como funciona:

  • Las líneas 1 a 3 app_serverdefinen un grupo de servidores llamado NGINX que representará las solicitudes. Las solicitudes se redirigen al archivo de socket Unix ubicado en /home/fastapi-user/fastapi-nginx-gunicorn/run/gunicorn.sock. La configuraciónfail_timeout=0 le dice a NGINX que no trate al servidor como fallido incluso si no responde.

  • Las líneas 1 a 5 definen la configuración del servidor virtual que NGINX utilizará para manejar las solicitudes. En este ejemplo, escucha en el puerto 80. Reemplace XXXX con su IP o nombre de sitio.

  • Las líneas 12 y 13 especifican keepalive_timeoutestablecer el tiempo máximo que un cliente puede mantener abierta una conexión persistente y client_max_body_sizeestablecer el límite en el tamaño del cuerpo de solicitud del cliente que permite NGINX.

  • Las líneas 15 y 16 especifican dónde NGINX escribirá sus registros de acceso y errores.

  • Las líneas 18 a 27 definen cómo NGINX manejará las solicitudes al directorio raíz /. Proporciona algunas especificaciones para manejar los encabezados y configura una directiva para enviar la solicitud al que definió app_serveranteriormente.

Habilite la configuración del sitio creando un enlace simbólico desde el archivo ejecutando el siguiente comando sites-available:sites-enabled

sudo ln -s /etc/nginx/sites-available/fastapi-app /etc/nginx/sites-enabled/

Pruebe si el archivo de configuración es normal y reinicie NGINX:

sudo nginx -tsudo systemctl restart nginx

Si todo salió bien, ahora deberías poder descargarlo desde tu navegador o usando curl. Deberías ver el siguiente resultado nuevamente:

{"message":"It's working!"}

Ahora debería tener su aplicación FastAPI ejecutándose con Gunicorn+Uvicorn como servidor ASGI y NGINX frente a ellos como proxy inverso.

7.1 Error de permiso

Si recibe un error de permiso que indica que NGINX no puede acceder al socket Unix, puede agregar el usuario www-data (generalmente el usuario bajo el cual se ejecuta el proceso NGINX) al grupo de usuarios fastapi. Puede utilizar el siguiente comando:

sudo usermod -aG fastapi-user www-data

Si no ha comprado un nombre de dominio para su aplicación API, no es necesario seguir leyendo. Si ya tiene un nombre de dominio, continúe con el siguiente paso para obtener un certificado SSL y habilitar HTTPS.

8. Utilice Certbot para obtener un certificado SSL gratuito

Esto sólo se aplica al nombre de dominio para el que desea obtener un certificado SSL. Si está utilizando Ubuntu , puede omitir este paso. De lo contrario, primero necesitas instalar snapd :

sudo apt install snapd

A continuación, asegúrese de tener la última versión disponible:

sudo snap install core; sudo snap refresh core

Instale Certbot y asegúrese de que certbotel comando sea ejecutable:

sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot

A continuación, genere un certificado para su nombre de dominio ejecutando el siguiente comando de forma interactiva:

sudo certbot --nginx

Finalmente, Certbot se encargará automáticamente de la renovación de su certificado. Para probar si funciona, ejecute el siguiente comando:

sudo certbot renew --dry-run

Si todo va bien, deberías ver el mensaje Felicitaciones, todas las renovaciones simuladas se realizaron correctamente....

Ahora debería poder enviar solicitudes correctamente a través de HTTPS.

9. Conclusión

Este artículo presenta cómo utilizar NGINX , Gunicorn y Uvicorn para implementar aplicaciones FastAPI. FastAPI es uno de los marcos web de Python más populares. Se ha convertido en la primera opción para implementar aplicaciones web basadas en aprendizaje automático, por lo que si desea seguir prestando atención al campo de la IA y realizar algunas prácticas de desarrollo de aplicaciones, será útil estar familiarizado con él.

En este artículo aprendiste:

  • Por qué y cuándo debería utilizar FastAPI, NGINX, Gunicorn y Uvicorn .

  • Cómo configurar Gunicorn+Uvicorn como servidor ASGI .

  • Cómo utilizar Supervisor para ejecutar Gunicorn .

  • Cómo utilizar certbot para configurar NGINX y generar un certificado SSL gratuito .

Si está interesado en este artículo y desea obtener más información sobre las habilidades prácticas en el campo de la IA, puede seguir la cuenta pública "Technology Frenzy AI" . Aquí puede ver los artículos más recientes y actuales y tutoriales de casos prácticos en el campo AIGC.

Supongo que te gusta

Origin blog.csdn.net/FrenzyTechAI/article/details/132696546
Recomendado
Clasificación