Maison développement back-end Tutoriel Python Comment utiliser Nginx + UWSGI

Comment utiliser Nginx + UWSGI

Apr 05, 2017 pm 02:56 PM

Après de nombreuses expérimentations (sur disqus.com et getsentry.com), je peux définitivement dire : uwsgi devrait devenir le standard dans le monde Python. Combinez-le avec nginx et vous obtiendrez une meilleure expérience de performances sur les threads (ou non-threads) sur les applications Web basées sur Python.

Mise à jour : ignorez le vieux dicton "toute métrique que vous donnez est lente", par requêtes, je veux dire ici les nœuds backend, ils gèrent les événements entrants (requêtes allant de 20 Ko à 1 Mo), sautant à travers différents sauts dans le réseau Autorisation et quota politiques, et la plupart forment des opérations de file d’attente. Déchargez-vous autant de charge de travail que possible. (Il y a un problème avec la traduction de ce paragraphe, merci de vous référer au texte original, ndlr du traducteur)

Stratégie de services

Il existe déjà plusieurs façons d'exécuter des applications Python. Je ne vais pas utiliser mod_wsgi, et surtout, je n'essaie pas d'expliquer comment fonctionne le modèle d'événement. Je ne pense pas qu'ils soient encore utilisés dans le monde Python, donc le sujet de cet article ne concerne pas les applications Python traditionnelles threadées (ou multi-processus).

Au lieu de cela, je me concentrerai sur les deux solutions les plus populaires que je connais le mieux : gunicorn et uwsgi.

Gunicorn (serveur wsgi pour plateforme Python UNIX)

En regardant le passé, la solution pour le serveur Web de Python était essentiellement mod_wsgi. L’une des méthodes les plus populaires (ou considérées comme à la mode) récemment est le Gunicorn.

En fait, je recommande quand même d'utiliser gunicorn, ce qui réduit considérablement les désagréments : il intègre magnifiquement Django et est facile à mettre en place.

Il possède également 10 % des mêmes options de configuration que uwsgi (ce qui est une bonne chose pour certaines personnes), mais à part cela, en comparaison, il offre presque les mêmes fonctionnalités de base que uwsgi (ou tout autre serveur Web Python).

uwsgi

À mon avis, c'est la seule option, de Gunicorn à uwsgi. Il y aura des performances plus élevées, plus d'options de configuration faciles à comprendre et la possibilité d'interagir avec nginx via le protocole ajoute également des avantages.
Sa configuration est également assez simple, il suffit de trouver un article qui y est lié, nous y reviendrons plus tard.
J'ai commencé à utiliser uwsgi pour exécuter certaines applications, et j'ai utilisé –processes=10 et –threads=10 pour tester le multi-CPU du serveur. Il y avait deux objectifs :

  • . Soutien


  • Testez la possibilité de réduire l'utilisation de la mémoire


  • Tester la prise en charge de la sécurité des fils

(Quant à savoir si ces tests en valent la peine, DISQUS s'exécute dans un seul thread. Je souhaite le garder aussi simple que possible et maximiser les capacités de chaque nœud)

Itération continue vers le succès

Nous avons réduit le temps de réponse moyen de l'API à moins de 40 ms, ce dont je suis très fier. Le temps de réponse de l'API dont je parle ici fait référence au temps qu'il faut entre la requête arrivant sur le serveur Python et le moment où le serveur renvoie la réponse au proxy.

Malheureusement, lorsque nous avons commencé à recevoir de plus en plus de trafic et à connaître des pics d'accès, les temps de réponse ont commencé à se détériorer. Les temps de réponse fluctuants ne correspondaient plus à nos attentes initiales, même si nous avions encore environ 30 % de la mémoire sur le nœud de service et 60 %. % des ressources sont disponibles.

Après de nombreux ajustements, nous avons désactivé un grand nombre de processus uwsgi et laissé nginx les équilibrer (auparavant, nous laissions uwsgi lui-même équilibrer la charge).

Cela signifie qu'au lieu de faire uwsgiprocess=10, nous exécutons 10 instances uwsgi distinctes au lieu de --processes=10.

Le résultat est un temps de réponse moyen magnifique et cohérent de 20 ms.

Temps de réponse de l'API

Assemblez-les

J'aime faire les choses plutôt que d'en parler, alors je vais vous donner ici une configuration réelle de nos serveurs en ligne.

nginx

Le premier élément de configuration est Nginx. Nous devons réellement calculer et ajouter le nombre de backends de processus uwsgi, donc les choses sont un peu compliquées.

​Nous créons d'abord une liste de configuration sur notre page web :

# recipes/web.rb

hosts = (0..(node[:getsentry][:web][:processes] - 1)).to_a.map do |x|
  port = 9000 + x
  "127.0.0.1:#{port}"
end

template "#{node['nginx']['dir']}/sites-available/getsentry.com" do
  source "nginx/getsentry.erb"
  owner "root"
  group "root"
  variables(
    :hosts => hosts
  )
  mode 0644
  notifies :reload, "service[nginx]"
end
Copier après la connexion

La configuration de Nginx est très simple :

# templates/getsentry.erb

upstream internal {
<% @hosts.each do |host| %>
  server <%= host %>;
<% end %>
}

server {
  location / {
    uwsgi_pass         internal;

    uwsgi_param   Host                 $host;
    uwsgi_param   X-Real-IP            $remote_addr;
    uwsgi_param   X-Forwarded-For      $proxy_add_x_forwarded_for;
    uwsgi_param   X-Forwarded-Proto    $http_x_forwarded_proto;

    include uwsgi_params;
  }
}
Copier après la connexion

Nous avons maintenant défini le nombre d'hôtes uwsgi et attribué des valeurs de poids, en commençant par le port 9000, qui sont les adresses de socket utilisées par la configuration uwsgi.

uwsgi

D'un autre côté, nous utilisons superviseur pour contrôler le processus uwsg, qui est également très simple :

# recipes/web.rb

command = "/srv/www/getsentry.com/env/bin/uwsgi -s 127.0.0.1:90%(process_num)02d --need-app --disable-logging --wsgi-file getsentry/wsgi.py --processes 1 --threads #{node[&#39;getsentry&#39;][&#39;web&#39;][&#39;threads&#39;]}"

supervisor_service "web" do
  directory "/srv/www/getsentry.com/current/"
  command command
  user "dcramer"
  stdout_logfile "syslog"
  stderr_logfile "syslog"
  startsecs 10
  stopsignal "QUIT"
  stopasgroup true
  killasgroup true
  process_name &#39;%(program_name)s %(process_num)02d&#39;
  numprocs node[&#39;getsentry&#39;][&#39;web&#39;][&#39;processes&#39;]
end
Copier après la connexion

Sélection du lieu

À moins que quelqu'un ne propose un argument très convaincant pour expliquer pourquoi il devrait y avoir un autre moyen (ou quelque chose qui ne fonctionne pas dans ce cas), j'aimerais entendre parler de ce modèle à mesure que le monde Python devient plus standard. À tout le moins, j'aimerais voir l'étincelle d'un débat sur la manière d'améliorer la gestion des processus au sein de uwsgi.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌
Will R.E.P.O. Vous avez un jeu croisé?
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Comment vérifier si Nginx est démarré Comment vérifier si Nginx est démarré Apr 14, 2025 pm 01:03 PM

Comment confirmer si Nginx est démarré: 1. Utilisez la ligne de commande: SystemCTl Status Nginx (Linux / Unix), netStat -ano | Findstr 80 (Windows); 2. Vérifiez si le port 80 est ouvert; 3. Vérifiez le message de démarrage NGINX dans le journal système; 4. Utilisez des outils tiers, tels que Nagios, Zabbix et Icinga.

Comment résoudre le problème du domaine croisé nginx Comment résoudre le problème du domaine croisé nginx Apr 14, 2025 am 10:15 AM

Il existe deux façons de résoudre le problème du domaine transversal NGINX: modifiez les en-têtes de réponse transversale: ajoutez des directives pour autoriser les demandes de domaine croisé, spécifier des méthodes et des en-têtes autorisés et définir le temps du cache. Utilisez le module CORS: Activez les modules et configurez les règles CORS pour permettre des demandes, des méthodes, des en-têtes et du temps de cache.

Comment démarrer Nginx dans Linux Comment démarrer Nginx dans Linux Apr 14, 2025 pm 12:51 PM

Étapes pour démarrer Nginx dans Linux: Vérifiez si Nginx est installé. Utilisez SystemCTL Start Nginx pour démarrer le service NGINX. Utilisez SystemCTL Activer Nginx pour activer le démarrage automatique de Nginx au démarrage du système. Utilisez SystemCTL Status Nginx pour vérifier que le démarrage est réussi. Visitez http: // localhost dans un navigateur Web pour afficher la page de bienvenue par défaut.

Comment configurer Nginx dans Windows Comment configurer Nginx dans Windows Apr 14, 2025 pm 12:57 PM

Comment configurer Nginx dans Windows? Installez Nginx et créez une configuration d'hôte virtuelle. Modifiez le fichier de configuration principale et incluez la configuration de l'hôte virtuel. Démarrer ou recharger nginx. Testez la configuration et affichez le site Web. Activer sélectivement SSL et configurer les certificats SSL. Définissez sélectivement le pare-feu pour permettre le trafic Port 80 et 443.

Comment vérifier si Nginx est démarré? Comment vérifier si Nginx est démarré? Apr 14, 2025 pm 12:48 PM

Dans Linux, utilisez la commande suivante pour vérifier si Nginx est démarré: SystemCTL Status Nginx Juges Basé sur la sortie de la commande: si "Active: Active (Running)" s'affiche, Nginx est démarré. Si "Active: Inactive (Dead)" est affiché, Nginx est arrêté.

Comment vérifier l'état de course de Nginx Comment vérifier l'état de course de Nginx Apr 14, 2025 am 11:48 AM

Les méthodes pour afficher l'état en cours d'exécution de Nginx sont: utilisez la commande PS pour afficher l'état du processus; Afficher le fichier de configuration Nginx /etc/nginx/nginx.conf; Utilisez le module d'état NGINX pour activer le point de terminaison d'état; Utilisez des outils de surveillance tels que Prometheus, Zabbix ou Nagios.

Comment démarrer le serveur Nginx Comment démarrer le serveur Nginx Apr 14, 2025 pm 12:27 PM

Le démarrage d'un serveur Nginx nécessite différentes étapes en fonction des différents systèmes d'exploitation: Système Linux / Unix: Installez le package NGINX (par exemple, en utilisant Apt-Get ou Yum). Utilisez SystemCTL pour démarrer un service NGINX (par exemple, sudo systemctl start nginx). Système Windows: téléchargez et installez les fichiers binaires Windows. Démarrer Nginx à l'aide de l'exécutable Nginx.exe (par exemple, nginx.exe -c conf \ nginx.conf). Peu importe le système d'exploitation que vous utilisez, vous pouvez accéder au serveur IP

Comment résoudre l'erreur Nginx304 Comment résoudre l'erreur Nginx304 Apr 14, 2025 pm 12:45 PM

Réponse à la question: 304 Erreur non modifiée indique que le navigateur a mis en cache la dernière version de ressource de la demande du client. Solution: 1. Effacer le cache du navigateur; 2. Désactiver le cache du navigateur; 3. Configurer Nginx pour permettre le cache client; 4. Vérifier les autorisations du fichier; 5. Vérifier le hachage du fichier; 6. Désactiver le CDN ou le cache proxy inversé; 7. Redémarrez Nginx.

See all articles