エラーログよりもさらにnginxをデバッグするにはどうすればよいですか?


34

現在、かなり大きなHTTPフラッドを受信して​​いるため、nginxリバースプロキシが502 Bad Gatewayを生成しています。

バックエンドサーバーのプロキシとしてnginxを実行しているフロントエンドサーバーがありますが、connect() failed (110: Connection timed out) while connecting to upstreamエラーが大量に発生しています。それらのトン。プロキシサーバーをバイパスしてバックエンドに接続すると、サイトを正常に実行できるので、どこかにリバースプロキシが存在することがわかります。ただし、タイムアウトの原因を特定する方法はわかりません。

何か助け?

CentOS 6.2でnginx 1.2.3を実行する


Nginxを最新バージョンに更新することから始めることができます。私は1.2.3で、このようなバグを認識していないよ、とはいえ
ベンLessani - Sonassi

2
....そして、NGINXからの接続を拒否
-symcbean

バックエンドサーバーは何ですか?Nginxが提供していたエラーが実際にバックエンドから来ていたとき、私は以前エラーに混乱していました。ここではそうではないようですが、質問をより詳細に更新する必要があります。
jeffatrackaid

また、プライベート/パブリックネットワークを介してバックエンドに接続していますか?プロキシのIPは、ファイアウォール、ddo、またはその他のip / rate-limitedタイプのツールでホワイトリストに登録されていますか?バックエンドサーバー上のnetstatはどのようなものですか?いくつの接続が開いていますか?バックエンドのMaxClientsとは何ですか?それらを使い果たしていますか?
jeffatrackaid

回答:


19

私はあなたがすでにデバッグのためにあなたのNginxエラーログレベルをジャッキしていると仮定しています。そうでない場合は、そこから開始します。

あなたの最善の策は、おそらくstraceNginxによって行われているシステムコールを表示するために使用することです。特に、connect()呼び出しに注意を払い、これらの戻りコードにman 2 connect注意してください(ここで友達になれます)。

その情報が得られたら、問題がフロントエンドプロキシに限定されているのか、プロキシとバックエンドアプリケーションサーバー間のやり取りに関係があるのか​​について、知識に基づいた推測を行うことができます。


37

dtraceプローブを配置する場合を除き、これよりも多くの知識を得ることはできません。

  1. デバッグログレベルを設定します:/etc/nginx/nginx.conf:

    ...
    http {
            ...
            error_log /var/log/nginx/error.log debug; # todo testing remove me not for production use
            ...
    }
    
  2. 別のウィンドウでtcpdumpをセットアップします。

    tcpdump not port 22 -vvv -s0 -q -XXX
    
  3. さらに別のウィンドウでログファイルを監視します。

    tail -f /var/log/nginx/*
    
  4. straceを使用してnginxをインタラクティブに起動します。

    # top of /etc/nginx/nginx.conf:
    
    daemon off; # todo testing remove me not for production use
    

    その後

     $ strace nginx 
    

さらにデバッグするには、nginxを使用してコンパイルし--with-debugます。次を実行して確認します。

    nginx -V 2>&1 | grep -- '--with-debug' # no output if not debug

デフォルトでコンパイルされない別の優れたモジュールは、HttpStubStatusModuleです。おそらく、適切なセットアップには、カスタムコンパイルされたnginxが必要になります(ディストリビューションのパッケージツールを使用したパッケージを強くお勧めします)。

これらのほとんどは実稼働環境での使用には適していません。さらに統計が必要な場合は、ngerxをgperfでコンパイルすることを検討してください。


ステップ2では、次のように機能します。tcpdump
ccppjava

5

トラフィックの多いサイトをデバッグしているようです。

ディレクティブdebugとともに使用してdebug_connection、nginxエラーログにIPからのデバッグログのみを表示します。

nginx構成全体に対してデバッグオプションをアクティブにするのではなく、いくつかの有用なエラーログが表示されるようになったら、reverse_proxy接続を担当するブロックに個別のerror_log /path/to/some/file/ debug;ディレクティブを追加しlocation {..}ます。

これにより、IPからのみデバッグエラーログを分離できます。

(ブラウザから)作成しているリクエストに関連付けてみてください。

たとえば、チェックしてください:https : //easyengine.io/tutorials/nginx/debugging/

一歩先を行くと、NginxのHttpEchoModuleを使用できます


2

Nginxがボトルネックになることは一度もありませんでした。ほとんどの場合、バックエンドよりも機能が優れています。ただし、Nginxなしでテストしてもエラーが見つからなかった場合は、どちらか(または両方)になります。

  1. Nginx設定の問題
    1. 上流のタイムアウト値が間違っています
    2. アップストリームの間違ったプローブURL
    3. 労働者が少なすぎる
    4. 等。
  2. オペレーティングシステムTCP / IPボトルネック
    1. プロキシ自体が、開いているポートと状態の重複を引き起こしている可能性があります。ファイル記述子、ポート、TCP接続

Nginxの設定を見なくても、誰も前者についてコメントすることはできません。また、OSからの適切な出力がなければ、誰も後者についてコメントできません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.