今天在生产系统上遇到一个故障,先描述下:
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