Endlich habe ich dieses Problem gelöst, nachdem ich fast 2 Tage daran gearbeitet habe. Ich hoffe, dass diese Lösung anderen Benutzern von flask/uwsgi hilft, die ein ähnliches Problem haben.
Ich hatte zwei große Probleme, die dies verursacht haben.
1) Der beste Weg, um die Probleme mit einem Daemon zu finden, ist offensichtlich eine Protokolldatei und eine sauberere Struktur.
sudo vim /etc/init/uwsgi.conf
Ändern der Daemon-Skript auf die folgenden:
# file: /etc/init/uwsgi.conf
description "uWSGI server"
start on runlevel [2345]
stop on runlevel [!2345]
respawn
exec /home/ubuntu/uwsgi-1.9.12/uwsgi -c /myproject/uwsgi.ini
vim /myproject/uwsgi.ini
[uwsgi]
socket = /tmp/uwsgi.sock
master = true
enable-threads = true
processes = 5
chdir= /myproject/F11/Engineering
module=F11:app
virtualenv = /myproject/myproject-env/
uid = www-data
gid = www-data
logto = /myproject/error.log
Das ist viel sauberer Weg, um den Dämon der Einrichtung. Beachten Sie auch die letzte Zeile zum Einrichten der Protokolldatei. Anfangs hatte ich die Protokolldatei auf /var/log/uwsgi/error.log
festgelegt. Nach viel Schweiß und Tränen stellte ich fest, dass der Daemon als www-data
ausgeführt wird und daher nicht auf die /var/log/uwsgi/error.log
zugreifen kann, da die error.log von root:root
gehört. Dies ließ die uwsgi schweigend versagen.
Ich fand es viel effizienter, die Protokolldatei nur auf meine eigene /myproject
zu verweisen, wo der Daemon garantierten Zugriff als www-data
hat. Vergessen Sie auch nicht, das gesamte Projekt für www-data
zugänglich zu machen oder der Daemon wird mit einem Internal Server error message
fehlschlagen. ->
sudo chown www-data:www-data -R /myproject/
Restart uwsgi Daemon:
sudo service uwsgi restart
2) Jetzt haben Sie drei Protokolldateien Suche nach:
tail -f /var/log/upstart/uwsgi.log
-> Zeigt Probleme mit Ihrem Daemon auf start
tail -f /var/log/nginx/error.log
-> Zeigt Erlaubnis Probleme, wenn wsgi Zugriff verweigert wird, oft weil /tmp/uwsgi.sock
Datei von root
statt www-data
gehört. In diesem Fall löschen Sie einfach die Datei Socke sudo rm /tmp/uwsgi.sock
tail -f /myproject/error.log
-> Fehler von uwsgi in der Anwendung geworfen Zeigt
Diese Kombination von Protokolldateien hat mich geholfen, um herauszufinden, dass ich auch einen schlechten Import mit Flask-Babel in meiner Flask-Anwendung. Schlecht in diesem Sinne, dass die Art, wie ich die Bibliothek verwendet habe, auf das Gebietsschema des Systems zurückgefallen ist, um das Datetime-Format zu bestimmen.
File "/myproject/F11/Engineering/f11_app/templates/show_records.html", line 25, in block "body"
<td>{{ record.record_date|format_date }}</td>
File "./f11_app/filters.py", line 7, in format_date
day = babel_dates.format_date(value, "EE")
File "/myproject/myproject-env/local/lib/python2.7/site-packages/babel/dates.py", line 459, in format_date
return pattern.apply(date, locale)
File "/myproject/myproject-env/local/lib/python2.7/site-packages/babel/dates.py", line 702, in apply
return self % DateTimeFormat(datetime, locale)
File "/myproject/myproject-env/local/lib/python2.7/site-packages/babel/dates.py", line 699, in __mod__
return self.format % other
File "/myproject/myproject-env/local/lib/python2.7/site-packages/babel/dates.py", line 734, in __getitem__
return self.format_weekday(char, num)
File "/myproject/myproject-env/local/lib/python2.7/site-packages/babel/dates.py", line 821, in format_weekday
return get_day_names(width, context, self.locale)[weekday]
File "/myproject/myproject-env/local/lib/python2.7/site-packages/babel/dates.py", line 69, in get_day_names
return Locale.parse(locale).days[context][width]
AttributeError: 'NoneType' object has no attribute 'days'
Dies ist die Art, wie ich die Kolben-Filter wurde:
import babel.dates as babel_dates
@app.template_filter('format_date')
def format_date(value):
day = babel_dates.format_date(value, "EE")
return '{0} {1}'.format(day.upper(), affix(value.day))
Das Merkwürdigste ist, dass dieser Code völlig in Ordnung, in der Dev-Umgebung arbeitet (!). Es funktioniert sogar gut, wenn Sie den uwsgi als Root-Prozess über die Befehlszeile ausführen. Aber es schlägt fehl, wenn es vom www-data-Daemon ausgeführt wird. Das muss etwas damit zu tun haben, wie das Gebietsschema eingestellt ist, auf das Flask-Babel zurückzugreifen versucht.
Wenn ich den Import wie folgt geändert, alle es endlich geklappt mit dem Dämon:
from flask.ext.babel import format_date
@app.template_filter('format_date1')
def format_date1(value):
day = format_date(value, "EE")
return '{0} {1}'.format(day.upper(), affix(value.day))
daher vorsichtig sein, wenn Eclipse/Aptana Studio verwenden, die den richtigen Namensraum für Ihre Klassen in Code zu holen versucht. Es kann wirklich hässlich werden.
Es funktioniert jetzt perfekt als uwsgi-Daemon auf einem Amazon Ec2 (Ubuntu 12.04) seit 2 Tagen. Ich hoffe, diese Erfahrung hilft anderen Python-Entwicklern.
Verwenden Sie Debian oder Ubuntu? – Joe
@joe, Ubuntu 12.04 LTS das ist. Ich habe es gerade auf meinem Laptop mit 13.04 getestet und es ist genau das gleiche Problem. Was gut ist, also reproduzierbar. – Houman
klingt wie der Daemon läuft unter einem anderen Benutzer oder hat Zugriff auf verschiedene Konfigurationen ... ist das nicht ein Hinweis: http://StackOverflow.com/questions/394984/best-practice-to-run-linux-service- as-a-different-user – Paul