apachelog報錯:[mpm_worker:error] [pid 2486:tid 140526322251584] AH00287: server is within MinSpareThreads of MaxRequestWorkers, consider raising the MaxRequestWorkers settinghtml
解答:檢查了一下,這是因爲併發連接數太多致使的!web
解決:apache
ps -ef | grep httpd | grep -v grep | wc -l --查看進程量瀏覽器
netstat -ant | grep -E ":80|:443" | wc -l ----查看鏈接數tomcat
netstat -ant | grep ESTABLISHED | grep -E ":80|:443" ---查看創建鏈接數服務器
# vi /usr/local/apache2/conf/extra/httpd-mpm.confsession
<IfModule mpm_worker_module>多線程
StartServers 3併發
MinSpareThreads 75ide
MaxSpareThreads 250
ThreadsPerChild 25
ServerLimit 2000
MaxRequestWorkers 1000
MaxConnectionsPerChild 0
</IfModule>
對於IP限制,採用了 mod_limitipconn 這個模塊。
這個模塊的優勢是配置簡單,缺點是不可以針對單獨的文件夾或者文件進行設置,並且不支持虛擬主機。
在 apache 中安裝了這個模塊後,在配置文件中添加以下幾段就能夠生效了:
ExtendedStatus On
< IfModule mod_limitipconn.c >
< Location / > # 全部虛擬主機的/目錄
MaxConnPerIP 3 # 每IP只容許3個併發鏈接
NoIPLimit image/* # 對圖片不作IP限制
< /Location >
< Location /mp3 > # 全部主機的/mp3目錄
MaxConnPerIP 1 # 每IP只容許一個鏈接請求
OnlyIPLimit audio/mpeg video # 該限制只對視頻和音頻格式的文件
< /Location >
< /IfModule >
錯誤提示「No space left on device: Cannot create SSLMutex」,這一句的含義是沒有剩餘資源建立 SSLMutex 共享變量
聯想到了Linux沒法建立句柄,並會沒法提供服務,因而查看共享變量資源的佔用狀況
ipcs : ipcs provides information on the ipc facilities for which the calling process has read access.
# ipcs -s
------ Semaphore Arrays --------
key semid owner perms nsems
0x00000000 0 root 600 1
0x00000000 32769 root 600 1
0x00000000 163842 apache 600 1
0x00000000 196611 apache 600 1
0x00000000 229380 apache 600 1
0x00000000 262149 apache 600 1
0x00000000 294918 apache 600 1
發現共享變量有數百個被apache進程佔用,沒法釋放,資源耗盡了。
因而,須要刪除佔盡的共享變量信號資源,刪除命令以下:
# ipcs -s | perl -ane '/^0x00000000/ && `ipcrm -s $F[1]`'
查看 ipcs 的限制參數:ipcs -l
# ipcs -l
------ Shared Memory Limits --------
max number of segments = 4096
max seg size (kbytes) = 67108864
max total shared memory (kbytes) = 17179869184
min seg size (bytes) = 1
------ Semaphore Limits --------
max number of arrays = 128
max semaphores per array = 250
max semaphores system wide = 32000
max ops per semop call = 32
semaphore max value = 32767
------ Messages: Limits --------
max queues system wide = 3751
max size of message (bytes) = 65536
default max size of queue (bytes) = 65536
顯示發現,Semaphore Limits 最大爲128,超過了這個數量,httpd 服務將會沒法再啓動,也就致使了上面的網站打不開。
不少tomcat進程退出(或者進程假死),都是因爲頻繁的拋出OutOfMemeoryError致使的。
爲了讓tomcat退出前或者發生OutOfMemeoryError時自動dump堆棧信息,方便過後排查問題,咱們能夠作以下操做:
一、 在tomcat啓動參數中加入兩個參數 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/export /oom.hprof
二、 重啓tomcat
參數說明
(1)-XX:+HeapDumpOnOutOfMemoryError 表示當JVM發生OOM時,自動生成DUMP文件。
(2)-XX:HeapDumpPath=存儲文件/目錄 表示生成DUMP文件的路徑
設置Session超時時間方式:
方式一:
在web.xml中設置session-config以下:
<session-config>
<session-timeout>2</session-timeout>
</session-config>
即客戶端連續兩次與服務器交互間隔時間最長爲2分鐘,2分鐘後session.getAttribute()獲取的值爲空
方式二:
在Tomcat的/conf/web.xml中session-config,默認值爲:30分鐘
<session-config>
<session-timeout>30</session-timeout>
</session-config>
方式三:
在Servlet中設置
HttpSession session = request.getSession();
session.setMaxInactiveInterval(60);//單位爲秒
說明:
1.優先級:Servlet中API設置 > 程序/web.xml設置 > Tomcat/conf/web.xml設置
2.若訪問服務器session超時(本次訪問與上次訪問時間間隔大於session最大的不活動的間隔時間)了,即上次會話結束,但服務器與客戶端會產生一個新的會話,以前的session裏的屬性值所有丟失,產生新的sesssionId
3.客戶端與服務器一次有效會話(session沒有超時),每次訪問sessionId相同,若代碼中設置了session.setMaxInactiveInterval()值,那麼這個session的最大不活動間隔時間將被修改,並被應用爲新值。
4.Session的銷燬(表明會話週期的結束):在某個請求週期內調用了Session.invalidate()方法,此請求週期結束後,session被銷燬;或者是session超時後自動銷燬;或者客戶端關掉瀏覽器
解決辦法是在apache http服務器虛擬主機配置中向代理程序指令添加「重試=0」參數,這樣它就不會等待默認的60秒才能重試。
ProxyPass / http://backendserver:8080/ retry=0