前言
前段時(shí)間,博客和論壇都放到的阿里云新購(gòu)的三年 T5 實(shí)例服務(wù)器上,等都轉(zhuǎn)移過去才發(fā)現(xiàn),所謂的 T5 實(shí)例只能滿足10
創(chuàng)建文件系統(tǒng)用 mkfs命令,結(jié)合 -t 選項(xiàng)來指定文件系統(tǒng)類型;如以下操作是把 /dev/sdb1 分區(qū)格式化為XFS文件系統(tǒng)
一般沒有特殊情況,不會(huì)在Linux中創(chuàng)建或使用Windows操作系統(tǒng)的文件系統(tǒng)類型,
若在Linux中創(chuàng)建FAT32文件系統(tǒng),可結(jié)合 “-t vfat” 或 “.vfat” 選項(xiàng)指定類型,并添加 “ -F 32” 選項(xiàng)指定FAT版本,例如,執(zhí)行以下操作將把分區(qū) /dev/sdb2 格式化為FAT32文件系統(tǒng)(需要先通過fdisk工具把 /dev/sdb2的ID號(hào)設(shè)置為b)
創(chuàng)建swap分區(qū),使用的命令是 “mkswap” ,目標(biāo)分區(qū)應(yīng)先通過fdisk工具將分區(qū)的ID號(hào)設(shè)置為82。具體操作如下:
分區(qū)創(chuàng)建完成后,還需要有一個(gè)掛載的過程,才可像正常訪問目錄一樣訪問儲(chǔ)存設(shè)備中的資源
掛載 “.iso”文件時(shí),需要加 “ -o loop” 選項(xiàng)
卸載文件系統(tǒng)可以使用掛載目錄或?qū)?yīng)的設(shè)備文件名作為卸載參數(shù),但由于同一個(gè)設(shè)備可以掛載到多個(gè)目錄 下,所以一般建議通過掛載點(diǎn)的目錄位置來進(jìn)行卸載。具體如下:
系統(tǒng)中的/etc/fstab文件可以視為mount命令的配置文件,其中儲(chǔ)存了文件系統(tǒng)的靜態(tài)掛載數(shù)據(jù),Linux系統(tǒng)每次開機(jī)時(shí),會(huì)自動(dòng)讀取這個(gè)文件的內(nèi)容,自動(dòng)掛載所指定的文件系統(tǒng)。下面查看一下文件中的內(nèi)容:
df 命令——查看磁盤的使用情況
% 的 CPU 峰值。期間經(jīng)歷了各種卡頓、死機(jī),最終又把博客單獨(dú)遷移了回來。靜態(tài)文件走 CDN,文章都 Redis,以為萬(wàn)事大吉了就。
群壓
然并卵,有一天,群里有網(wǎng)友說要壓測(cè)我的論壇,我說那肯定一壓一個(gè)死,有本事來壓我的博客啊,順手便扔了博客網(wǎng)址,并@了全體人員。
然后,網(wǎng)友齊上陣,十八般武藝都拿出來了,有AB壓測(cè)的,有使用 jmeter 測(cè)試的,更有甚者自己使用 Python、Java 寫代碼替我壓測(cè)的,結(jié)果就是系統(tǒng) CPU 爆表,訪問博客陷入了漫長(zhǎng)的等待。
1.檢查電腦是否中病毒
使用360或者其他查殺軟件進(jìn)行檢查和處理
2.檢查電腦是否配置太低
提升硬件配置或者優(yōu)化軟件
3.檢查硬盤是否有壞道
用啟動(dòng)u進(jìn)pe然后用掃描工具掃描磁盤是否有壞道
有的話 ,在保修期內(nèi)就找廠家,過保了就送修或者換磁盤
分析
先說一下博客架構(gòu): Nginx + PHP-fpm + CND + Redis + RDS,靜態(tài)文件走CDN,命中率基本在百分之八九十左右,動(dòng)態(tài)請(qǐng)求走Nginx,然后交給 php-fpm 處理,博客文章進(jìn)行了緩存處理,查詢基本不會(huì)走數(shù)據(jù)庫(kù)。
這里總結(jié)下原因,在網(wǎng)友壓測(cè)的時(shí)候,登錄系統(tǒng),TOP 了一下,發(fā)現(xiàn) PHP-fpm 進(jìn)程 CPU 占比居高不下,畢竟1C1G的機(jī)器配置,相比于Nginx處理靜態(tài)頁(yè)面的能力,PHP-fpm 還是太弱雞了,無論怎么優(yōu)化,配置總會(huì)是瓶頸。
這里說明一下網(wǎng)友的壓測(cè),也就算是簡(jiǎn)單的流量***,其實(shí)就是模擬多個(gè)用戶不停的進(jìn)行訪問(訪問那些需要大量數(shù)據(jù)操作,就是需要大量CPU時(shí)間的頁(yè)面),從而把服務(wù)壓垮。
應(yīng)對(duì)
其實(shí)對(duì)于壓測(cè)這種場(chǎng)景,我們使用 OpenResty + Lua 限流就可以輕松解決。
編寫 imit_req.lua 腳本:
-- 平滑限制接口請(qǐng)求數(shù) local limit_req = require "resty.limit.req" -- 這里我們使用AB測(cè)試,-n訪問1000次, -c并發(fā)100個(gè) -- ab -n 1000 -c 100 http://121.142.155.213/ -- 限制 ip 每秒只能調(diào)用 200 次 接口 ,burst設(shè)置為 0 則平滑限流 local lim, err = limit_req.new("my_limit_req_store", 10, 0) if not lim then ngx.log(ngx.ERR, "failed to instantiate a resty.limit.req object: ", err) return ngx.exit(500) end -- IP維度的限流 local key = ngx.var.binary_remote_addr local delay, err = lim:incoming(key, true) if not delay then if err == "rejected" then return ngx.exit(503) end ngx.log(ngx.ERR, "failed to limit req: ", err) return ngx.exit(500) end if delay >= 0.001 then -- the 2nd return value holds the number of excess requests -- per second for the specified key. for example, number 31 -- means the current request rate is at 231 req/sec for the -- specified key. local excess = err -- the request exceeding the 200 req/sec but below 300 req/sec, -- so we intentionally delay it here a bit to conform to the -- 200 req/sec rate. ngx.sleep(delay) -- 延時(shí)處理 end
導(dǎo)入 nginx.conf 配置:
http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; lua_shared_dict my_limit_req_store 100m; lua_shared_dict my_limit_conn_store 100m; lua_shared_dict my_limit_count_store 100m; server{ listen 80; server_name blog.52itstyle.com; index index.php; root /mnt/domains/blog.52itstyle.com; location = /500.html { root /usr/local/openresty/nginx/html; } error_page 500 502 503 504 = /503/503.html; location ~ .php$ { # 導(dǎo)入 lua 限流 配置 access_by_lua_file /usr/local/openresty/nginx/lua/limit_req.lua; fastcgi_pass 127.0.0.1:9000; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; } location ~ /.ht { deny all; } }
劃重點(diǎn),腳本中:
# 每秒訪問超過2次就拒絕服務(wù),跳轉(zhuǎn)到503錯(cuò)誤頁(yè)面 limit_req.new("my_limit_req_store", 2, 0)
總結(jié)
我經(jīng)常聽賣鎖具的人說:“再好的鎖,也只防好人,不防壞人!”,同樣適用于網(wǎng)絡(luò),網(wǎng)友也只是娛樂一下而已,如果真有壞人想搞你,有無數(shù)種辦法把你搞死死。