博客 (15)

前面写过一篇文章介绍了不买高防 IP,照样抵挡 DDoS 攻击(IP 篇),如果攻击的是域名(CC),那么...


本文适用场景:攻击的是 web 网址而非 IP,来源有许多各地的 IP 地址,每个 IP 地址每小时只有若干请求,但整个网站每分钟有数万请求量。


《小白鼠A》(贵)

阿里云有一款产品叫“Web 应用防火墙”,开通并接入云产品,试用按量付费即可。

在防护配置-Web核心防护 中可配置各种规则,譬如:

“自定义规则”可添加网址/UA/IP/Cookie/等中包含某些关键词的请求;

“区域封禁”可按地区来限制请求;

另外还有“CC防护”等各种实用规则。

添加规则后记得关联实例。

配置完成后可在总览页面查看请求情况,如果攻击停止可关闭防火墙。

试用了12小时,平均每分钟请求2-5万次,消耗 15000SeCU,费用大概是750元。


《小白鼠B》(推荐)

阿里云有一款产品叫“边缘安全加速 ESA”,开通接入域名(注意填写域名时不要写 www)。

创建购买成功后会有一个 CNAME 域名,解析生效。配置 HTTPS 证书。

打开“我正在遭受攻击”,开启后站点进入严格防护模式,默认对所有 HTTP 请求做滑块挑战。这是非常能节省费用的操作,实测开启与不开启的数量相差20倍(具体视攻击强弱)。

另外,ESA 自带的“安全防护-WAF”中若想根据 URL 中包含某个关键词来拒绝请求,需要升级套餐。可以直接在“规则-重定向”设置 302 跳转也能达到类似的效果,但是节省流量的最好办法还是开启滑块。

费用的话,大部费用是由“客户端请求到边缘加速服务器的流量”和“边缘加速服务器响应给客户端的流量”组成的,而且滑块页面不计入流量。可免费试用。

在开启滑块的情况下,1分钟产生10M流量,基础版包含的50GB可以用3天。标准版(500GB)375元可以用一个月。(以我站实测为例,各站情况不同)。

具体费用在“计费管理-套餐管理-套餐总量 (月)-image.png”查看。超过套餐的流量会使用CDN流量包抵扣。

ECS 获取客户端 IP 的问题有两种解决方案,1. 设置四层代理分析(企业版),2. 设置重定向规则,重定向到直接解析到该网站的另一个域名。

为了尽量减少滑块对用户体验的影响,建议加白名单:ESA-站点-安全防护-WAF-白名单规则,譬如添加省份规则,跳过全部规则(包括滑块)。

其它问题:滑块会拒绝蜘蛛?

其它相似产品:Cloudflare、腾讯云 EdgeOne。


----------------下面是停站维护时显示临时页面的做法----------------

被攻击期借用阿里云 OSS/CDN 显示“维护中”页面的方法。

1.

首先让 AI 快速生成一个维护中的页面,上传到 OSS。

虽然这个文件有一个对应的 CDN 链接,但是域名解析使用“显性 URL”模式并不能正常访问到这个页面。

2.

在阿里云 CDN 添加一个域名(也就是网站域名),会生成一个 CNAME 域名,网站域名 CNAME 到这个域名上。

配置这个 CDN 域名的 OSS 实例、HTTPS 等信息。

这样生效后,访问网站域名就能请求到这个 OSS 上了。

3.

但是它并不像网站一样有默认文档,需要添加重写规则。

打开 CDN-域名管理-缓存配置-重写访问URL,添加,添加重写规则。

例:如果目标页面路径是 https://域名/index.html,那么重写规则就是:

^/(?!.*index\.html$).*$

也就是把所有除 /index.html 以外的路径全部重写到 /index.html。

4.

下一步只要观察这个域名的实时流量和带宽,如果攻击停止了,将域名解析回 ECS。

CDN-统计分析-实时监控-访问数据-选择域名-查询。

xoyozo 22 天前
168

本文介绍 Token 认证和 HMAC 认证两种方式。


一、Token 接口认证方式

原理:

客户端使用账号密码等信息登录,服务器验证通过后生成一个 Token 发送给客户端。客户端在后续的请求中携带这个 Token,服务器通过验证 Token 来确认用户的身份和权限。

应用场景:移动应用、Web 应用(特别是 SPA)

优点:

无状态性,即服务器不需要存储用户的会话信息。

易于实现跨域认证。

缺点:

Token 可能被窃取,应使用 HTTPS、不暴露在 URL 中、使用 HttpOnly 的 Cookie、对 Session ID 进行验证、设置合理过期时间、对 Token 进行加密等措施加强防范。


二、HMAC 接口认证方式

原理:

客户端将消息M与密钥K连接起来,通过哈希函数计算得到 HMAC 值,发送给服务器。服务器收到请求后,使用相同的密钥和请求参数重新计算 HMAC 值,如果与客户端发送的签名一致,即是合法请求。

优点:

安全性较高,攻击者很难伪造 HMAC 值,截获并篡改数据也无法通过服务端验证。

计算效率较高,哈希函数(如 MD5、SHA-1、SHA-256 等)计算效率比较高。

缺点:

密钥的更新和管理比较麻烦。


扩展:

在消息体中添加时间戳以防止重放攻击。

加密隐私数据:可以使用对称加密算法(如 AES)或非对称加密算法(如 RSA、ECC 等)对部分隐私数据进行加密。非对称算法虽然更安全,但速度较慢,如需加密大量数据,可以考虑使用对称加密算法进行加密,然后使用非对称加密算法对对称密钥进行加密。

xoyozo 1 年前
2,534

前往活动页面>>>

一、活动时间
2023年10月31日0点0分0秒至2026年3月31日23点59分59秒

二、活动对象
同时满足以下全部条件的阿里云用户:
1、阿里云注册会员用户;
2、完成阿里云实名认证;
3、符合活动规则的新老用户,均可参与。

三、活动权益参与规则
1、云服务器ECS经济型e实例(简称“99实例”或“99元e实例”)活动范围:
个人认证或者企业认证的用户购买指定配置“e实例2核2G,3M固定带宽,40G ESSD Entry 系统盘”可享受包1年99元,活动地域包含北京,杭州,上海,张家口,呼和浩特,深圳,成都,河源,乌兰察布,广州。
2、云服务器通用算力型u1实例(简称“199实例”或“199元u1实例”)活动范围:
企业认证的用户购买指定配置“u1实例2核4G,5M固定带宽,80G ESSD Entry 系统盘”可享受包1年199元,活动地域包含青岛,北京,杭州,上海,深圳,成都,河源,乌兰察布,广州,中国香港,日本(东京),新加坡,美国(硅谷),英国(伦敦),德国(法兰克福)。
3、活动说明:
在活动期间内,同一个人认证主体只可保有1个“99元e实例”;同一企业认证主体最多可同时保有1个“99元e实例”和1个“199元u1实例”,实例到期后在活动时间范围内可持续以低价续费保有,另购使用官网价。本次优惠不可与优惠券叠加使用。同一用户同一时间只能保有一个“99实例”或者“199实例”。

四、购买场景
1、新购场景:
在符合参与规则的情况下,直接低价购买指定配置产品,有效期1年。若无法购买,请确认是否存在同人或其他实例已占用等情况。
2、续费场景:
在活动时间内,指定配置每年最多可以以优惠价格续费1次,1次1年,直到活动时间结束持续享受续费优惠。
备注:若续费其他实例时使用了低价权益,原低价产品实例将无法再享受低价权益。
根据以上规则,常见场景有以下几种:

场景1:若您在2023年10月31日新购“99元e实例”,您可在2023年10月31日至2024年10月30日(即新购后的一年内)完成第一次续费(此时服务器到期时间为2025年10月30日);可在2024年10月31日至2025年10月30日完成第二次续费(此时服务器到期时间为2026年10月30日);可在2025年10月31日至2026年3月31日完成第三次续费(此时服务器到期时间为2027年10月30日);
即连续以99元1年的价格续费3年,可以使用“99元e实例”至2027年10月30日,该服务器总保有时长4年。

场景2:若您在2026年3月31日(活动截止前最后一天)新购“99元e实例”/“199元u1实例”,您可在2026年3月31日当天完成一次续费(此时服务器到期时间为2028年3月31日);
即以99元/199元1年的价格续费1年,可以使用“99元e实例”/“199元u1实例”至2028年3月31日,该服务器总保有时长2年。

场景3:若您在2024年4月1日新购“99元e实例”/“199元u1实例”,您可在2024年4月1日至2025年3月31日完成第一次续费(此时服务器到期时间为2026年3月31日);您可在2025年4月1日至2026年3月31日完成第二次续费(此时服务器到期时间为2027年3月31日);
即连续以99元/199元1年的价格续费2年,可以使用“99元e实例”/“199元u1实例”至2027年3月31日,服务器总保有时长3年。

3、退订场景:
支持五天无理由退款,退款后保留“低价长效”优惠资格,在活动时间范围内可再次使用低价购买活动配置;
4、变配场景:
变配至“低价长效优惠”指定配置时当前付费周期不享受低价权益,续费时可享受包1年99元/199元优惠;“低价长效优惠”指定配置发生变配/升级/降配操作后,变配需按照官网价补差价,请仔细阅读变配页面引导及相关资费说明,但仍占用权益资格直到该实例释放,购买相同规格产品不能再享受低价,同时续费时也不再享受包1年99元/199元优惠;
5、如用户账号有欠费,需先补足欠费再进行购买。
6、低价权益产品仅供账号本人使用,不允许过户转让。
7、如在参与“低价长效”优惠过程中,使用其他收费产品/功能,则需按照产品/功能标准资费支付超额产生的费用。
8、其他规则:
阿里云有权根据业务需求,随时调整提供给用户低价购买的产品范围、产品数量、产品配置、购买规则等,用户应以购买时相关页面的展示内容为准,但不影响用户在活动规则调整前已经获得的权益。
9、禁止使用产品来挖掘货币,如您使用产品来挖掘货币,可能会被收取费用及取消权益资格。
10、为保证活动的公平公正,如用户在活动中存在隐瞒、虚构、作弊、欺诈或通过其他非正常手段规避活动规则、获取不当利益的行为,例如:作弊领取、恶意套现、网络攻击、虚假交易等,阿里云有权收回相关权益、取消用户的活动参与资格,撤销违规交易,必要时追究违规用户的法律责任。
您应确保您对云服务器的使用不侵犯他人著作权,不会用于私服架设服务、私服程序、私服网站、私服源码、私服服务器和空间等。

五、常见FAQ:
1.用户在购买完99实例/199实例后,如果因某些原因导致需要退款或者释放实例,还可以再以99元/199元的优惠价格重新购买吗?
答:可以,99实例/199实例支持五天无理由退款,退款后仍然保留优惠资格,用户在活动时间范围内可再次使用低价购买活动配置;
2.活动规则里写的1年续费1次中,“1年”指的是自然年吗?
答:“1年”指的是云服务器购买1年的付费周期,即两次续费时间必须间隔1年以上;
3.99实例/199实例优惠套餐最多可以享受几年的优惠?
答:若您在24年3月31日前首次新购99实例/199实例优惠套餐,最多可以享受4年优惠(包含新购1次,续费3次,1次1年);

六、相关名词及解释
1、“阿里云官网”,是指包含域名为 www.aliyun.com/ 的网站以及阿里云客户端,如APP,但阿里云国际站,包括alibabacloud.com以及所有下属页面和jp.aliyun.com以及所有下属页面除外。
2、“同一用户”,是指根据不同阿里云账号在注册、登录、使用中的关联信息,阿里云判断其实际为同一用户。关联信息举例:同一手机号、同一邮箱、同一证件等。
3、“同人账号”,是指同一用户拥有多个阿里云账号的,各个账号之间互为同人账号。
4、“新用户”,是指在阿里云官网没有收费云产品购买记录的阿里云会员用户。新用户在进行首次云产品购买行为时,也被称为“首购用户”。
5、“老用户”,是指在阿里云官网已有收费云产品购买记录的阿里云会员用户。
6、“云产品”,是指阿里云官网售卖的中国大陆节点的产品和服务,但不包括域名、虚拟主机、云市场产品、专有云产品,云通信产品。
7、“指定云产品”,是指某场具体活动页面列举的活动云产品。
8、活动中涉及“打折”、“折扣”、“×折”或“省××元”,是指将本活动期间的某款产品的活动价格,与无任何活动期间的相同产品的日常最小单位售价(例如:月价),按相同购买时长进行比较后,所获得的比较结果。
9、活动涉及的“划线价”、“日常价”,通常是指该产品曾经展示过的销售价,并非原价,仅供参考。具体活动页面单独对“划线价”、“日常价”进行说明的,以其表述为准。
10、除非有相反证据证明外,用户参与活动所获得的全部权益和相应责任,均归属于参与活动的该阿里云账号所对应的实名认证主体。
11、活动中的“天”、“日”、“工作日”等均指该日的0点至24点(北京时间)。
12、阿里云可以根据活动的实际情况对活动规则进行变动或调整,相关变动或调整将公布在活动页面上,并于公布时即时生效;但不影响用户在活动规则调整前已经获得的权益。您购买阿里云单项产品时,亦应遵守该产品法律服务协议。
13、活动页面提到的“核” ,均指vcpu。

xoyozo 2 年前
2,847

ChatGPT:

当你从 <textarea> 中获取到的数据中包含换行符时,如果直接在 Vue 模板中使用插值表达式 {{}} 显示,是无法保持换行的。因为在 HTML 中,多个连续的空格和换行符都会被视为一个空格,因此如果直接将 \n 显示在模板中,会被渲染成一个空格。

解决这个问题的方法之一是使用 CSS 样式来控制换行的显示。可以为显示数据的元素添加 white-space: pre-wrap; 样式,该样式可以保留换行符并自动换行。

例如,假设你的数据保存在 text 变量中,可以这样在模板中使用:

<pre style="white-space: pre-wrap;">{{ text }}</pre>

在上面的例子中,使用 <pre> 元素来包裹要显示的数据,并添加 white-space: pre-wrap; 样式,这样数据中的换行符就能被保留并自动换行了。

另外,如果你在 Vue 组件中使用了 v-html 指令来显示数据,也可以在数据中使用 <br> 标签来手动添加换行符,然后使用 v-html 来渲染数据。但是,这种方法需要注意 XSS 攻击的问题,因为 v-html 可以渲染任意的 HTML 标签和内容,如果数据中包含恶意代码,很容易被攻击者利用。

xoyozo 3 年前
2,900

判断是否为数字

if isNumeric(id) then
else
	response.End
end if


强制转换为数字

ii = clng(ii)


转义单引号

replace(xxx, "'", "\'")


判断一个字符串是否包含另一个字符串

if instr(str, "s")>0 then
	response.Write(1)
else
	response.Write(0)
end if


xoyozo 4 年前
3,589

前言:本文介绍的是攻击IP的案例,如果攻击的是域名(如 CC),参此文


【阿里云】尊敬的@aliyun.com:为了保障服务器的稳定运行,您的IP:  实例名称: 已启动限流保护措施。阈值与产品规格相关,您可以登录云盾控制台调整清洗阈值,若超出调整范围请提交售后工单反馈或电话95187-1进行咨询。

【阿里云】尊敬的@aliyun.com:您的IP: 受到攻击流量已超过云盾DDoS基础防护的带宽峰值,服务器的所有访问已被屏蔽,如果300分钟后攻击停止将自动解除否则会延期解除。详情请登录【云盾控制台】-【DDoS基础防护】查看或致电95187-1进行咨询。

恭喜,你的 ECS 服务器受到 DDoS 攻击了。这个时候,工单客服和电话客服都会极力推销高防 IP 这个产品(DDoS高防(新BGP)),为了抵挡一年才会遇到几分钟的攻击,咱们还是选择更为经济的方式来解决攻击这个问题吧。

ECS 等产品都会自带流量清洗这个功能,在阈值范围内的攻击流量会免费处理掉,超过阈值就把 ECS 拉入黑洞,以防止同机房的其它服务受到影响。一般攻击才持续 5~20 分钟,关小黑屋就等 5 个小时。

既然受攻击的是 ECS 公网 IP,那么我们可以借用负载均衡(SLB)使用 ECS 的私网 IP 来请求业务。

初期可以创建一个按量付费的 SLB,熟悉费用后可再次调整。选择“私网”(文末解释为什么不选择“公网”)

image.png

服务地址绑定到 ECS,按业务需求添加监听端口:

image.png


此时,SLB 已经和 ECS 打通了,但是这个私网 SLB 并没有公网 IP,所以继续购买一个叫弹性公网 IP (EIP)的产品,用于打通公网与私网。同样初期选择按量付费。

将 SLB 与 EIP 绑定(各自的管理界面都有相关操作入口)。

最后,将域名解析到 EIP 即可,顺便将 TTL 改为最小值。

解析生效后,外部的请求通过 EIP 到 SLB 再到 ECS 的私网 IP 访问成功,但 ECS 主动的出流量仍然通过其公网 IP 流出,在黑洞期间相关的操作仍然会失败(如上传文件到外部图床),这个等后续遇到再补充解决方案。


一旦 DDoS 改为攻击 EIP,那么只要重新创建一个新的 EIP,将 SLB 绑定到该新的 EIP,并解析域名即可。


既然本例的 SLB 是私网到私网的,是不是可以省去 SLB,由 EIP 直接到 ECS?

经实践证明,EIP 绑定 ECS 会提示 ECS 已存在公网 IP,无法绑定。而且,带宽计费方式为按固定带宽的包年包月实例,不支持将公网 IP 转换为弹性公网 IP。


SLB 为什么不选择“公网”?

本方案仅为临时防止 DDoS 攻击,所以一旦再次受到攻击需要立即做出反应,而 SLB 的配置相对于 EIP 会更为复杂,所以我们选择新建 EIP 的方式来代替新建公网 SLB。费用方面,私网 SLB 没有流量费用,EIP 的流量费用与公网 SLB 相同,所以两种方案的费用是相差不大的。


最后,推荐使用阿里云 SDK 通过 API 接口来实现一键部署/更换 EIP 功能。

进阶功能:使用接口 DescribeEipAddresses 判断 EIP 的 LockReason 状态是否为 security,若是则自动切换 EIP,实现无人值守全自动防 DDoS。

xoyozo 5 年前
10,445

核心文件路径:/theme/html/demo*/src/js/components/core.datatable.js

所有参数的默认值见该文件 3369 行起。

data:

属性 功能
type 数据源类型 local / remote
source 数据源 链接或对象(见下方)
pageSize 每页项数 默认 10
saveState 刷新、重新打开、返回时仍保持状态 默认 true
serverPaging 是否在服务端实现分页 默认 false
serverFiltering 是否在服务端实现筛选 默认 false
serverSorting 是否在服务端实现排序 默认 false
autoColumns 为远程数据源启用自动列功能 默认 false
attr

data.source:

属性 功能
url 数据源地址
params 请求参数
query: {
}
headers 自定义请求的头
{
    'x-my-custom-header': 'some value',
    'x-test-header': 'the value'
}
map 数据地图,作用是对返回的数据进行整理和定位
function (raw) {
    console.log(raw)
    // sample data mapping
    var dataSet = raw;
    if (typeof raw.data !== 'undefined') {
        dataSet = raw.data;
    }
    return dataSet;
}

layout:

属性 功能
theme 主题 默认 default
class 包裹的 CSS 样式
scroll 在需要时显示横向或纵向滚动条 默认 false
height 表格高度 默认 null
minHeight 表格最小高度 默认 null
footer 是否显示表格底部 默认 false
header 是否显示表头 默认 true
customScrollbar 自定义的滚动条 默认 true
spinner Loading 样式
{
	overlayColor: '#000000',
	opacity: 0,
	type: 'loader',
	state: 'primary',
	message: true,
}
icons 表格中的 icon
{
	sort: {
	    asc: 'flaticon2-arrow-up', 
	    desc: 'flaticon2-arrow-down'
	},
	pagination: {
		next: 'flaticon2-next',
		prev: 'flaticon2-back',
		first: 'flaticon2-fast-back',
		last: 'flaticon2-fast-next',
		more: 'flaticon-more-1',
	},
	rowDetail: {
	    expand: 'fa fa-caret-down', 
	    collapse: 'fa fa-caret-right'
	},
}
sortable 是否支持按列排序 默认 true
resizable
是否支持鼠标拖动改变列宽 默认 false
filterable 在列中过滤 默认 false
pagination
显示分页信息 默认 true
editable
行内编辑 默认 false
columns
见本文下方
search
搜索
{
	// 按回车键确认
	onEnter: false,
	// 文本内容
	input: null,
	// 搜索延时
	delay: 400,
	// 键名
	key: null
}

layout.columns:

属性 功能 解释
field 字段名 对应 JSON 的属性名,点击表头时作为排序字段名
title 表头名 显示在表格头部
sortable 默认排序方式 可选:'asc' / 'desc'
width 单元格最小宽度 值与 CSS 值一致,填数字时默认单位 px
type 数据类型 'number' / 'date' 等,与本地排序有关
format 数据格式化 例格式化日期:'YYYY-MM-DD'
selector 是否显示选择框 布尔值或对象,如:{ class: '' }
textAlign 文字对齐方式 'center'
overflow 内容超过单元格宽度时是否显示 'visible':永远显示
autoHide 自适应显示/隐藏 布尔值
template 用于显示内容的 HTML 模板 function(row) { return row.Id; }
sortCallback 排序回调 自定义排序方式,参 local-sort.js

其它:

属性 功能 解释
translate 翻译

参 core.datatable.js 3512 行,简体中文示例:

translate: {
    records: {
        processing: '加载中...',
        noRecords: '没有找到相关内容',
    },
    toolbar: {
        pagination: {
            items: {
                default: {
                    first: '首页',
                    prev: '前一页',
                    next: '后一页',
                    last: '末页',
                    more: '更多',
                    input: '请输入跳转页码',
                    select: '设置每页显示项数',
                },
                info: '当前第 {{start}} - {{end}} 项 共 {{total}} 项',
            },
        },
    },
},


extensions

暂时没有找到对字符串内容进行自动 HTML 编码的属性,这可能带来 XSS 攻击风险,在 remote 方式中必须在服务端预先 HtmlEncode。即使在 layout.columns.template 中进行处理也是无济于事,恶意代码会在 ajax 加载完成后立即执行。


方法和事件:待完善。


更多信息请查询官方文档:https://keenthemes.com/keen/?page=docs&section=html-components-datatable

xoyozo 5 年前
5,767

网站的“防跨站攻击”默认是开启的,对应网站根目录下存在 .user.ini 文件可阻止该网站程序读写网站目录外的文件或目录


通过 FTP 上传或通过 PHP 创建的文件(夹)的用户(组)都是 www:www,目录权限 755,文件权限 644


PHP 不需要“执行”权限,因为这个“执行”权限是针对 sh 的


因此 PHP 在该站任何位置具有写入权限


理想的权限控制是:pure-ftp 使用另外的用户(组),譬如 ftp:ftp


这样使用 www:www 的 PHP 就无法随意创建文件,只能在开放了“公共权限”中的“写入”权限的目录中创建。


查看系统用户组:cat /etc/group

查看系统用户:cut -d : -f 1 /etc/passwd


查看 pure-ftp 帮助:

/www/server/pure-ftpd/bin/pure-pw --help


修改 FTP 用户的所有者和组:

/www/server/pure-ftpd/bin/pure-pw usermod FTP用户名 -u 所有者 -g 组


重启 pure-ftp


上述命令经简单测试并没有更改 FTP 用户的所有者和组……



退而求其次的做法是通过 SSH 用 root 来上传网站程序代码,并开放上传目录的“写入”权限


还有重要的一点,在网站的配置文件中禁止这些有“写入”权限的目录中的 PHP 运行权限!(参:在 CentOS (Linux) 中设置目录写入权限,并禁止执行 php


xoyozo 9 年前
8,214

本文不定时更新!


A: MySQL 执行 SHOW FULL PROCESSLIST 

Q: 查看连接数和慢查询,适用于 MySQL 数据库无法连接 1040


A: iftop -i eth0

Q: 查看占用带宽的IP(命令:iftop -i eth0 -F ip/24),添加到安全组、防火墙、宝塔的黑名单中。

命令 grep -l "x.x.x.x" /www/wwwlogs/*.log 可以在 wwwlogs 目录下的所有 .log 文件中查找指定的恶意 IP。


A: goaccess -f xxx.log

Q: 实时分析网站日志,查看请求最多的IP


A: net.xoyozo.weblog 日志分析工具

Q: 自制的 Web 日志分析工具,可按多种方式排序,纠出可疑访问


A: 重启 web 服务器

Q: 有时候能解决 CPU 和内存消耗的问题,如果一会儿又升高,则需要找另外的原因


Q: 500 服务器内部错误

502 Bad Gateway

504 Gateway Time-out

A: 查看 php 日志,可能的路径:

/usr/local/php/var/log/php-fpm.log

/www/server/php/[版本]/var/log/php-fpm.log


Q: RDS MySQL IOPS 使用率高的原因和处理

A: 根据时间点查看慢查询


Q: Discuz! 论坛界面错乱、表情不显示、模块缺失、登录失败、发帖失败等等

A: 进入管理中心 - 工具 - 更新缓存,能解决大部分问题


Q: Discuz! 浏览帖子提示“没有找到帖子

A: 进入数据库,修复表 pre_forum_post 或分表


Q: CPU 100% 或内存 100%,负载100+

A: 原因有很多,以下是一些建议:

Windows 在任务管理器中查看进程

当前是否有正常的大流量访问(譬如民生类论坛的某个帖子突然火了)特别是重启无效的情况

对比网站日志大小可大致确定哪个网站被大量恶意请求。

观察:命令 top

排查:通过关闭网站来确定是某网站的问题,通过关闭功能确定是某功能的问题,如果 nginx 崩溃请参下条

案例:通过修改 mobcent 文件夹名确定是安米的文件被疯狂请求导致的,更新插件和 mobcent 包解决问题。

如果都是正常访问,top 看到很多 php-fpm,而且个个占用 CPU 还不小,那么根据服务器硬件配置来修改 php 的并发量,如宝塔面板在 php 设置 - 性能调整 页,300 并发方案的推荐配置是:

max_children:300
start_servers:30
min_spare_servers:30
max_spare_servers:180

另外,memcached 或 redis 的配置也可以进行相应的修改。

另一个案例是 kswapd0 进程占满 CPU,原因是内存不足导致 swap 分区与内存频繁交换数据。同样调整 php 的设置即可。

也可以通过 iftop 来查询占用带宽较多的 IP 并封禁(出方向),如果 CPU 能降下来,那这个 IP 就是罪魁祸首。

* 使用 WAF 的审计 WAF 日志,未使用 WAF 的审计 Web 日志。


Q: 阿里云 ECS 的 CPU 突然达到 100%,并持续到次日 0:00 左右

A: 可能 ECS 是 t5 规格,受 CPU 积分制度限制,积分耗尽时 CPU 不工作。解决方法是更换其它规格产品或升配。


Q: ASP.NET 所在服务器 CPU 突然达到 50% 或 100%,并持续

A: 首先确定哪个网站,再依次排查网站各功能。可能是 HttpWebRequest 请求远程数据时长时间未返回结果导致的程序阻塞。


Q: nginx 服务停止

A: 查看 nginx 日志

WDCP 路径:/www/wdlinux/nginx-1.0.15/logs/error.log


Q: 公网出带宽 100%,其它指标正常

A: Windows 在任务管理器-性能-资源监视器-网络 查看占用带宽的进程PID,然后在任务管理器-详细信息中的找到对应的用户(如果为每个网站分别创建了用户,就能知道是哪个网站占用了带宽);如果是被 PID 为 4 的 System 占用大部分带宽,也可以尝试重启 IIS 来解决。

CentOS 使用 nethogs 查看占用带宽的进程PID和USER,如果为每个网站分别创建了用户,就能知道是哪个网站占用了带宽,否则只能一个个关闭网站来判断,不知道大家有没有好的方法?当然还可以直接用 iftop 命令查看占用带宽的 IP。另外,查看每个网站在那个时间段的日志文件的大小也能大概看出是哪个网站被采集了。


A: Linux 显示每个用户会话的登入和登出信息

utmpdump /var/log/wtmp

参考:http://www.tulaoshi.com/n/20160331/2050641.html


Q: RDS 的 CPU 100%

A: 如果是突然持续占满(同时伴随 ECS 资源使用率下降,页面出现 502),很大可能是受攻击(或社交网站推送突发事件等),查看“慢查询”,添加相关索引;如果是 Discuz! 论坛,可尝试修复优化表 pre_common_session。

如果是数日缓步上升,或新项目上线,考虑 SQL 慢查询,思路:MySQL / SQL Server

MySQL:SHOW FULL PROCESSLIST

SQL Server:sp_who


Q: php 网站的服务器,内存在数天内缓慢上升

A: 大概是 php-fpm 占用过多,或进程数太多

更改 php 的配置(如 max_spare_servers),执行:service php-fpm reload


Q: 进程 cloudfs 占用内存过多

A: 参:https://xoyozo.net/Blog/Details/cloudfs-cache


Q: RDS 磁盘占用过大

A: 参:https://xoyozo.net/Blog/Details/how-to-use-rds


Q: ECS 受到 DDoS 攻击怎么办?

A: 参:https://xoyozo.net/Blog/Details/aliyun-ddos-without-bgp


Q: 如果 ECS 和 RDS 各项指标都没有异常,但网页打开慢或打不开502,TTFB 时间很长,是什么原因?(ECS 的 CPU 100%,RDS 的连接数上升,也可参考此条)

A: 数据库有坏表,尝试优化/修复表(慢 SQL 日志中锁等待时间较长的表?),或主备切换。show full processlist 时看到许多

DELETE FROM pre_common_session WHERE  sid='******'  OR lastactivity<******  OR (uid='0' AND ip1='*' AND ip2='*' AND ip3='*' AND ip4='*' AND lastactivity>******)


Q: Discuz! 创始人(站长)密码被改

A: 数据库找到 pre_ucenter_members 表,复制其它的已知登录密码的账号,复制其 password 和 salt 两个字段的值到创始人账号中,创始人账号即可用该密码登录了。


Q: 通过 iftop 观察到,Discuz! 网站从 RDS 数据库到 ECS 网站服务器私网流量非常大,远大于公网流量

A: 可能是缓存出问题了,尝试卸载重装 Redis 来解决。


Q: 宝塔面板中安装的 Redis 经常自动停止

A: 尝试卸载重装 Redis 来解决。


Q: 马甲客户端出现“您的网络有些问题”

A: 原因有许多,其中一个就是新建了一个数据表,然后 /source/class/table/ 下面丢失了对应的文件,具体可以找官方排查原因。


Q: 排查服务器安全需要检查哪些日志?

A: Web日志、登录日志(/var/log/secure)等。


Q: 带宽波形以几分钟为周期呈锯齿状波动是什么原因?

A: 该现象主要由防火墙流量管控机制与检测周期设置共同作用所致。防火墙基于预设的带宽阈值执行安全防护策略,当检测到流量峰值超过设定阈值时,将自动触发限流策略拒绝后续请求。待流量回落至安全阈值后,系统自动恢复服务访问权限。若防火墙的带宽采样检测周期设置过长(如以分钟为单位的检测间隔),将导致系统对实时流量变化的响应出现迟滞。这种周期性的检测机制会使带宽监控数据在阈值临界点附近呈现规律性的锯齿状波动特征。

优化建议:可通过调整防火墙的流量检测周期至更小时间粒度(如10-15秒),或采用动态流量整形策略,以实现更平滑的带宽控制效果。

补充说明:对于阿里云监控数据的调用,建议注意接口调用频率管控。高频调用云监控API接口将触发阿里云的API计费策略,可能产生额外的资源消耗成本。


其它案例

  1. 某台 ECS 上的多个网站出现 502,查询到 CPU / 内存 / 带宽 都比平时高,但都未满。用 iftop 看到连接的一个远程 Redis 占用内网带宽非常高。尝试重启远程 Redis 未果。尝试重启 ECS 上的 nginx 未果。尝试重启 ECS 未果。进入 ECS 的宝塔面板,重启 PHP 有效。

  2. DDos攻击看这篇,现象是入流量大,CC攻击看这篇,现象是出流量大。

xoyozo 9 年前
10,124

论坛使用阿里云的 ECS + RDS + OSS 搭建,最近经常隔三差五出现 RDS 的 CPU 和连接数突然满负荷的情况,导致数据库无法连接。这种情况一般会认为是受到了攻击,因为如果是访问量大或者是哪里有慢查询,应该是资源消耗逐步上升直至崩溃的,沿着这个思路去查 Web 日志封 IP,但效果不大,关闭功能、卸载插件也没用。

开启阿里云后台的 SQL 审计,能看到 SQL 查询日志,但是很难找有问题的 SQL。

最终在重启 RDS 后执行以下语句列出所有正在执行或阻塞的语句:

show full processlist

在结果列中,Command 为 Query 是正在执行查询操作的语句,发现几乎所有的 SQL 都是:

SELECT * FROM pre_forum_thread WHERE tid>0 AND fid IN('42','95','247','41','567','62','149','229','37','230','93','190','284','75','38','568') AND `fid`<>'546' AND replies > 0 AND displayorder>=0 ORDER BY lastpost DESC  LIMIT 10

再加上之前出现的情况是,论坛帖子列表和详情页面能正常打开时,论坛首页也不一定能打开,所以基本定位到是“首页四格”的数据库查询导致的。

进入论坛后台首页四格设置,对比了版块 id 后确认了这个 bug。

单独执行该语句大约耗时 5s(主题帖 200 万),设置的缓存时间 10 分钟。

processlist 中看到这些语句的 state 都是 Creating sort index,尝试去掉 ORDER BY 后执行果然只需要 16ms。

5s 内的访客都是从数据库读取的,能处理完就正常,否则累积就导致 RDS 崩溃,每 10 分钟都会重现一次风险。

当然这个问题可以通过添加索引来解决。

xoyozo 9 年前
8,308