[PYTHON] Mémo de réglage UWSGI lors d'un fonctionnement correct

J'ai créé un backend pour une certaine application avec Flask + uWSGI + Nginx, alors j'ai résumé ce que j'ai fait.

Coopération avec Nginx

Comment se connecter avec le protocole wsgi

nginx.conf


location / {
    include uwsgi_params;
    uwsgi_pass 127.0.0.1:3031;
}

uwsgi.ini


socket=127.0.0.1:3031

En passant, avec ce paramètre, je ne vois rien même si je frappe http://127.0.0.1:3031 avec un navigateur, en disant que seul uWSGI est le débogage de débogage. J'ai été accro pendant quelques minutes sans connaître la différence entre les options uwsgi socket et http.

Comment se connecter en tant que proxy http

nginx.conf


location / {
    include uwsgi_params;
    proxy_pass http://127.0.0.1:3031;
}

uwsgi.ini


http=127.0.0.1:3031

Proxy intuitif. Au début, je pensais que c'était le seul moyen. C'est celui que vous pouvez voir sur http://127.0.0.1:3031.

Méthode de connexion avec prise (adoptée)

Fondamentalement, cela convient car il ne consomme pas de numéro de port supplémentaire lors de la publication de plusieurs applications. Ceci est adopté.

nginx.conf


location / {
    include uwsgi_params;
    uwsgi_pass unix:/path/to/app/app.sock;
}

uwsgi.ini


socket=/path/to/app/app.sock

uWSGI Emperor

Utilisez-le car il est pratique lors de la gestion de plusieurs applications avec uWSGI.

Référence: http://qiita.com/5t111111/items/e170fead91261621b054#1-8

Le démarrage automatique est également devenu plus facile!

Paramètres de réglage fin

process, limit-as, max-requests, harakiri. hara-kiri.

Référence: http://docs.djangoproject.jp/en/latest/howto/deployment/wsgi/uwsgi.html

C'est un site Django, mais s'il s'agit d'une application wsgi, Flask est également utile. Au fait, daemonize et master utilisent Emperor, donc ils ne sont pas activés. Je pense que c'est probablement le cas, mais je suis désolé si c'est différent. J'attends Tsukkomi.

Ajustez les paramètres lors d'un test de charge.

Rechargement UWSGI lors du déploiement

Même si le fichier est modifié, il ne sera pas reflété, donc

uwsgi.ini


touch-reload=/path/to/app/reload.trigger

Quoi qu'il en soit, si vous touchez / chemin / vers / app / reload.trigger au moment du déploiement, uWSGI se rechargera à la prochaine réception de la demande. J'ai décidé de mettre la touche dans le script de déploiement.

Référence: http://field-notes.hatenablog.jp/entry/2012/05/09/115600

(Une autre solution) Surveillez le fichier. Référence: http://d.hatena.ne.jp/dayflower/20121017/1350447805

Ne perdez pas la trace des fichiers journaux avec la rotation des journaux

Le gars qui devient une fille après la sortie.

uwsgi.ini


touch-logreopen=/path/to/app/logreopen.trigger

En tous cas,

/path/to/uwsgi.log {
    daily
    rotate 7
    missingok
    notifempty
    compress
    sharedscripts
    size 1M
    postrotate
        touch /path/to/app/logreopen.trigger
    endscript
}

Référence: http://taichino.com/memo/3843

(Ajout) Après tout, j'ai écrit que ça ressemble à ça

/etc/nginx/conf.d/sample_nginx.conf

sample_nginx.conf


#Je n'aime pas ça quand je suis frappé par IP. Tu n'as pas à
server {
    listen  80 default_server;
    server_name _;
    root    /var/app/dummy;
    index index.html;
}

server {
    listen      80;
    server_name sample.com;
    charset     utf-8;
    client_max_body_size 75M;

    location / { try_files $uri @uwsgi; }
    #Laissons statique à Nginx
    location /static/ {
        root /var/app/sample/webapp;
    }
   location @uwsgi {
        include uwsgi_params;
        uwsgi_pass unix:/var/app/sample/sample_uwsgi.sock;
    }
}

/etc/uwsgi/vassals/sample_uwsgi.ini

Mettez uwsgi.ini dans / etc / uwsgi / vassals / pour uWSGI Emperor.

sample_uwsgi.ini


[uwsgi]
base = /var/app/sample

app = main #Flask est le principal pour commencer.Si c'est py, main
#Exemple pour Django.wsgi:Se sentir comme une application

module = %(app)

#Chemin d'accès à virtualenv exécutant cette application
#Si vous utilisez Python brut, est-ce le chemin vers le répertoire Python?
home = /home/www-data/venvs/sampleapp

pythonpath = %(base)

socket = %(base)/%n.sock

chmod-socket    = 666

#the variable that holds a flask application inside the module imported at line #6
callable = app

#Enregistrement
logto = /var/log/uwsgi/%n.log
#Le gars qui met dans le postrotate de logrotate
touch-logreopen = %(base)/.logreopen_trigger

#Déclencheur pour recharger uwsgi
touch-reload = %(base)/.uwsgi_touch

max-requests = 1000
harakiri = 60

#Je l'ai utilisé de l'empereur alors je l'ai commenté
#master=True
#daemonize=/var/log/uwsgi/sample.log

/etc/init/uwsgi.conf (pour démarrer uWSGI Emperor) (pour CentOS6)

uwsgi.conf


description "uWSGI"
start on runlevel [2345]
stop on runlevel [06]
respawn

#J'ai installé uniquement uwsgi pour uwsgi emperor et j'ai désactivé le virtualenv nommé uwsgi. JE.
#Sinon, vous devez spécifier la destination d'installation uwsgi et cela fonctionnera.
env UWSGI=/home/www-data/venvs/uwsgi/bin/uwsgi
env LOGTO=/var/log/uwsgi/emperor.log

#Modifiez l'uid et le gid le cas échéant
exec $UWSGI --master --emperor /etc/uwsgi/vassals --die-on-term --uid www-data --gid www-data --logto $LOGTO
start uwsgi

Démarrez toutes les applications uwsgi sous / etc / uwsgi / vassals. Faites un démarrage automatique si nécessaire

/etc/systemd/system/uwsgi.service (pour démarrer uWSGI Emperor) (pour CentOS 7)

uwsgi.service


[Unit]
Description=uWSGI
After=syslog.target

[Service]
#J'ai installé uniquement uwsgi pour uwsgi emperor et j'ai désactivé le virtualenv nommé uwsgi. JE.
#Sinon, vous devez spécifier la destination d'installation uwsgi et cela fonctionnera.
#Modifiez également l'uid et le gid si nécessaire
ExecStart=/home/www-data/venvs/uwsgi/bin/uwsgi --master --emperor /etc/uwsgi/vassals --die-on-term --uid www-data --gid www-data --logto /var/log/uwsgi/emperor.log
Restart=always
KillSignal=SIGQUIT
Type=notify
StandardError=syslog
NotifyAccess=all

[Install]
WantedBy=multi-user.target
systemctl start uwsgi

Démarrez toutes les applications uwsgi sous / etc / uwsgi / vassals. Le démarrage automatique est approprié.

Recommended Posts

Mémo de réglage UWSGI lors d'un fonctionnement correct
Remarques sur la façon d'utiliser lors de la combinaison de pandas.
Rédaction de mémos de paramétrage Pycharm
Notes de travail lors de l'installation de mitmproxy
[WSL2] Mémo de réglage du code CentOS 8 VS