cerrar

Implementación de Python con uwsgi

Ambito:
Python

En este sitio, encontrará una guía paso a paso sobre cómo implementar una aplicación Python usando uWSGI con NGINX .

Creando un sitio Python #

Cree un sitio de Python con la versión de Python correcta y asegúrese de que el puerto de la aplicación sea correcto.

Creando una configuración uWSGI

Para ejecutar una aplicación Python en producción, utilizamos el proyecto uWSGI , que garantiza que nuestra aplicación esté disponible después de reiniciar.

  1. Inicie sesión mediante SSH con el usuario raíz y vaya al directorio de aplicaciones uwsgi :
cd /etc/uwsgi/apps-enabled/
  1. Cree un archivo de configuración como domain.uwsgi.ini y modifique la configuración de ejemplo a continuación según sus necesidades:
CONFIGURACIÓN DE UWSGI

Cambie los valores de socket , wsgi-file , uid y gid .
Es posible que desee consultar la documentación oficial de uWSGI para obtener más configuraciones.

En la documentación de Django encontrará información útil sobre cómo implementar aplicaciones Django a través de uWSGI .

[uwsgi]plugins       = python3master        = trueprotocol      = uwsgisocket        = 127.0.0.1:8090wsgi-file     = /home/site-user/htdocs/python-project/wsgi.py
# In case you're using virtualenv uncomment this:#virtualenv = /home/site-user/htdocs/python-project
# Needed for OAuth/OpenIDbuffer-size   = 8192
# Reload when consuming too much of memoryreload-on-rss = 250
# Increase number of workers for heavily loaded sitesworkers       = 4
# Enable threads for Sentry error submissionenable-threads = true
# Child processes do not need file descriptorsclose-on-exec = true
# Avoid default 0000 umaskumask = 0022
# Run as weblate useruid = site-usergid = site-user
# Enable harakiri mode (kill requests after some time)# harakiri = 3600# harakiri-verbose = true
# Enable uWSGI stats server# stats = :1717# stats-http = true
# Do not log some errors caused by client disconnectsignore-sigpipe = trueignore-write-errors = truedisable-write-exception = true

Cambio de host virtual #

  1. Vaya al Vhost de su sitio .

A continuación verá el vhost predeterminado . Está reenviando todas las solicitudes a través de proxy inverso al App Port .
Es útil para el desarrollo en el que se utiliza el servidor integrado , proporcionado por la mayoría de las aplicaciones Python .

server {  listen 80;  listen [::]:80;  listen 443 ssl http2;  listen [::]:443 ssl http2;  {{ssl_certificate_key}}  {{ssl_certificate}}  server_name www.domain.com;  {{root}}
  {{nginx_access_log}}  {{nginx_error_log}}
  if ($scheme != "https") {    rewrite ^ https://$host$uri permanent;  }
  location ~ /.well-known {    auth_basic off;    allow all;  }
  {{settings}}
  index index.html;
  location /uwsgi {    include uwsgi_params;    uwsgi_read_timeout 3600;    #uwsgi_pass unix:///run/uwsgi/app/weblate/socket;    uwsgi_pass 127.0.0.1:{{app_port}};  }
  location / {    proxy_pass http://127.0.0.1:{{app_port}}/;    proxy_http_version 1.1;    proxy_set_header X-Forwarded-Host $host;    proxy_set_header X-Forwarded-Server $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;    proxy_set_header Host $http_host;    proxy_set_header Upgrade $http_upgrade;    proxy_set_header Connection "Upgrade";    proxy_pass_request_headers on;    proxy_max_temp_file_size 0;    proxy_connect_timeout 900;    proxy_send_timeout 900;    proxy_read_timeout 900;    proxy_buffer_size 128k;    proxy_buffers 4 256k;    proxy_busy_buffers_size 256k;    proxy_temp_file_write_size 256k;  }
  location ~* ^.+\.(css|js|jpg|jpeg|gif|png|ico|gz|svg|svgz|ttf|otf|woff|woff2|eot|mp4|ogg|ogv|webm|webp|zip|swf)$ {    add_header Access-Control-Allow-Origin "*";    expires max;    access_log on;  }
  if (-f $request_filename) {    break;  }}
  1. Reemplace el vhost predeterminado con el siguiente, reemplazando la ubicación / para reenviar todas las solicitudes al servicio uWSGI .
NOMBRE DEL SERVIDOR

Reemplace el valor de server_name con su dominio.

server {  listen 80;  listen [::]:80;  listen 443 ssl http2;  listen [::]:443 ssl http2;  {{ssl_certificate_key}}  {{ssl_certificate}}  server_name www.domain.com;  {{root}}
  {{nginx_access_log}}  {{nginx_error_log}}
  if ($scheme != "https") {    rewrite ^ https://$host$uri permanent;  }
  location ~ /.well-known {    auth_basic off;    allow all;  }
  {{settings}}
  index index.html;
  location / {    include uwsgi_params;    uwsgi_read_timeout 3600;    #uwsgi_pass unix:///run/uwsgi/app/weblate/socket;    uwsgi_pass 127.0.0.1:{{app_port}};  }
  #location ~* ^.+\.(css|js|jpg|jpeg|gif|png|ico|gz|svg|svgz|ttf|otf|woff|woff2|eot|mp4|ogg|ogv|webm|webp|zip|swf)$ {  #  add_header Access-Control-Allow-Origin "*";  #  expires max;  #  access_log on;  #}
  if (-f $request_filename) {    break;  }}

Reiniciar el servicio uwsgi #

Reinicie el servicio uwsgi a través de systemctl para aplicar nuestra configuración.

systemctl restart uwsgi

Número de verificación de servicio

Para verificar si uwsgi está escuchando en nuestro puerto solicitado, por ejemplo, 8090 , usamos netstat :

netstat -tulpn |grep uwsgi

Si todo es correcto, deberías ver un resultado como este:

tcp 16 0 127.0.0.1:8090 0.0.0.0:* LISTEN 8872/uwsgi

Reinicie su instancia para confirmar que su aplicación funciona como se esperaba.

Registros #

Para solucionar problemas, puede consultar los registros de uwsgi , ubicados en /var/log/uwsgi/app/ .