Exception: Cannot assign requested address

现象:

​ 项目出现操作卡顿,接口http 500,但是日志并没有该接口业务报错,但是日志有

ERROR - **** --> Severity: Warning --> Unknown: Failed to write session data (user). Please verify that the current setting of session.save_path is correct (/tmp) Unknown 0
ERROR - **** --> Severity: error --> Exception: Cannot assign requested address /var/www/html/**/system/libraries/Session/drivers/Session_redis_driver.php 179

原因:

​ 客户端链接频繁,TCP未及时释放,端口耗尽,导致无法分配端口,无法分配请求的地址

解决方式:

优化服务器配置:

​ /proc/sys/net/ipv4/

net.ipv4.tcp_fin_timeout = 30  
net.ipv4.tcp_tw_reuse = 1  
net.ipv4.tcp_syncookies = 1  
net.ipv4.ip_forward=1

# 修改命令行
#可以通过 
   sudo sysctl -w net.ipv4.tcp_fin_timeout=30
或者   
echo 30 >> /proc/sys/net/ipv4/tcp_fin_timeout

# 让 修改生效
/sbin/sysctl -p

配置解释:

net.ipv4.tcp_fin_timeout = 60
#表示如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间,(可改为30,一般来说FIN-WAIT-2的连接也极少)

net.ipv4.tcp_tw_reuse = 0
#表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭

net.ipv4.tcp_syncookies
#表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;

net.ipv4.tcp_tw_recycle = 0  
#表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭

net.ipv4.ip_forward=1
#表示是否打开IP转发 0:禁止,1:转发
#基本用途:如VPN、路由产品的利用;
#出于安全考虑,Linux系统默认是禁止数据包转发的。所谓转发即当主机拥有多于一块的网卡时,其中一块收到数据包,根据数据包的目的ip地址将包发往本机另一网卡,该网卡根据路由表继续发送数据包。这通常就是路由器所要实现的功能。
#配置Linux系统的ip转发功能,首先保证硬件连通,然后打开系统的转发功能
#less /proc/sys/net/ipv4/ip_forward,该文件内容为0,表示禁止数据包转发,1表示允许,将其修改为1。
#可使用命令echo "1" > /proc/sys/net/ipv4/ip_forward 修改文件内容,重启网络服务或主机后效果不再。若要其自动执行,可将命令echo "1" > /proc/sys/net/ipv4/ip_forward 写入脚本/etc/rc.d/rc.local 或者 在/etc/sysconfig/network脚本中添加 FORWARD_IPV4="YES"   

扩展:

#在存在大量短连接的情况下,Linux的TCP栈一般都会生成大量的 TIME_WAIT 状态的socket。可以用下面的命令看到
netstat -ant| grep -i time_wait 
#看到数目
netstat -ant|grep -i time_wait |wc -l
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值