记一次并发上限及被dos攻击的处理
线上业务再次出现问题,nginx的错误日志频繁出现:connect() to unix:/dpan/web/sites//php-pool/ failed (11: Resource temporarily unavailable) while connecting to upstream
Backlog排查
先查看目前对应的域名限制数:
shell> ss -ln
Recv-Q Send-Q Local Address:Port Peer Address:Port
0 511 *:80 *:*
0 128 127.0.0.1:9000 *:*
注:Recv-Q如果接近于Send-Q,说明当前域名请求阻塞严重,可以把排查重点关注在此域名上。
1. 优先查看linux系统
值:
sysctl
调高该值,立即修改:
sysctl -w =65535
或修改配置文件:
echo "=65536" >> /etc/
sysctl -p
重启相关服务,比如Redis、MySQL、PHP-fpm。
建议同时调高以下值,打开
/etc/
:
= 20480
.netdev_max_backlog = 20480
net.ipv4.tcp_max_syn_backlog = 20480
net.ipv4.tcp_max_tw_buckets = 800000
修改后须重启服务器生效。
2. 修改nginx配置文件
科普:
-
worker_processes
:设置与cpu核数一致或高版本nginx设置auto -
worker_connections
:单个⼯作进程可以允许同时建⽴外部连接的数量数字越⼤,能同时处理的连接越多
不是随便设置的,⽽是与两个指标有重要关联,⼀是内存,⼆是操作系统级别的“进程最⼤可打开⽂件数”。
2.内存:每个连接数分别对应⼀个read_event、⼀个write_event事件,⼀个连接数⼤概占⽤232字节,2个事件总占⽤96字节,那么
⼀个连接总共占⽤328字节,通过数学公式可以算出100000个连接数⼤概会占⽤ 31M = 100000 * 328 / 1024 / 1024,当然这
只是nginx启动时,connections连接数所占⽤的nginx。
3.进程最⼤可打开⽂件数:进程最⼤可打开⽂件数受限于操作系统,可通过 ulimit -n 命令查询,以前是1024,现在是65535,
nginx提供了worker_rlimit_nofile指令,这是除了ulimit的⼀种设置可⽤的描述符的⽅式。 该指令与使⽤ulimit对⽤户的设置是同样的效果。此指令的值将覆盖ulimit的值,如:worker_rlimit_nofile 20960;
设置ulimits:ulimit -SHn 65535
通过 ps -elf | grep nginx 找到 nginx 的worker进程ID
通过 cat /proc/31613/limits 查看,其中2291是worker进程ID,请注意其中的Max open files
- backlog值调高:
server {
listen 80 backlog=20480;
listen 443 ssl backlog=20480;
...
}
修改后重启Nginx生效。
3. PHP配置
修改
# 默认值为-1,说是随系统配置,其实还是只有128
= 8129
修改后重启PHP生效。
如果backlog值已经很高,但网站依然报以上错误且网站502错误,可以排除是系统配置问题了,可能是瞬时并发太高服务器配置跟不上或被ddos攻击(特别是服务器下行带宽被占满情况下)。
可以继续排查端口、连接数,打开nginx的请求日志,从请求日志中筛选访问异常(频繁)的IP,将其加入黑名单处理。
端口排查
查看占用端口进程
netstat -lntup | grep 9000
查看TCP连接数统计 指定端口 连接数
netstat -nat|grep -i "80"|wc -l
netstat -nat|grep -i "443"|wc -l
查看所有连接请求
netstat -tn 2>/dev/null
统计httpd协议连接数
ps -ef|grep httpd|wc -l
统计已连接上的,状态为“established
netstat -na|grep ESTABLISHED|wc -l
查出哪个IP地址连接最多
netstat -tun|awk '{print $5}'|cut -d : -f1|sort|uniq -c|sort -n -r
访问量统计
根据访问ip统计uv
awk '{print $1}' |sort | uniq -c |wc -l
统计访问url统计pv
awk '{print $7}' |wc -l
查询访问最频繁的url
awk '{print $7}' |sort | uniq -c |sort -n -k 1 -r|more
查询访问最频繁的ip
awk '{print $1}' |sort | uniq -c |sort -n -k 1 -r|more
根据时间段统计查看日志
cat | sed -n '/14/mar/2015:21/,/14/mar/2015:22/p'|more
流量统计
使用 iftop 工具排查
-
安装
服务器内部安装 iftop 流量监控工具:
yum install iftop -y
-
查看
服务器外网带宽被占满时,如果通过远程无法登陆,可进入到服务器内部,运行下面命令查看流量占用情况:
iftop -i eth0 -P
-
注:-P 参数会将请求服务的端口显示出来,也就是说是通过服务器哪个端口建立的连接,看内网流量执行 iftop -i eth0 -P 命令。
-
如上面示例图,通过分析发现最耗流量的是服务器上 53139 端口和 115.205.150.235 地址建立的连接,产生了大量入网流量。执行 netstat 命令反查 53139 端口对应进程。
netstat -tunlp |grep 53139
- 3、最终定位出来是服务器上 vsftpd 服务产生大量流量,这时可以通过停止服务或使用iptables服务来对指定地址进行处理,如屏蔽 IP 地址,限速,以保证服务器带宽能够正常使用。
使用 nethogs 进行排查
-
安装
服务器内部安装 nethogs 流量监控工具:
yum install nethogs -y
-
查看
通过 nethogs 工具来查看某一网卡上进程级流量信息,若未安装可以通过 yum、apt-get 等方式安装。 -
假定当前 eth1 网卡跑满,则执行命令
nethogs eth0
,在右边的红框中可以看到每个进程的网络带宽情况,左边红框显示了进程对应的 PID,在此可以确定到底是什么进程占用了系统的带宽。
nethogs eth0
-
3、如果确定是恶意程序,可以通过 kill -TERM 来终止程序。
-
如是 Web 服务程序,则可以使用 iftop 等工具来查询具体 IP 来源,然后分析 Web 访问日志是否为正常流量,日志分析也可以使用 logwatch 或 awstats 等工具进行分析,若确定是正常的流量,则可以考虑升级服务器的带宽。
禁用IP
通过系统防火墙禁用
查看防火墙状态
sudo service iptables status
启动防火墙
sudo service iptables start
发现报错
iptables: No config file.
执行下面的命令
sudo iptables -P OUTPUT ACCEPT
sudo service iptables save
然后再启动防火墙
sudo service iptables start
禁用IP
sudo iptables -I INPUT -s 对方IP -j DROP
-I insert 的意思
-s source 的意思
删除禁用IP
sudo iptables -D INPUT -s 对方IP -j DROP
-D delete 的意思
————————————————
原文链接:/JustDI0209/article/details/123841187
通过nginx deny命令禁用
主配置文件禁用
拒绝某个IP:
server {
listen 80;
server_name localhost;
allow all;
deny 123.123.123.123;
error_page 500 502 503 504 /;
}
如果你需要对整个IP段设置不允许访问,可以这么写:
deny 123.0.0.0/8; // 封 123.0.0.1~123.255.255.254 这个段的ip
deny 123.123.0.0/16; // 封 123.123.0.1~123.123.255.254 这个段的ip
deny 123.123.123.0/24; // 封 123.123.123.1~123.123.123.254 这个段的ip
deny all; // 封所有ip
修改网站配置文件.htaccess
除了修改Nginx配置文件之外,还可以通过修改网站配置文件.htaccess来限制某IP(段)访问,方法如下。
将以下内容保存为.htaccess文件,上传至网站根目录。如果原来已经存在.htaccess文件的,将以下内容加到该文件开头。
rder allow,deny
allow from all
deny from 123.123.123.123
如果要限制一个IP段,比如要限制123.123.123.*这个C段,则输入:
Order allow,deny
allow from all
deny from 123.123.123
以上内容表示拒绝123.123.123开头的所有IP,其他IP允许。
如果要限制多个IP段,中间用空格隔开,如:
Order allow,deny
allow from all
deny from 111.111.111 111.222.222 111.333.333
说明,该配置不用重启web服务器,修改立即生效。
————————————————
原文链接:/linfeng_meng/article/details/126709728