DjangoアプリケーションをNginx + uwsgiを使用して実行しようとしていますが、504 Gateway Time-out
1分のロード後。
私のアプリは、いくつかのWebサイトで特定のものを検索するため、必要な処理を実行するのに時間がかかります。
私のnginx confは次のものです:
upstream uwsgi {
server 127.0.0.1:8000;
}
server {
listen 80;
server_name server_ip;
root /opt/emails/subscriptions;
index index.html index.htm index.php;
location /emailsproject/ {
root /opt/emails/subscriptions/;
}
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://uwsgi;
proxy_set_header Host $http_Host;
uwsgi_read_timeout 18000;
}
}
私のuwsgiスクリプト:
description "uWSGI server"
env PYTHONPATH=/opt/emails/subscriptions
env Django_SETTINGS_MODULE=emailsproject.settings
start on runlevel [2345]
stop on runlevel [!2345]
respawn
exec uwsgi_python --http-socket 127.0.0.1:8000 -p 4 --wsgi-file /opt/emails/subscriptions/emailsproject/wsgi.py
私のnginxは私にerror.logのフォローインエラーメッセージを与えています:
2015/09/28 02:15:57 [error] 4450#0: *19 upstream timed out (110: Connection timed out) while reading response header from upstream, client: 37.235.53.246, server: my_server_ip, request: "POST /home/ HTTP/1.1", upstream: "http://127.0.0.1:8000/home/", Host: "my_server_ip", referrer: "http://my_server_ip/home/"
どうすればこれを取り除くことができるかについて誰かが何か考えを持っていますか?私は大量のスタックオーバーフローソリューションを試しましたが、どれもうまくいきませんでした。
私はパーティーに遅れていることはわかっていますが、これらの提案(およびその他)の多くを試した後、最終的にDNSからタイムアウトが発生していることに気付きました。Amazonロードバランサーを使用している場合、「アイドルタイムアウト」が設定されていますデフォルトは120秒。
多くの人々は、504がクライアントからのリクエストに関連している、または巨大なセッションが山積しているサイトでDDoS攻撃が発生していると想定しています。 wsgiがコードを提示できない場合や、オーバーフローのためにサーバーが応答できない場合は、エラーが表示される可能性があるため、504は両方の方法で機能します。したがって、manage.pyを実行して、コードが提示可能かどうかを確認してください。次に、"curl -I yoursite.com"
コマンドを試して、エラーが発生するかどうかを確認します。焦点を合わせる必要がある2つのnginx関連ファイルがあり、1つはデフォルトのグローバル設定の/etc/nginx/nginx.conf
にあります。 2つ目は、/etc/nginx/sites-available
で自分を作成することです。グローバル/etc/nginx/nginx.conf
インストールで、次の行を追加します
proxy_connect_timeout 10;
proxy_send_timeout 15;
proxy_read_timeout 20;
このソリューションは、さまざまなシナリオで発生する504エラーの90%に対処します。プロジェクトのconfは、上記で述べたものと同じでなければなりません。
これは、proxy_read_timeout
ではなくuwsgi_read_timeout
を設定する必要があるためです。そしてそれは、実際にはuwsgiを使用しておらず、HTTPプロキシを使用しているためです。 Uwsgiバックエンドはuwsgi_pass
ディレクティブを使用して宣言されます。