2013-01-03 19 views
5

Debian 6.0.1でプロキシとして動作するnginx/1.0.12は、短時間実行した後に次のエラーを投げ始めます。nginx proxy:connect()to ip:80 failed(99:要求されたアドレスを割り当てることができません)

 
connect() to upstreamip:80 failed (99: Cannot assign requested address) 
while connecting to upstream, client: xxx.xxx.xxx.xxx, server: localhost, 
request: "GET/HTTP/1.1", upstream: "http://upstreamip:80/", 
host: "requesteddomain.com" 

すべてのリクエストでこのエラーが発生するわけではありません。そのため、サーバーの負荷や何らかの制限がかかる場合があります。

ulimit -nを50kに、worker_rlimit_nofileを50kに上げようとしましたが、それは役に立たないようです。 lsof -nは、nginxの合計で1200行を表示します。 nginxがアップストリームサーバーへの接続をさらに開けないようにするために、発信接続にシステム制限がありますか?

答えて

11

私はちょうど自分の質問への解決策を見つけたように思える:

echo "10240 65535" > /proc/sys/net/ipv4/ip_local_port_range 

を通じてより多くの発信ポートを割り当てるには、問題を解決しました。

0

に/etc/sysctl.confを変更:

net.ipv4.tcp_timestamps=1 
net.ipv4.tcp_tw_recycle=0 
net.ipv4.tcp_tw_reuse=1 
net.ipv4.tcp_max_tw_buckets=10000  #after done this: local ports decrease from 26000 to 6000(netstat -tuwanp | awk '{print $4}' | sort | uniq -c | wc -l) 

実行:

sysctl -p 
+0

問題がDOS攻撃ではなくTIME_WAITの結果であったが、より速いTIME_WAITタイムアウトで終了するはずの通常のトラフィックが膨大であったため、これが役に立ったかどうかはわかりません。 – mariow

+0

@mariow、私のサーバーには、非常に多くの発信要求(クローラ)がありますので、TIME_WAITを再利用することは必須です。 – diyism

+1

net.ipv4.tcp_tw_recycleが壊れているとLinux 4.12から削除されました: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=4396e46187ca5070219b81773c4e65088dac50cc 再利用も危険です: https://vincent.bernat.im/en/blog/2014-tcp-time-wait-state-linux これらのオプションは使用しないでください。 – pva

1

各TCPコネクションがユニークな四重source_ipを持たなければならない:source_port:dest_ip:dest_portは

source_ipです変更が困難な場合、source_portはip_local_port_rangeから選択されますが、16ビットを超えることはできません。他に調整する必要があるのは、dest_ipおよび/またはdest_portです。だからあなたのアップストリームサーバーのためのいくつかのIPエイリアスを追加:IP1、IP2およびIP3が同じサーバーで異なるIPアドレスである

upstream foo { server ip1:80; server ip2:80; server ip3:80; }

また、より多くのポートで上流リスニングを行うほうが簡単かもしれません。

関連する問題