嘿兄弟們,今天非得跟你們嘮嘮這個nginx的ip虛擬主機優(yōu)化,這玩意兒折騰得我夠嗆,但也真搞出點速效的門道。
事情得從上個禮拜說起。我那臺破服務器,突然慢得跟蝸牛爬似的,時不時還直接給我撂挑子罷工??蛻綦娫捯粋€接一個打進來投訴,說我網(wǎng)站掛了。登錄后臺一看,好家伙,流量也沒多幾個,這小霸王服務器就開始耍脾氣了?肯定哪里不對勁。
我第一個反應就是去翻nginx的訪問日志。打開那龐大的日志文件,一行一行地往下溜達,眼睛都快看花了。找著找著,發(fā)現(xiàn)有一撮IP地址,跟打了雞血一樣瘋狂刷請求,明顯就不像好人干的。再配合監(jiān)控工具一瞅,連接數(shù)跟坐火箭似的往上飆,我那點兒可憐的內(nèi)存和CPU,眨眼間就被榨干了。
老這么硬抗不行,非得動點真格的。我琢磨著,得利用nginx的ip虛擬主機這塊兒搞點優(yōu)化,主要目的就一個:趕緊把這些惹事的IP摁??!試了三個立竿見影的法子:
deny 192.168.1.100; deny 203.0.113.5;意思就是直接告訴nginx:“看見沒?這倆家伙再來敲門,甭管三七二十一,直接給他吃閉門羹(返回403 Forbidden)!” 這招特別適合對付那些已經(jīng)暴露的小霸王流氓。
我在配置里開搞:limit_req_zone $binary_remote_addr zone=mylimit:10m rate=5r/s; ... limit_req zone=mylimit burst=10 nodelay;
這塊兒可費了點勁兒琢磨。簡單說,就是給每個不同的IP地址($binary_remote_addr)劃個小本本(zone=mylimit:10m,10m夠記不少IP了),規(guī)定它們每秒最多只能敲我5次門(rate=5r/s)。但也不能卡太死,萬一人家正常活動有短暫高峰?所以給了點彈性空間(burst=10,允許突增10下),并且立馬處理掉別排隊(nodelay),超過的?對不起,慢走不送(返回503)。這招一出,那些蹭蹭蹭猛點的IP立馬老實。
keepalive_timeout 15s;(原來設的60s,太長!閑置連接趕緊斷,省資源)keepalive_requests 50;(一個連接最多服務50次請求,用完拜拜)client_header_timeout 5s;(收客戶端磨磨唧唧的頭信息?超過5秒不候)這些調(diào)整就好比給每個進門的客人定規(guī)矩:別墨跡,辦完事趕緊走,別占著茅坑不拉屎!服務器身上的大包袱一下子輕了不少。
改完配置,nginx -t 測試一下語法沒毛病,順手就來了個 nginx -s reload 平滑重啟。心想這波穩(wěn)了。結果過了半小時,監(jiān)控又告警了!我懵了,趕緊查。原來手快在調(diào)限流那個 max_connections 參數(shù)時,把全局并發(fā)連接數(shù)限得太狠,直接把正常用戶也給擋門外了!真是一腳踩進自己挖的坑。趕緊把數(shù)值往上提回合理范圍,再重啟一遍,心跳才慢慢恢復。
把這三大秘方祭出來之后,效果真心立竿見影:
現(xiàn)在摸著魚就把錢賺了,再也不用提心吊膽看監(jiān)控了,舒服!這三大招對付IP搗亂真心好使,你們要是也遇到服務器被壓得喘不過氣,不妨試試看。
*請認真填寫需求信息,我們會在24小時內(nèi)與您取得聯(lián)系。