nginx訪問次數
1. Nginx中怎麼限制某個IP同一時間段的訪問次數
#ip limit
limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_conn_zone $server_name zone=perserver:10m;
limit_conn perip 2;
limit_conn perserver 20;
limit_rate 100k;
$binary_remote_addr是限制同一客戶端ip地址;
$server_name是限制同一server最大並發數;
limit_conn為限制並發連接數;
limit_rate為限制下載速度;
2. linux的虛擬主機 4核的電腦 CPU和並發連接數都不限 一個php網站的同時在線人數峰值可以到多少
不是看硬體的一般linux上都是lamp apache+php+mysql
Apache2.0以上最大連接數為4000-6000
一般峰值超過4000個並發連接apache就差不多了,再上去性能就不行了。
Nginx號稱可以最大並發連接數超過10000個,實際達到8000左右。
不過這些都是在硬體高新能的情況下的。你的4核應該不是問題了。
一般提高並發訪問連接有如下方法:1。 使用反向代理
2。 建立lamp集群 + 反向代理 (大型網站多是如此)
3. 網站nginx配置限制單個IP訪問頻率,預防DDOS惡意攻擊
對於網站來說,尤其是流量較大出名的網站,經常遇到攻擊,如DDOS攻擊等,雖然有些第三方,如Cloudflare可以擋,但對於動態網站PHP來說,只能擋一部分。這時候需要對於單個IP惡意攻擊做出限流。nginx的兩個模塊可以限流。
nginx兩個限流模塊:
連接頻率限制,ngx_http_limit_conn_mole:官方文檔:https://nginx.org/en/docs/http/ngx_http_limit_conn_mole.html
請求頻率限制,ngx_http_limit_req_mole:官方文檔:https://nginx.org/en/docs/http/ngx_http_limit_req_mole.html
網上理論很多,根據名字可知:
當然還是看不懂的話,通俗點講(相對於時間比較):
比如秒殺,搶購,連接頻率限制和請求頻率限制應該配合使用 , 使用連接頻率限制同一IP同時只能有3個連接, 再使用請求頻率限制對於同一ip的請求,限制平均速率為5個請求/秒 , 這樣比單獨只使用一種限制要好很多。
比如只使用請求頻率限制 , 可以精確地限制同一ip1秒只能發起5次的http請求 , 假如同一ip1秒內發起了100000次請求 , 雖然限制了只有5次成功響應 , 但是其他的99995次的請求TCP握手建立http連接是不是會消耗伺服器資源? 所以還需要配合使用。
1、limit_req_zone,示例:
2、limit_conn_zone,示例:
3、搭配一起使用
1、ab命令
ab是apache自帶的壓力測試工具。一般不用額外安裝,ab非常實用,它不僅可以對apache伺服器進行網站訪問壓力測試,也可以對或其它類型的伺服器進行壓力測試。比如nginx、tomcat、IIS等。
測試命令
2、wrk命令
需自己安裝,地址:https://github.com/wg/wrk
安裝
測試命令:
還有其他壓測工具,自行研究
4. nginx怎麼限制客戶端訪問頻次與訪問次數
如何設置能限制某個IP某一時間段的訪問次數是一個讓人頭疼的問題,特別面對惡意的ddos攻擊的時候。其中CC攻擊(Challenge Collapsar)是DDOS(分布式拒絕服務)的一種,也是一種常見的網站攻擊方法,攻擊者通過代理伺服器或者肉雞向向受害主機不停地發大量數據包,造成對方伺服器資源耗盡,一直到宕機崩潰。
cc攻擊一般就是使用有限的ip數對伺服器頻繁發送數據來達到攻擊的目的,nginx可以通過HttpLimitReqMol和HttpLimitZoneMole配置來限制ip在同一時間段的訪問次數來防cc攻擊。
HttpLimitReqMol用來限制連單位時間內連接數的模塊,使用limit_req_zone和limit_req指令配合使用來達到限制。一旦並發連接超過指定數量,就會返回503錯誤。
HttpLimitConnMol用來限制單個ip的並發連接數,使用limit_zone和limit_conn指令
這兩個模塊的區別前一個是對一段時間內的連接數限制,後者是對同一時刻的連接數限制
文章目錄
1 HttpLimitReqMol 限制某一段時間內同一ip訪問數實例
2 HttpLimitZoneMole 限制並發連接數實例
3 nginx白名單設置
HttpLimitReqMol 限制某一段時間內同一ip訪問數實例
http{
...
#定義一個名為allips的limit_req_zone用來存儲session,大小是10M內存,
#以$binary_remote_addr 為key,限制平均每秒的請求為20個,
#1M能存儲16000個狀態,rete的值必須為整數,
#如果限制兩秒鍾一個請求,可以設置成30r/m
limit_req_zone $binary_remote_addr zone=allips:10m rate=20r/s;
...
server{
...
location {
...
#限制每ip每秒不超過20個請求,漏桶數burst為5
#brust的意思就是,如果第1秒、2,3,4秒請求為19個,
#第5秒的請求為25個是被允許的。
#但是如果你第1秒就25個請求,第2秒超過20的請求返回503錯誤。
#nodelay,如果不設置該選項,嚴格使用平均速率限制請求數,
#第1秒25個請求時,5個請求放到第2秒執行,
#設置nodelay,25個請求將在第1秒執行。
limit_req zone=allips burst=5 nodelay;
...
}
...
}
...
}
5. nginx 限制ip請求某個url的頻率
問題描述:
今天在統計nginx日誌中,url訪問頻率的時候,發現一個介面訪問次數遠遠大於其他的url。於是用tail -f查看實時日誌,發現有個ip以每秒3-4次請求這個url。詢問開發後,得知是第三方調用的,頻率有點高,需要限制一下。
解決:
在nginx的http模塊中添加以下配置
rate=1r/s 的意思是每個地址每秒只能請求一次
在server模塊中添加一下配置
burst是指一共有5個令牌,發完後,只能根據rate的設定每秒新增一個
reload nginx的配置之後,再次查看日誌。可以看到訪問頻率明顯降下來了
6. Nginx相關知識點
Nginx是lgor Sysoev為俄羅斯訪問量第二的rambler.ru站點設計開發的。從2004年發布至今,憑借開源的力量,已經接近成熟與完善。
Nginx功能豐富,可作為HTTP伺服器,也可作為反向代理伺服器,郵件伺服器。支持FastCGI、SSL、Virtual Host、URL Rewrite、Gzip等功能。並且支持很多第三方的模塊擴展。
Nginx的穩定性、功能集、示例配置文件和低系統資源的消耗讓他後來居上,在全球活躍的網站中有12.18%的使用比率,大約為2220萬個網站。
自行安裝
正向代理: 代理伺服器站在客戶端那邊就是正向代理;
反向代理: 代理伺服器站在原始伺服器那邊就是反向代理;
詳解參考點擊 Nginx正向代理與反向代理
Nginx在做反向代理時,提供性能穩定,並且能夠提供配置靈活的轉發功能。
Nginx可以根據不同的正則匹配,採取不同的轉發策略,比如圖片文件結尾的走文件伺服器,動態頁面走web伺服器,只要你正則寫的沒問題,又有相對應的伺服器解決方案,你就可以隨心所欲的玩。
並且Nginx對返回結果進行錯誤頁跳轉,異常判斷等。如果被分發的伺服器存在異常,他可以將請求重新轉發給另外一台伺服器,然後自動去除異常伺服器。
如果你的nginx伺服器給2台web伺服器做代理,負載均衡演算法採用輪詢,那麼當你的一台機器web程序iis關閉,也就是說web不能訪問,那麼nginx伺服器分發請求還是會給這台不能訪問的web伺服器,如果這里的響應連接時間過長,就會導致客戶端的頁面一直在等待響應,對用戶來說體驗就打打折扣,這里我們怎麼避免這樣的情況發生呢。這里我配張圖來說明下問題。
如果負載均衡中其中web2發生這樣的情況,nginx首先會去web1請求,但是nginx在配置不當的情況下會繼續分發請求道web2,然後等待web2響應,直到我們的響應時間超時,才會把請求重新分發給web1,這里的響應時間如果過長,用戶等待的時間就會越長。
下面的配置是解決方案之一:
如果使用upstream指令配置了一組伺服器作為被代理伺服器,伺服器中的訪問演算法遵循配置的負載均衡規則,同時可以使用該指令配置在發生哪些異常情況時,將請求順次交由下一組伺服器處理。
狀態值可以是:error|timeout|invalid_header|http_500|http_502|http_503|http_504|http_404|off
Nginx提供的負載均衡策略有2種:內置策略和擴展策略。
內置策略: 1.輪詢;2.加權輪詢;3.Ip hash;
擴展策略: 就天馬行空,只有你想不到的沒有他做不到的啦,你可以參照所有的負載均衡演算法,給他一一找出來做下實現。
Ip hash演算法,對客戶端請求的ip進行hash操作,然後根據hash結果將同一個客戶端ip的請求分發給同一台伺服器進行處理,可以解決session不共享的問題。
eg:
開啟簡單的緩存配置,只需要兩個指令:proxy_cache_path和proxy_cache。
proxy_cache_path: 配置緩存的存放地址和其他的一些常用配置;
proxy_cache:指令是為了啟動緩存;
相關配置說明:
該指令用於定義滿足條件的響應不會被保存到緩存中。在條件字元串中至少有一個條件不為空或者0,符合這樣條件的響應才不會被緩存。
舉例如下
其中,cookie_nocache、arg_nocache...皆為變數,可以根據你訪問的匹配策略來設置,其值只有2類,0和非0;
訪問匹配策略例如:
如果在此鏈式配置中,只要有一個值不為0,則不會cache;例如:
則不會被cache.
註:一般會配合proxy_cache_bypass共同使用;
該指令用於定義哪些情況不從cache讀取,直接從backend獲取資源;配置方式同proxy_no_cache。
給緩存數據定義一個鍵,例如
該指令用於設置緩存哪些HTTP方法,默認緩存HTTP GET/HEAD方法,不緩存HTTP POST 方法.。
設置不同響應碼的緩存時間,當不指定響應碼的時候,例如
只對響應碼為200,301,302的訪問請求資源設置緩存時間,此外可以個性化定製,例如:
此外,還可以在相應header里設置優先順序更高的緩存有效時間:
不緩存包含在field的響應header,可以設置的值有:「X-Accel-Redirect」, 「X-Accel-Expires」, 「X-Accel-Limit-Rate」,「X-Accel-Buffering」, 「X-Accel-Charset」, 「Expires」, 「Cache-Control」, 「Set-Cookie」 (0.8.44), and 「Vary」。
如果上述的header field沒有設置為忽略,則header filed中有「X-Accel-Expires」, 「Expires」, 「Cache-Control」, 「Set-Cookie」, and 「Vary」的話,響應會被緩存。
該指令用於設置緩存的最小使用次數,默認值為1
源站有問題時,nginx可以通過proxy_cache_use_stale指令開啟容錯能力,即使用緩存內容來響應客戶端的請求。舉例如下:
如上配置表示,當作為cache的NGINX收到源站返回error、timeout或者其他指定的5XX錯誤,並且在其緩存中有請求文件的陳舊版本,則會將這些陳舊版本的文件而不是錯誤信息發送給客戶端。
使用NGINX,不需要建立一個RAID(磁碟陣列)。如果有多個硬碟,NGINX可以用來在多個硬碟之間分割緩存。舉例如下:
在這份配置中,使用了3個獨立的緩存,每個緩存專用一塊硬碟,另外,3個獨立的線程池也各自專用一塊硬碟。
緩存之間(其結果就是磁碟之間)的負載均衡使用split_clients模塊,split_clients非常適用於這個任務。
在 proxy_cache_path指令中設置 use_temp_path=off ,表示NGINX會將臨時文件保存在緩存數據的同一目錄中。這是為了避免在更新緩存時,磁碟之間互相復制響應數據。
通過訪問日誌,你可以得到用戶地域來源、跳轉來源、使用終端、某個URL訪問量等相關信息;
通過錯誤日誌,你可以得到系統某個服務或server的性能瓶頸等。
因此,將日誌好好利用,你可以得到很多有價值的信息。
打開nginx.conf配置文件:vim /usr/local/nginx/conf/nginx.conf
日誌部分內容:
#access_log logs/access.log main;
日誌生成的到Nginx根目錄logs/access.log文件,默認使用「main」日誌格式,也可以自定義格式。
默認「main」日誌格式:
參數明細表:
查看日誌命令tail -f /usr/local/nginx/logs/access.log
打開nginx.conf配置文件去掉#注釋見下圖:
自定義某一個server配置的日誌,使用「main」日誌格式。
日誌生成的到Nginx根目錄logs/access.log文件,默認使用「main」日誌格式,也可以自定義格式。
重新讀取載入Nginx配置文件:
執行命令:nginx-s reload
網上一位老師寫的log文件分解的腳本
此腳本執行時間根據自己公司情況來定,可以設置默認一天執行一次;
創建crontab設置作業
設置日誌文件存放目錄crontab -e
*/1 * * * * sh /usr/local/software/nginx/nginx_log.sh
此設置的為一分鍾,如果設置一天自行修改;
默認的 nginx 配置文件 nginx.conf 內容如下
示例
幾個常見配置項:
注意:
驚群現象:一個網路連接到來,多個睡眠的進程被同事叫醒,但只有一個進程能獲得鏈接,這樣會影響系統性能
每個指令必須有分號結束。
進入安裝目錄下的sbin
7. Nginx文件描述符緩存--open_file_cache
標簽(空格分隔): nginx
NGINX雖然已經對靜態內容做過優化。但在高流量網站的情況下,仍然可以使用open_file_cache進一步提高性能。 NGINX緩存將最近使用的文件描述符和相關元數據(如修改時間,大小等)存儲在緩存中。緩存不會存儲所請求文件的內容。
啟用此指令將存儲以下信息的緩存:
如下例子:
在上述配置中,為1,000個元素定義了一個緩存。 inactive參數配置到期時間為20秒。 沒有必要為該指令設置非活動時間段,默認情況下,非活動時間段為60秒。
NGINX還定義了一些相關的指令,可用於在錯誤和有效性檢查期間配置open_file_cache的行為。
NGINX的open_file_cache保存信息的快照。 由於信息在源處更改,快照可能在一段時間後無效。 open_file_ cache_valid指令定義時間段(以秒為單位),之後將重新驗證open_file_cache中的元素。默認情況下,60秒後重新檢查元素。 如下例子:
NGINX將在非活動時間段之後從高速緩存中清除元素。 此指令可用於配置最小訪問次數以將元素標記為活動使用。 默認情況下,最小訪問次數設置為1次或更多次。如下例子
如前所述,NGINX可以緩存在文件訪問期間發生的錯誤。但是這需要通過設置open_file_cache_errors指令來啟用。 如果啟用錯誤緩存,則在訪問資源(不查找資源)時,NGINX會報告相同的錯誤。默認情況下,錯誤緩存設置為關閉。