北屋northhouse

北屋工作室 - 中国生存主义和灾难信息第一站

配置nginx php-fpm解决linux vps服务器cpu内存资源高导致502 504错误 阻止ddos cc攻击

2019-1月-28 周一 12:16 +0800

1、502 504报错,高资源占用,宕机离线…元凶:ddos cc攻击

首先,排除了vps本身性能问题、网站程序问题

然后,vps一直被攻击,最初用fw(wordpress下推荐wordfence+安全狗),通过检测异常访问,然后加入ip黑名单来阻止(自动+手动),费时费力,且有漏网之鱼,稍有松懈,隔段时间vps又被干趴下(本文最后会提到wordfence一个可能被忽略的实用功能…)。后来用cdn,好一些,但还是会出现资源高宕机的情况,通过观察,初步判断某些cdn会暂时的解析失效!(厂商产品维护?或者免费的就不稳定?),导致攻击指向真实ip而不是cdn:(

2、搞懂原理:消耗资源导致阻塞,进而宕机(可以用webbench压力测试、网站流量狂刷器这类的看下效果~)

说白了,ddos和cc就是一种看似正常的异常访问,通过高流量或者频繁发送请求,导致cpu 内存 缓存资源耗尽。

3、应对策略:换种思维,限制vps服务器性能,欺骗攻击者…

既然它要跑满cpu 内存 缓存,那我就把可用资源调低!比如4核cpu 4g内存,我就只给web服务用2核!2g内存!

4、最关键的2条配置:

4.1、cpu限制:

在nginx/conf下,找到nginx.conf,编辑它,找到下面这一条,processes后面填写1

worker_processes 1;

这个配置,默认一般是auto,有的文章说要发挥nginx性能,所以要填写cpu真实核心数,我的逻辑是限制使用cpu资源,所以填入1。

4.2、进程限制:

在/php7/etc下,找到php-fpm.conf,编辑它,找到下面两条,按等号后面的参数配置

pm = dynamic

pm.max_children = 8

一个php进程,最大30m左右,一般逻辑会用内存数除以30,得到一个进程数,然后写到pm.max_children里,比如3G内存,就写100,这就是跑满的逻辑,而我的逻辑是,就给他30乘以8的内存数,多于8个的进程就干掉,这样既保证正常web服务,也干掉了垃圾进程。

5、其他配置,限制连接请求数、限制并发、限速、限制连接和读写超时时间…还是在nginx.conf里配置,按照下面配置参数

##
# 基础配置
##
keepalive_timeout 10;
server_tokens off;
types_hash_max_size 2048;
##
# 主要配置
##
sendfile on;
tcp_nopush on;
tcp_nodelay on;
open_file_cache max=50000 inactive=20s;
open_file_cache_valid 30s;
open_file_cache_min_uses 2;
open_file_cache_errors on;
reset_timedout_connection on;
client_body_timeout 10;
send_timeout 2;
##
# DDoS 和 CC 防御配置,主要是限制链接数,详细:http://nginx.org/en/docs/http/ngx_http_limit_conn_module.html
##
client_body_buffer_size 128k;
large_client_header_buffers 4 32k;
server_names_hash_bucket_size 128;
client_header_buffer_size 32k;
client_max_body_size 50m;

limit_conn_zone $binary_remote_addr zone=conn_limit_per_ip:10m;
limit_req_zone $binary_remote_addr zone=req_limit_per_ip:10m rate=1r/s;
limit_conn conn_limit_per_ip 20;
limit_req zone=req_limit_per_ip burst=20;

fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 256k;

6、其他配置,如果你用wordpress,那这条就很好用:)

通过前边设置,服务器vps应该稳定不宕机了,这时候可以安逸的进入防火墙插件wordfence,进入firewall界面,查看Top IPs Blocked,看最近一周防火墙日志统计,攻击最多的ip,比如一周上千次这种,直接拉黑,这种ip基本可以判定是伪装成爬虫进行探测式攻击,直接消耗vps服务器资源,干掉没错。

7、其他配置,限制url长度,限制访问者动作

无论是安全狗还是别的什么防火墙或者通过改代码,总之,设置一个http探测规则,限制url长度,比如设置为300字符,让那些通过子目录加恶意参数的长地址访问直接被干掉,或者更极端一点,根据自己web服务正常的访问地址长度,就限制到这个长度,这样比较武断,但也最有效!(可能导致某些特殊服务无法运行,比如执行系统备份、计划任务、数据库维护等,如果管理员需要用这些特殊服务,临时把限制关了即可)。

限制访问动作,比较简单,限制到post get就可以,如果遇到管理员要用特殊服务,再打开。

趣知识 , , 北屋的k 配置nginx php-fpm解决linux vps服务器cpu内存资源高导致502 504错误 阻止ddos cc攻击已关闭评论
阅读量: 67

Comments

Comments are closed.