NGINX + uWSGI + Flaskで実行しているWebサイトがあります。
ほとんどの場合、Webサイトは問題なく動作しますが、nginxから返されたページに "Internal Server Error"と表示される場合があります。これを行っているときにuWSGIログを見ると、次のようになっています。
[pid: 1580|app: -1|req: -1/37] 69.162.124.228 () {46 vars in 716 bytes} [Sat May 12 10:25:13 2018] GET / => generated 21 bytes in 0 msecs (HTTP/1.1 500) 2 headers in 83 bytes (0 switches on core 0)
--- no python application found, check your startup logs for errors ---
長い間この状態になっている可能性がありますが、flaskアプリに任意の変更を加えるなど、無関係と思われる操作を行うと、すべてが再び機能し始めます。コードが変更されることなく、 "Internal Server Error"が再び発生し始めるときのランダムな時間。
UWSGIアプリケーションを直接実行してみましたが、エラーは発生しません。
flaskアプリにエラーをキャプチャするためにSentryをインストールしようとしましたが、これが発生しても何も表示されません。
これをどのように診断しますか?
他にどんなログファイルを見ることができますか?
これを引き起こしている可能性が高いのは何ですか?
私はこれに1週間以上来ており、SOのほとんどすべての関連する質問を読みました。アイデアが足りなくなり、何が起こっているのかわからない場合は、このプロジェクトを断念します。どんな助けでも大歓迎です。
これが私のファイルです:
uWSGI設定(mysite.ini)
[uwsgi]
module = wsgi:app
master = true
processes = 5
socket = mysite.sock
chmod-socket = 660
vacuum = true
die-on-term = true
logto = /var/log/uwsgi/%n.log
wsgi.py
from tunnelling.python.flask_app import app as application
if __name__ == "__main__":
application.run()
nginx:
server {
listen 80;
server_name www.mysite.com;
server_name mysite.com;
location / {
include uwsgi_params;
uwsgi_pass unix:/home/dimraft/mysite/mysite.sock;
}
listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/mysite.com/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/mysite.com/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
if ($scheme != "https") {
return 301 https://$Host$request_uri;
} # managed by Certbot
}
systemdファイル:
[Unit]
Description=uWSGI instance to serve mysite
After=network.target
[Service]
User=dimraft
Group=www-data
WorkingDirectory=/home/dimraft/mysite
Environment="PATH=/home/dimraft/mysite/mysiteenv/bin"
ExecStart=/home/dimraft/mysite/mysiteenv/bin/uwsgi --ini mysite.ini
[Install]
WantedBy=multi-user.target
@Johnは基本的にこれについては正しかったが、明確にするために詳しく説明したい。
本質的に同じ設定のプロジェクトで同じ問題を抱えていましたが、uwsgi.pyモジュールを私のflaskアプリケーションパッケージ内に移動することで修正されました
myprojectname/
__init__.py
uwsgi.py
次に、uwsgi.iniのモジュール定義を、次のようにmodule = myprojectname.uwsgi:applicationに変更します。
[uwsgi]
module=myprojectname.uwsgi:application
master=true
processes=2
socket=myprojectname.sock
chmod-socket=660
logto=/var/log/uwsgi/uwsgi.log
die-on-term=true
また、元のポストされたコードサンプルの場合と同様に、呼び出し可能オブジェクトの名前がapplicationであることを確認してください。 uWSGIはデフォルトで、このアプリケーションという名前のオブジェクトを検索するようになっています。私は、アプリケーションなど、他の名前を付けて機能させるのに苦労しました。