バックグラウンド:
今日、突然メール担当の同僚からメールサーバーが利用できないという連絡が来たので確認してみました。
プロセス
1. 手動で Telnet ポート 465 に接続します。
ポートが使用できないことが判明しました
2. nginx ログを表示する
ピアによってリセットされた接続の検出
3. パケットのキャプチャと調査
#リスニングポート
tcpdump -nn -i eth0 ポート 465
#プロキシアドレスをリクエストする
Telnet 127.0.0.1 465
#バックエンドアドレスをリクエストする
Telnet smtp.test.cn 465
ここで、プロキシを要求した後のアドレスが、ドメイン名で解決されたアドレスと一致していないことがわかります。
4. 問題の発見
これは、nginx が dns の解決をキャッシュし、プロキシ バックエンド アドレス smtp.test.cn ノードが変更され、元のノードが破棄されたにもかかわらず、nginx キャッシュが元のノードを引き続きキャッシュしているため、例外が発生するためです。
解決
DNS キャッシュを定期的に更新するように nginx リゾルバーを構成する
構成は次のとおりです
サーバー {
465を聞いてください。
リゾルバ 111.111.111.111 8.8.8.8 有効 = 4800 秒;
リゾルバータイムアウト 3 秒;
$smtp "smtp.test.cn:465" を設定します。
プロキシ_パス $smtp;
proxy_connect_timeout 60 秒;
}
パラメータの説明:
1、リゾルバー
サーバーで構成し、後で DNS サーバーを指定し、複数の DNS をスペースで区切ります
2. 有効なキャッシュの有効期限
無効化後、DNS解決を再取得します
3、リゾルバータイムアウト
解析タイムアウト
注: 複数の DNS を構成する場合は、解決にポーリング メカニズムが使用されるため、構成されているすべての DNS が使用可能であることを確認する必要があります。有効時間が経過すると、2 番目の DNS アドレスが解決に使用されます。1 つのアドレスが使用できない場合は、そのアドレスが使用できなくなります。タイムアウトになり、解決できませんでした (110: 操作がタイムアウトしました) エラーが返されます。