1)統(tǒng)計80端口連接數(shù)
元謀網(wǎng)站制作公司哪家好,找成都創(chuàng)新互聯(lián)!從網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、響應(yīng)式網(wǎng)站等網(wǎng)站項目制作,到程序開發(fā),運(yùn)營維護(hù)。成都創(chuàng)新互聯(lián)2013年至今到現(xiàn)在10年的時間,我們擁有了豐富的建站經(jīng)驗和運(yùn)維經(jīng)驗,來保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選成都創(chuàng)新互聯(lián)。
2)統(tǒng)計httpd協(xié)議連接數(shù)
3)、統(tǒng)計已連接上的,狀態(tài)為“established
4)、查出哪個IP地址連接最多,將其封了.
1、查看apache當(dāng)前并發(fā)訪問數(shù):
對比httpd.conf中MaxClients的數(shù)字差距多少。
2、查看有多少個進(jìn)程數(shù):
3、可以使用如下參數(shù)查看數(shù)據(jù)
統(tǒng)計httpd進(jìn)程數(shù),連個請求會啟動一個進(jìn)程,使用于Apache服務(wù)器。
表示Apache能夠處理1388個并發(fā)請求,這個值A(chǔ)pache可根據(jù)負(fù)載情況自動調(diào)整。
4341
netstat -an會打印系統(tǒng)當(dāng)前網(wǎng)絡(luò)鏈接狀態(tài),而grep -i "80"是用來提取與80端口有關(guān)的連接的,wc -l進(jìn)行連接數(shù)統(tǒng)計。
最終返回的數(shù)字就是當(dāng)前所有80端口的請求總數(shù)。
netstat -an會打印系統(tǒng)當(dāng)前網(wǎng)絡(luò)鏈接狀態(tài),而grep ESTABLISHED 提取出已建立連接的信息。 然后wc -l統(tǒng)計。
最終返回的數(shù)字就是當(dāng)前所有80端口的已建立連接的總數(shù)。
查看Apache的并發(fā)請求數(shù)及其TCP連接狀態(tài):
TIME_WAIT 8947 等待足夠的時間以確保遠(yuǎn)程TCP接收到連接中斷請求的確認(rèn)
FIN_WAIT1 15 等待遠(yuǎn)程TCP連接中斷請求,或先前的連接中斷請求的確認(rèn)
FIN_WAIT2 1 從遠(yuǎn)程TCP等待連接中斷請求
ESTABLISHED 55 代表一個打開的連接
SYN_RECV 21 再收到和發(fā)送一個連接請求后等待對方對連接請求的確認(rèn)
CLOSING 2 沒有任何連接狀態(tài)
LAST_ACK 4 等待原來的發(fā)向遠(yuǎn)程TCP的連接中斷請求的確認(rèn)
TCP連接狀態(tài)詳解
LISTEN: 偵聽來自遠(yuǎn)方的TCP端口的連接請求
SYN-SENT: 再發(fā)送連接請求后等待匹配的連接請求
SYN-RECEIVED:再收到和發(fā)送一個連接請求后等待對方對連接請求的確認(rèn)
ESTABLISHED: 代表一個打開的連接
FIN-WAIT-1: 等待遠(yuǎn)程TCP連接中斷請求,或先前的連接中斷請求的確認(rèn)
FIN-WAIT-2: 從遠(yuǎn)程TCP等待連接中斷請求
CLOSE-WAIT: 等待從本地用戶發(fā)來的連接中斷請求
CLOSING: 等待遠(yuǎn)程TCP對連接中斷的確認(rèn)
LAST-ACK: 等待原來的發(fā)向遠(yuǎn)程TCP的連接中斷請求的確認(rèn)
TIME-WAIT: 等待足夠的時間以確保遠(yuǎn)程TCP接收到連接中斷請求的確認(rèn)
CLOSED: 沒有任何連接狀態(tài)
LAST_ACK 5
SYN_RECV 30
ESTABLISHED 1597
FIN_WAIT1 51
FIN_WAIT2 504
TIME_WAIT 1057
其中的
SYN_RECV表示正在等待處理的請求數(shù);
ESTABLISHED表示正常數(shù)據(jù)傳輸狀態(tài);
TIME_WAIT表示處理完畢,等待超時結(jié)束的請求數(shù)。
查看Apache并發(fā)請求數(shù)及其TCP連接狀態(tài)
查看httpd進(jìn)程數(shù)(即prefork模式下Apache能夠處理的并發(fā)請求數(shù)):
返回結(jié)果示例:
1388
表示Apache能夠處理1388個并發(fā)請求,這個值A(chǔ)pache可根據(jù)負(fù)載情況自動調(diào)整,我這組服務(wù)器中每臺的峰值曾達(dá)到過2002。
查看Apache的并發(fā)請求數(shù)及其TCP連接狀態(tài):
返回結(jié)果示例:
LAST_ACK 5
SYN_RECV 30
ESTABLISHED 1597
FIN_WAIT1 51
FIN_WAIT2 504
TIME_WAIT 1057
其中的SYN_RECV表示正在等待處理的請求數(shù);ESTABLISHED表示正常數(shù)據(jù)傳輸狀態(tài);TIME_WAIT表示處理完畢,等待超時結(jié)束的請求數(shù)。
狀態(tài):描述
CLOSED:無連接是活動 的或正在進(jìn)行
LISTEN:服務(wù)器在等待進(jìn)入呼叫
SYN_RECV:一個連接請求已經(jīng)到達(dá),等待確認(rèn)
SYN_SENT:應(yīng)用已經(jīng)開始,打開一個連接
ESTABLISHED:正常數(shù)據(jù)傳輸狀態(tài)
FIN_WAIT1:應(yīng)用說它已經(jīng)完成
FIN_WAIT2:另一邊已同意釋放
ITMED_WAIT:等待所有分組死掉
CLOSING:兩邊同時嘗試關(guān)閉
TIME_WAIT:另一邊已初始化一個釋放
LAST_ACK:等待所有分組死掉
vim /etc/sysctl.conf
編輯文件,加入以下內(nèi)容:
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 30
然后執(zhí)行 /sbin/sysctl -p 讓參數(shù)生效。
net.ipv4.tcp_syncookies = 1 表示開啟SYN cookies。當(dāng)出現(xiàn)SYN等待隊列溢出時,啟用cookies來處理,可防范少量SYN攻擊,默認(rèn)為0,表示關(guān)閉;
net.ipv4.tcp_tw_reuse = 1 表示開啟重用。允許將TIME-WAIT sockets重新用于新的TCP連接,默認(rèn)為0,表示關(guān)閉;
net.ipv4.tcp_tw_recycle = 1 表示開啟TCP連接中TIME-WAIT sockets的快速回收,默認(rèn)為0,表示關(guān)閉。
net.ipv4.tcp_fin_timeout 修改系統(tǒng)默認(rèn)的 TIMEOUT 時間
客戶端與服務(wù)器端建立TCP/IP連接后關(guān)閉SOCKET后,服務(wù)器端連接的端口
狀態(tài)為TIME_WAIT
是不是所有執(zhí)行主動關(guān)閉的socket都會進(jìn)入TIME_WAIT狀態(tài)呢?
有沒有什么情況使主動關(guān)閉的socket直接進(jìn)入CLOSED狀態(tài)呢?
主動關(guān)閉的一方在發(fā)送最后一個 ack 后
就會進(jìn)入 TIME_WAIT 狀態(tài) 停留2MSL(max segment lifetime)時間
這個是TCP/IP必不可少的,也就是“解決”不了的。
也就是TCP/IP設(shè)計者本來是這么設(shè)計的
主要有兩個原因
1。防止上一次連接中的包,迷路后重新出現(xiàn),影響新連接
(經(jīng)過2MSL,上一次連接中所有的重復(fù)包都會消失)
2??煽康年P(guān)閉TCP連接
在主動關(guān)閉方發(fā)送的最后一個 ack(fin) ,有可能丟失,這時被動方會重新發(fā)
fin, 如果這時主動方處于 CLOSED 狀態(tài) ,就會響應(yīng) rst 而不是 ack。所以
主動方要處于 TIME_WAIT 狀態(tài),而不能是 CLOSED 。
TIME_WAIT 并不會占用很大資源的,除非受到攻擊。
還有,如果一方 send 或 recv 超時,就會直接進(jìn)入 CLOSED 狀態(tài)
如何合理設(shè)置apache httpd的最大連接數(shù)?
手頭有一個網(wǎng)站在線人數(shù)增多,訪問時很慢。初步認(rèn)為是服務(wù)器資源不足了,但經(jīng)反復(fù)測試,一旦連接上,不斷點(diǎn)擊同一個頁面上不同的鏈接,都能迅速打開,這種現(xiàn)象就是說明apache最大連接數(shù)已經(jīng)滿了,新的訪客只能排隊等待有空閑的鏈接,而如果一旦連接上,在keeyalive 的存活時間內(nèi)(KeepAliveTimeout,默認(rèn)5秒)都不用重新打開連接,因此解決的方法就是加大apache的最大連接數(shù)。
1.在哪里設(shè)置?
apache 2.24,使用默認(rèn)配置(FreeBSD 默認(rèn)不加載自定義MPM配置),默認(rèn)最大連接數(shù)是250
在/usr/local/etc/apache22/httpd.conf中加載MPM配置(去掉前面的注釋):
Include etc/apache22/extra/httpd-mpm.conf
可見的MPM配置在/usr/local/etc/apache22/extra/httpd-mpm.conf,但里面根據(jù)httpd的工作模式分了很多塊,哪一部才是當(dāng)前httpd的工作模式呢?可通過執(zhí)行 apachectl -l 來查看:
Compiled in modules:
core.c
prefork.c
http_core.c
mod_so.c
看到prefork 字眼,因此可見當(dāng)前httpd應(yīng)該是工作在prefork模式,prefork模式的默認(rèn)配置是:
IfModule mpm_prefork_module
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxClients 150
MaxRequestsPerChild 0
/IfModule
2.要加到多少?
連接數(shù)理論上當(dāng)然是支持越大越好,但要在服務(wù)器的能力范圍內(nèi),這跟服務(wù)器的CPU、內(nèi)存、帶寬等都有關(guān)系。
查看當(dāng)前的連接數(shù)可以用:
ps aux | grep httpd | wc -l
或:
pgrep httpd|wc -l
計算httpd占用內(nèi)存的平均數(shù):
ps aux|grep -v grep|awk '/httpd/{sum+=$6;n++};END{print sum/n}'
由于基本都是靜態(tài)頁面,CPU消耗很低,每進(jìn)程占用內(nèi)存也不算多,大約200K。
服務(wù)器內(nèi)存有2G,除去常規(guī)啟動的服務(wù)大約需要500M(保守估計),還剩1.5G可用,那么理論上可以支持1.5 1024 1024*1024/200000 = 8053.06368
約8K個進(jìn)程,支持2W人同時訪問應(yīng)該是沒有問題的(能保證其中8K的人訪問很快,其他的可能需要等待1、2秒才能連上,而一旦連上就會很流暢)
控制最大連接數(shù)的MaxClients ,因此可以嘗試配置為:
IfModule mpm_prefork_module
StartServers 5
MinSpareServers 5
MaxSpareServers 10
ServerLimit 5500
MaxClients 5000
MaxRequestsPerChild 100
/IfModule
注意,MaxClients默認(rèn)最大為250,若要超過這個值就要顯式設(shè)置ServerLimit,且ServerLimit要放在MaxClients之前,值要不小于MaxClients,不然重啟httpd時會有提示。
重啟httpd后,通過反復(fù)執(zhí)行pgrep httpd|wc -l 來觀察連接數(shù),可以看到連接數(shù)在達(dá)到MaxClients的設(shè)值后不再增加,但此時訪問網(wǎng)站也很流暢,那就不用貪心再設(shè)置更高的值了,不然以后如果網(wǎng)站訪問突增不小心就會耗光服務(wù)器內(nèi)存,可根據(jù)以后訪問壓力趨勢及內(nèi)存的占用變化再逐漸調(diào)整,直到找到一個最優(yōu)的設(shè)置值。
(MaxRequestsPerChild不能設(shè)置為0,可能會因內(nèi)存泄露導(dǎo)致服務(wù)器崩潰)
更佳最大值計算的公式:
apache_max_process_with_good_perfermance (total_hardware_memory / apache_memory_per_process ) * 2
apache_max_process = apache_max_process_with_good_perfermance * 1.5
附:
實時檢測HTTPD連接數(shù):
watch -n 1 -d "pgrep httpd|wc -l"
1、查看Web服務(wù)器(Nginx Apache)的并發(fā)請求數(shù)及其TCP連接狀態(tài):
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}
netstat -n|grep ^tcp|awk '{print $NF}'|sort -nr|uniq -c
或者:
netstat -n | awk '/^tcp/ {++state[$NF]} END {for(key in state) print key,"t",state[key]}
返回結(jié)果一般如下:
LAST_ACK 5 (正在等待處理的請求數(shù))
SYN_RECV 30
ESTABLISHED 1597 (正常數(shù)據(jù)傳輸狀態(tài))
FIN_WAIT1 51
FIN_WAIT2 504
TIME_WAIT 1057 (處理完畢,等待超時結(jié)束的請求數(shù))
其他參數(shù)說明:
CLOSED:無連接是活動的或正在進(jìn)行
LISTEN:服務(wù)器在等待進(jìn)入呼叫
SYN_RECV:一個連接請求已經(jīng)到達(dá),等待確認(rèn)
SYN_SENT:應(yīng)用已經(jīng)開始,打開一個連接
ESTABLISHED:正常數(shù)據(jù)傳輸狀態(tài)
FIN_WAIT1:應(yīng)用說它已經(jīng)完成
FIN_WAIT2:另一邊已同意釋放
ITMED_WAIT:等待所有分組死掉
CLOSING:兩邊同時嘗試關(guān)閉
TIME_WAIT:另一邊已初始化一個釋放
LAST_ACK:等待所有分組死掉
2、查看Nginx運(yùn)行進(jìn)程數(shù)
ps -ef | grep nginx | wc -l
返回的數(shù)字就是nginx的運(yùn)行進(jìn)程數(shù),如果是apache則執(zhí)行
ps -ef | grep httpd | wc -l
3、查看Web服務(wù)器進(jìn)程連接數(shù):
netstat -antp | grep 80 | grep ESTABLISHED -c
并發(fā)socket連接數(shù)的多少決定于系統(tǒng)資源的多少,沒有一個常值的.在實際開發(fā)或者linux系統(tǒng)管理中也會根據(jù)需要進(jìn)行相應(yīng)的設(shè)置.
1.一般來說每一個網(wǎng)絡(luò)連接,都會建立相應(yīng)的socket句柄,同時每個連接也會有標(biāo)準(zhǔn)輸入輸出等基本的文件文件句柄,而且每一個socket連接都是進(jìn)行文件操作的,因此連接數(shù)決定于系統(tǒng)資源.
2.Linux上一般可以通過ulimit來進(jìn)行相應(yīng)的資源限制,默認(rèn)能打開的文件描述符自己可以查看.如下圖所示:
3.ulimit的命令格式:ulimit [-acdfHlmnpsStvw] [size]
參數(shù)說明:
-H 設(shè)置硬資源限制.
-S 設(shè)置軟資源限制.
-a 顯示當(dāng)前所有的資源限制.
-c size:設(shè)置core文件的最大值.單位:blocks
-d size:設(shè)置數(shù)據(jù)段的最大值.單位:kbytes
-f size:設(shè)置創(chuàng)建文件的最大值.單位:blocks
-l size:設(shè)置在內(nèi)存中鎖定進(jìn)程的最大值.單位:kbytes
-m size:設(shè)置可以使用的常駐內(nèi)存的最大值.單位:kbytes
-n size:設(shè)置內(nèi)核可以同時打開的文件描述符的最大值.單位:n
-p size:設(shè)置管道緩沖區(qū)的最大值.單位:kbytes
-s size:設(shè)置堆棧的最大值.單位:kbytes
-t size:設(shè)置CPU使用時間的最大上限.單位:seconds
-v size:設(shè)置虛擬內(nèi)存的最大值.單位:kbytes
-u 程序數(shù)目 用戶最多可開啟的程序數(shù)目
很多時候我們會遇到服務(wù)器遭受 cc 或 syn 等攻擊,如果發(fā)現(xiàn)自己的網(wǎng)站訪問異常緩慢且流量異常??梢允褂孟到y(tǒng)內(nèi)置 netstat 命令 簡單判斷一下服務(wù)器是否被攻擊。常用的 netstat 命令
該命令將顯示所有活動的網(wǎng)絡(luò)連接。
查看同時連接到哪個服務(wù)器 IP 比較多,cc 攻擊用。使用雙網(wǎng)卡或多網(wǎng)卡可用。
查看哪些 IP 連接到服務(wù)器連接多,可以查看連接異常 IP。
顯示所有 80 端口的網(wǎng)絡(luò)連接并排序。這里的 80 端口是 http 端口,所以可以用來監(jiān)控 web 服務(wù)。如果看到同一個 IP 有大量連接的話就可以判定單點(diǎn)流量攻擊了。
這個命令可以查找出當(dāng)前服務(wù)器有多少個活動的 SYNC_REC 連接。正常來說這個值很小,最好小于 5。 當(dāng)有 Dos 攻擊或的時候,這個值相當(dāng)?shù)母?。但是有些并發(fā)很高的服務(wù)器,這個值確實是很高,因此很高并不能說明一定被攻擊。
列出所有連接過的 IP 地址。
列出所有發(fā)送 SYN_REC 連接節(jié)點(diǎn)的 IP 地址。
使用 netstat 命令計算每個主機(jī)連接到本機(jī)的連接數(shù)。
列出所有連接到本機(jī)的 UDP 或者 TCP 連接的 IP 數(shù)量。
檢查 ESTABLISHED 連接并且列出每個 IP 地址的連接數(shù)量。
列出所有連接到本機(jī) 80 端口的 IP 地址和其連接數(shù)。80 端口一般是用來處理 HTTP 網(wǎng)頁請求。
顯示連接 80 端口前 10 的 ip,并顯示每個 IP 的連接數(shù)。這里的 80 端口是 http 端口,所以可以用來監(jiān)控 web 服務(wù)。如果看到同一個 IP 有大量連接的話就可以判定單點(diǎn)流量攻擊了。