2016-11-28 12 views
0

私はNode.js/ExpressアプリケーションをUbuntuサーバー上で実行しています。ポート80(またはsslの場合は443)のトラフィックをアプリケーションのポートに渡すNGINXリバースプロキシの背後に位置します。NGINXリバースプロキシが原因で一部のページで502エラーが発生する

私は最近、特定できない理由で、/にアクセスしようとするトラフィックが、最終的にはエラー504になり、エラーとタイムアウトになるという問題が発生しました。テストとして、私はタイムアウトを増やし、現在502のエラーが発生しています。私のアプリケーション上のいくつかの他のルート、例えば/loginに問題なくアクセスできます。

私のExpressアプリケーションを再起動すると、問題が起こらずにアプリケーションが正常に実行されます。通常、この問題が再び発生するまで数日間は問題ありません。このアプリケーションは、約13のために適切に実行されている

GET/- - ms - - 

:次のようになり、適切に応答しないリクエストに対し

GET/200 15.786 ms - 1214 

:私のエクスプレスのアプリのログを見ると、良い要求は次のようになります問題のない月には、この問題はプロンプトが表示されずに発生しています。私はこれが発生した時間内に更新をプッシュしていません。ここで

は私のnginxの設定ファイル(例えばexample.com、セキュリティのためのビットを変更)

upstream site_upstream { 
    server 127.0.0.1:3000; 
} 

server { 
    listen 80; 
    listen 443 ssl; 

    server_name example.com; 
    ssl_certificate /etc/nginx/ssl/nginx.crt; 
    ssl_certificate_key /etc/nginx/ssl/nginx.key; 

    location/{ 
     proxy_pass http://site_upstream; 
     proxy_http_version 1.1; 
     proxy_set_header Upgrade $http_upgrade; 
     proxy_set_header Connection 'upgrade'; 
     proxy_set_header Host $host; 
     proxy_cache_bypass $http_upgrade; 
     proxy_redirect http://rpa_upstream https://example.com; 
    } 
} 

は私のnginxの設定ファイルを持つか、私の構成のどちらとしての私のアプリケーション自体と、この問題が変更した場合、私は不明だです。

+0

[私の答え](http://stackoverflow.com/questions/40853469/nginx-reverse-proxy-causes-502-errors-on-some-pages/40854209#40854209)が役に立ちましたか?コメントはありますか? – rsp

答えて

0

これは、nginxまたはNodeアプリケーションのメモリリークのようです。 Nodeアプリケーションを再起動した後にもう一度動作するようになったらを再起動せずにnginxを再起動すると、Nodeアプリケーションに問題があるようです。

プロキシを使わずに直接アプリにアクセスして、その場合の問題を確認してください。ブラウザのデベロッパーツールや、curlやApache abのようなベンチマークのようなコマンドラインツールで、より詳細な情報を得ることができます。 abと重いベンチマークを実行すると、待機するのではなく、問題をより早く見つけることができます。

もちろん、コードを表示していないときに問題が何であるかは言うまでもありません。

以前はうまくいきましたが、その間に何か(アプリケーション、ノードモジュール、またはノード自体)をアップグレードしなかった場合は、トラフィックがわずかに増加し、問題が発生し始めた可能性があります前に現れていない。あるいは、あなたのシステムが他のタスクにもっと多くのRAMを使い、メモリリークが以前よりも早く問題になり始めるかもしれません。

process.memoryUsage()によって返されたデータのロギングを定期的に開始し、何か問題があるかどうかを確認できます。

またpstophtopまたは他のコマンドを使用してノードのプロセスを監視、またはメモリ使用量を参照してください/proc/PID/statusなど

また、定期的に/proc/meminfoを監視し、システムで使用される総メモリがあるかどうかを確認することができますあなたのアプリケーションが応答しなくなるのと相関しています。

問題を引き起こす可能性があるもう一つの事柄は、アプリケーション内でエラーやタイムアウトを処理していない場合、データベースへの応答が遅いかどうかなどです。より広範なロギング(すべてのルートハンドラに入る行、すべてのI/O操作が完了するたびに、すべてのI/O操作が開始されるたびに、およびが開始されます)。

関連する問題