Aller au contenu

Exécuter un serveur manuellement - Uvicorn

La principale chose dont vous avez besoin pour exécuter une application FastAPI sur une machine serveur distante est un programme serveur ASGI tel que Uvicorn.

Il existe 3 principales alternatives :

  • Uvicorn¬†: un serveur ASGI haute performance.
  • Hypercorn¬†: un serveur ASGI compatible avec HTTP/2 et Trio entre autres fonctionnalit√©s.
  • Daphne¬†: le serveur ASGI con√ßu pour Django Channels.

Machine serveur et programme serveur

Il y a un petit d√©tail sur les noms √† garder √† l'esprit. ūüí°

Le mot "serveur" est couramment utilisé pour désigner à la fois l'ordinateur distant/cloud (la machine physique ou virtuelle) et également le programme qui s'exécute sur cette machine (par exemple, Uvicorn).

Gardez cela à l'esprit lorsque vous lisez "serveur" en général, cela pourrait faire référence à l'une de ces deux choses.

Lorsqu'on se r√©f√®re √† la machine distante, il est courant de l'appeler serveur, mais aussi machine, VM (machine virtuelle), nŇďud. Tout cela fait r√©f√©rence √† un type de machine distante, ex√©cutant Linux, en r√®gle g√©n√©rale, sur laquelle vous ex√©cutez des programmes.

Installer le programme serveur

Vous pouvez installer un serveur compatible ASGI avec :

  • Uvicorn, un serveur ASGI rapide comme l'√©clair, bas√© sur uvloop et httptools.
$ pip install "uvicorn[standard]"

---> 100%

Astuce

En ajoutant standard, Uvicorn va installer et utiliser quelques dépendances supplémentaires recommandées.

Cela inclut uvloop, le remplaçant performant de asyncio, qui fournit le gros gain de performance en matière de concurrence.

  • Hypercorn, un serveur ASGI √©galement compatible avec HTTP/2.
$ pip install hypercorn

---> 100%

...ou tout autre serveur ASGI.

Exécutez le programme serveur

Vous pouvez ensuite exécuter votre application de la même manière que vous l'avez fait dans les tutoriels, mais sans l'option --reload, par exemple :

$ uvicorn main:app --host 0.0.0.0 --port 80

<span style="color: green;">INFO</span>:     Uvicorn running on http://0.0.0.0:80 (Press CTRL+C to quit)
$ hypercorn main:app --bind 0.0.0.0:80

Running on 0.0.0.0:8080 over http (CTRL + C to quit)

Warning

N'oubliez pas de supprimer l'option --reload si vous l'utilisiez.

L'option --reload consomme beaucoup plus de ressources, est plus instable, etc.

Cela aide beaucoup pendant le développement, mais vous ne devriez pas l'utiliser en production.

Hypercorn avec Trio

Starlette et FastAPI sont basés sur AnyIO, qui les rend compatibles avec asyncio, de la bibliothèque standard Python et Trio.

Néanmoins, Uvicorn n'est actuellement compatible qu'avec asyncio, et il utilise normalement uvloop, le remplaçant hautes performances de asyncio.

Mais si vous souhaitez utiliser directement Trio, vous pouvez utiliser Hypercorn car il le prend en charge. ‚ú®

Installer Hypercorn avec Trio

Vous devez d'abord installer Hypercorn avec le support Trio :

$ pip install "hypercorn[trio]"
---> 100%

Exécuter avec Trio

Ensuite, vous pouvez passer l'option de ligne de commande --worker-class avec la valeur trio :

$ hypercorn main:app --worker-class trio

Et cela démarrera Hypercorn avec votre application en utilisant Trio comme backend.

Vous pouvez d√©sormais utiliser Trio en interne dans votre application. Ou mieux encore, vous pouvez utiliser AnyIO pour que votre code reste compatible avec Trio et asyncio. ūüéČ

Concepts de déploiement

Ces exemples lancent le programme serveur (e.g. Uvicorn), démarrant un seul processus, sur toutes les IPs (0.0. 0.0) sur un port prédéfini (par example, 80).

C'est l'idée de base. Mais vous vous préoccuperez probablement de certains concepts supplémentaires, tels que ... :

  • la s√©curit√© - HTTPS
  • l'ex√©cution au d√©marrage
  • les red√©marrages
  • la r√©plication (le nombre de processus en cours d'ex√©cution)
  • la m√©moire
  • les √©tapes pr√©c√©dant le d√©marrage

Je vous en dirai plus sur chacun de ces concepts, sur la fa√ßon de les aborder, et donnerai quelques exemples concrets avec des strat√©gies pour les traiter dans les prochains chapitres. ūüöÄ