资讯专栏INFORMATION COLUMN

tcp 的自连接问题

fevin / 469人阅读

摘要:目前我生产服务器的的值是,而我应用程序启动的端口是,因此为了避免自连接的情况,我必须把的值修改为,修改方法为修改为加载生效参考资料

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

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 是默认允许这种情况存在的,解决这个问题的方法很简单:

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

修改 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
参考资料

http://segmentfault.com/blog/rockybean/1190000002396411

https://realaboo.wordpress.com/2009/12/28/%E6%9C%89%E8%B6%A3%E7%9A%84-single-port-self-connection-%E7%8E%B0%E8%B1%A1/

http://blog.csdn.net/kofshower/article/details/5316580

http://in.sdo.com/?p=3044

http://blog.csdn.net/justlinux2010/article/details/20947609

http://sgros.blogspot.com/2013/08/tcp-client-self-connect.html

http://skoo.me/system/2014/10/11/self-connection/

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/39105.html

相关文章

  • SMProxy,让你的项目数据库操作快三倍!

    摘要:一个基于协议,开发的数据库连接池。也可以通过其自身的管理机制来监视数据库连接的数量使用情况等。超出最大连接数会采用协程挂起,等到有连接关闭再恢复协程继续操作。 SMProxy GITHUB:https://github.com/louislivi/... Swoole MySQL Proxy 一个基于 MySQL 协议,Swoole 开发的MySQL数据库连接池。 原理 将数据库连接作...

    MartinHan 评论0 收藏0
  • 基于 Netty 的自定义帧高可靠性读取方案

    摘要:完成客户端服务器通信,需要基于协议之上,自定义一套简单的通信协议,其中数据交换方式需要使用自定义帧。输入数据处理器以下为输入数据的第一个处理器,可以保证无论帧经历怎样的粘包拆包,均可以准确提取每一个自定义帧的数据部分。 「博客搬家」 原地址: 简书 原发表时间: 2017-03-26 本文采用 Netty 这一最流行的 Java NIO 框架,作为 Java 服务器通信部分的基础...

    Berwin 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<