django - processes - uWSGI no recargará, reiniciará ni me permitirá ejecutar el servicio
uwsgi vs gunicorn (1)
Tengo un problema bastante grande.
Soy muy nuevo en uwsgi y no estoy 100% seguro de cómo solucionar este problema, pero le daré información sobre dónde estoy.
- Anteriormente he tenido sitios trabajando en esta configuración y, de repente, no está funcionando.
- Estoy corriendo el modo Emperador.
- Mis archivos ini están bien cuando uso la línea de comandos para ejecutarlos pero parece que no se inician automáticamente
Cuando corro uwsgi reload
sudo service uwsgi reload
Me sale este error
* Reloading app server(s) uwsgi
...fail!
Eso es. No consigo nada más.
He estado buscando horas en el desbordamiento de pila y no he encontrado nada que describa exactamente este problema, encontré mucho que ver con los archivos .ini de los usuarios, pero sé que NO es mi problema porque al ejecutar mi sitio manualmente a través de uwsgi --ini MYINI.ini
luego acceder a él funciona perfectamente bien, el problema está en uWSGI y no sé cómo encontrar la solución a esta. He mirado en los documentos y no puedo encontrar nada en este error en particular.
Si esto le interesa a alguien, aquí está mi archivo uwsgi-server.conf
description "uWSGI Emperor"
start on runlevel [2345]
stop on runlevel [!2345]
respawn
env LOGTO=/var/log/uwsgi.log
env BINPATH=/usr/local/bin/uwsgi
exec $BINPATH --emperor /etc/uwsgi/vassals --logto $LOGTO
Cualquier idea sería apreciada. Siento que me estoy perdiendo algo pero que soy tan nuevo con uWSGI que ni siquiera puedo adivinar qué puede ser, para mí todo parece estar bien según la documentación.
Si necesita más información sobre mi configuración por favor solo pregunte.
Usa uwsgi de la manera correcta
Usar uwsgi para ejecutar el sitio django en el servidor de ubuntu es bastante fácil, pero todavía hay algo que debe saber antes de cometer errores.
instalar
Tienes dos formas de instalar uwsgi en ubuntu: apt-get o pip
apt-get
Si usas apt-get, necesitas instalar el complemento de Python:
sudo apt-get install uwsgi-plugin-python
sudo apt-get install uwsgi
Y, en su archivo uwsgi ini para su sitio, debe agregar esto:
plugins=python
pipa
Si usas pip, primero debes instalar python-dev:
sudo apt-get install python-dev
sudo pip install uwsgi
Y, ya no necesitas los plugins=python
en el archivo ini.
¿Ves el sudo antes de pip? Sí, uwsgi debe instalarse en el sistema global. Si pierde el sudo aquí, puede instalarlo en su virtualenv. No tiene sentido y puede tener problemas para ejecutarlo.
daemonize uwsgi
Daemonize significa hacer que uwsgi se ejecute en el arranque del sistema y en segundo plano. Según cómo instales uwsgi, tienes dos formas.
apt-get
Cuando apt-get install uwsgi
en ubuntu, se instala automáticamente como un servicio. La magia se encuentra en este archivo:
/etc/init.d/uwsgi
Los archivos en /etc/init.d
serán cargados por sysvinit. Entonces puedes administrar tu servicio de uwsgi de esta manera:
sudo /etc/init.d/uwsgi start|stop|restart|reload
o:
sudo service uwsgi start|stop|restart|reload
El comando service puede encontrar el servicio administrado por sysvinit.
pipa
Si uwsgi está instalado por pip, solo tiene el archivo ejecutable en /usr/local/bin/uwsgi
, debe desemonizarlo usted mismo.
Cuando abre algunos de los archivos en /etc/init.d/
, puede sentirse triste: solo quiero registrar uwsgi como un servicio, ¿por qué necesito escribir un script tan largo que se parezca a los demás? No tiene sentido
La buena noticia es que es bastante simple con la ayuda de Upstart, que es una alternativa a sysvinit. Utiliza /etc/init/
lugar de /etc/init.d/
.
Simplemente cree un archivo /etc/init/uwsgi.conf
con el siguiente contenido:
description "uWSGI Emperor"
start on runlevel [2345]
stop on runlevel [!2345]
respawn
exec /usr/local/bin/uwsgi --emperor /etc/uwsgi/vassals/ --logto /var/log/uwsgi.log
y luego, puede administrar su proceso uwsgi de esta manera:
sudo initctl start|stop|restart|reload| uwsgi
o, aún esto:
sudo service uwsgi start|stop|restart|reload
Sí, como puede ver, el comando de servicio es inteligente, puede administrar el servicio desde sysvinit y Upstart, con el mismo comando.
Y, si tiene ambos /etc/init.d/uwsgi
y /etc/init/uwsgi.conf
, cuando diga:
sudo service uwsgi restart
Reiniciará el archivo Upstart /etc/init/uwsgi.conf
. El sysvinit uno será ignorado, o algo similar.
config uwsgi para su sitio
Recomiendo a todos que usen el modo pip y Upstart, es mucho mejor que el método apt-get.
Si es así, estás usando el modo emperador de uwsgi, que es muy útil y poderoso.
Ahora, puede crear un archivo ini en /etc/uwsgi/vassals/
como esto:
[uwsgi]
virtualenv=/path/to/venv/
chdir=/path/to/proj/root
module=wsgi:application
env=DJANGO_SETTINGS_MODULE=settings
master=True
vacuum=True
socket=/tmp/%n.sock
pidfile=/tmp/%n.pid
daemonize=/var/log/uwsgi/%n.log
El %n
significa su nombre de archivo. Por ejemplo, mi nombre de proyecto es ''example'', creo un archivo example.ini
para él. Entonces el %n
significa ''ejemplo''. No es necesario reemplazarlo con un nombre real. uwsgi hará esto por ti.
Y luego reinicie o vuelva a cargar uwsgi:
sudo service uwsgi restart
Revise su archivo de socket:
ll /tmp/*.sock
Si está ahí, tienes éxito con uwsgi ahora :)
nginx config para su sitio
Tome el dominio example.com por ejemplo:
server {
listen 80;
server_name www.example.com;
return 301 $scheme://example.com$request_uri;
}
server {
listen 80;
charset utf-8;
server_name example.com;
location /static/ {
alias /path/to/static/;
}
location /media/ {
alias /path/to/media/;
}
location / {
try_files $uri @django;
}
location @django {
uwsgi_pass unix:///tmp/example.sock;
include uwsgi_params;
}
}
reinicie nginx, verá su sitio!
responde a tu pregunta
Su archivo de configuración para uwsgi es /etc/init/uwsgi-server.conf
Entonces, el nombre que debe usar es uwsgi-server
, no uwsgi
necesitas reiniciar tu instancia de uwsgi emperador de esta manera:
sudo initctl restart uwsgi-server
o:
sudo service uwsgi-server restart
¡Eso es todo!