tcp 的自连接问题

741 查看

今天在生产系统上遇到一个故障,先描述下:

1、目前我的 nginx 的配置是启动的 80 端口,然后我有一个后台服务是启动的 8080 端口
我使用 nginx 做的反向代理,后台服务挂掉后会自启动,目前遇到的问题是,后台服务挂掉后,再自启动的时候报错:

Bind port 8080 error: Address already in use

nginx 的配置:

upstream test.com{
    server 127.0.0.1:8080;
}

server
  {
    listen       80;
    server_name  test.com;
    index index.html index.htm index.php;



    location / {
        proxy_pass http://test.com;
        add_header cache-control "no-cache, max-age=0";
        add_header Pragma "no-cache";
    }

然后 netstat 看:

 sudo netstat -anpto |grep 127.0.0.1
tcp        0      0 127.0.0.1:8080              127.0.0.1:8080              ESTABLISHED 3841/nginx          off (0.00/0/0)

然后疑惑的是,为什么出现上面的情况,经过发个帖子 http://segmentfault.com/q/1010000002396121?_ea=74605 询问了下,然后再自己 google 和 SF 一番,发现是 tcp 的自连接问题,目前 linux 是默认允许这种情况存在的,解决这个问题的方法很简单:

  1. 你自己的程序处理自连接的情况
  2. 修改 linux 服务器的随机端口范围,使得服务器绑定的端口不在随机端口范围内。

你自己的程序处理自连接的情况

这个如果是自己的程序的话,那就自己写程序处理吧,但是因为我这个是 nginx ,所以没法修改,因此只好走第二条路了。

修改 linux 服务器的随机端口范围

修改服务器的 /proc/sys/net/ipv4/ip_local_port_range 里面的值。

目前我生产服务器的 /proc/sys/net/ipv4/ip_local_port_range 的值是 1024 65535,而我应用程序启动的端口是 8080,因此为了避免自连接的情况,我必须把 /proc/sys/net/ipv4/ip_local_port_range 的值修改为 8081 65535,修改方法为:

vim /etc/sysctl.conf

修改为

/proc/sys/net/ipv4/ip_local_port_range=8081 65535

加载生效

sysctl -p

参考资料