博文大綱:php
- 1、apache服務器的安裝及功能介紹;
- 2、Apache服務的三種工做模式詳解;
- 3、修改apache的工做模式;
- 4、apache工做模式的優化與修改;
- 5、進程與線程的區別。
前言html
咱們都知道Linux上常見的web服務器有:apache、nginx、tomcat!java
其區別以下:nginx
- apache:模塊化服務器,支持模塊較多、採用servlet處理模型,同步阻塞模型,工做模式多變,對於高併發的場景處理速度會比較慢,運行穩定。
- nginx:輕量級web服務器,自身支持模塊較少,須要藉助第三方模塊支持,採用epoll處理模型,異步非阻塞型,適合高併發場景,配置簡單。
- tomcat:apache軟件基金會下開源的子項目,也稱爲容器,主要處理java語言編寫的頁面,也能夠處理html頁面,併發鏈接小。
那麼,這篇博文是來圍繞着apache服務器來進行的。web
apache服務2.4版本功能介紹:shell
- MPM支持在運行時裝載,支持envet工做模式;
- 支持異步讀寫;
- 每一個模塊能夠指定輸出的日誌級別 ;
- 加強版的表達式分析器,經過正則匹配表達式,作動靜分離 .html .php;
- 請求配置:<if> <Elseif>;
- 毫秒級別的keep alive timeout;
- 支持FQDN的虛擬主機 FQDN:全球限定域名,能夠經過host主機名來定義虛擬主機;
- 支持自定義變量;
相關概念,有所瞭解便可,下面開始安裝。apache
安裝前準備:vim
- 下載我提供的依賴包,並上傳至web服務器。
- web服務器爲centos 7.X版本
[root@apache ~]# rz #xshell中,使用rz命令將下載的tar包上傳至web服務器 #如下是將全部源碼包解壓縮 [root@apache ~]# tar zxf openssl-1.0.1u.tar.gz -C /usr/src [root@apache ~]# tar zxf pcre-8.39.tar.gz -C /usr/src [root@apache ~]# tar zxf zlib-1.2.8.tar.gz -C /usr/src [root@apache ~]# tar zxf httpd-2.4.23.tar.gz -C /usr/src [root@apache ~]# tar zxf apr-1.5.2.tar.gz -C /usr/src [root@apache ~]# tar zxf apr-util-1.5.4.tar.gz -C /usr/src #如下開始安裝apache所需依賴包 [root@apache ~]# cd /usr/src/apr-1.5.2/ [root@apache apr-1.5.2]# ./configure --prefix=/usr/local/apr && make && make install [root@apache apr-1.5.2]# cd ../apr-util-1.5.4/ [root@apache apr-util-1.5.4]# ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr && make && make install [root@apache zlib-1.2.8]# cd ../zlib-1.2.8/ [root@apache zlib-1.2.8]# ./configure --prefix=/usr/local/zlib && make && make install [root@apache pcre-8.39]# cd ../pcre-8.39/ [root@apache pcre-8.39]# ./configure --prefix=/usr/local/pcre && make && make install [root@apache pcre-8.39]# cd ../openssl-1.0.1u/ [root@apache openssl-1.0.1u]# ./config -fPIC --prefix=/usr/local/openssl enable-shared && make && make install #依賴安裝完成後,開始安裝http服務 [root@apache openssl-1.0.1u]# cd ../httpd-2.4.23/ [root@apache httpd-2.4.23]# ./configure --prefix=/usr/local/http-2.4.23 --enable-so --enable-cgi --enable-cgid --enable-ssl --with-ssl=/usr/local/openssl --enable-rewrite --with-pcre=/usr/local/pcre --with-z=/usr/local/zlib --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util -enable-modules=most --enable-mods-shared=most --enable-mpms-shared=all --with-mpm=event --enable-proxy --enable-proxy-fcgi --enable-expires --enable-deflate && make && make install [root@apache httpd-2.4.23]# cd /usr/local/http-2.4.23/bin/ [root@apache bin]# ln -sf /usr/local/http-2.4.23/bin/* /usr/local/bin/ #將apache的命令作軟連接 [root@apache bin]# apachectl start #啓動apache服務,會提示如下信息,無所謂的。 #若想解決,只需在apache的主配置文件中添加域名便可 AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using fe80::c94:cd92:5c18:a1. Set the 'ServerName' directive globally to suppress this message
至此,apache的網頁就能夠訪問了。centos
關於安裝apache服務時的配置項,相關解釋以下:緩存
- --enable-so:打開dos支持,能夠在編譯完成後添加額外功能
- --enable-cgi:開啓cgi通用網管接口
- --enable-cgid:開啓cig通用網管接口管理程序
- --enable-ssl:http加密傳輸協議,支持https協議。
- --enable-rewrite:開啓地址重寫功能,用來實現防盜鏈
- --with-服務名稱=/PATH路徑:指定安裝時依賴服務的路徑
- --enable-mods-shared=most:在安裝的過程當中安裝經常使用模塊
- --enable-mpms-shared=all:安裝apache的全部工做模式
- --enable-proxy:開啓http代理功能
- --enable-proxy-fcgi:支持fastcgi快速通用網關接口的fcgi協議
- --enable-expires:支持緩存功能
- --enable-deflate:支持壓縮功能
安裝至此就完成了,下面來談談apache服務的三種工做模式。
apache服務的三種工做模式爲:
- prefork:預派生子進程;
- worker:多進程+多線程;
- event:多進程+多線程+epoll處理模型;
prefork模式能夠算是很古老可是很穩定的模式。apache在剛啓動時,就預派生fork一些子進程(默認爲5個),每一個子進程只有一個線程,而後等待請求進來,而且老是試圖保持一些空閒的子進程,之因此這樣作,是爲了減小頻繁建立和銷燬進程的開銷。每一個子進程中只有一個線程,在一個時間點內,一個線程只能處理一個請求。
在Unix系統中,父進程一般以root身份運行以便綁定80端口,而apache產生的子進程一般以一個低特權的用戶運行。運行子進程的用戶必需要對它服務的內容有讀取的權限,可是對服務內容以外的其餘資源必須擁有儘量少的權限。
prefork模式的優缺點比較:
- 優勢:成熟,兼容全部新老模塊。進程之間徹底獨立,使得它很是穩定。同時,不須要擔憂線程安全的問題。(咱們經常使用的mod_php,PHP的拓展不須要支持線程安全,prefork這個模式很是安全)。
- 缺點:一個進程相對佔用更多的系統資源,消耗更多的內存。並且,它並不擅長處理高併發請求,在這種場景下,它會將請求放進隊列中,一直等到有可用進程,請求才會被處理。
總結:prefork工做模式,效率最高,可是內存使用較大,不擅長處理高併發的場景。
worker模式比起prefork模式,是使用了多進程+多線程的模式。它也預先fork了幾個子進程(數量比較少),每一個子進程可以生成一些服務線程和一個監聽線程,該監聽線程接入請求並將其傳遞給服務線程處理和應答。
線程比起進程會更輕量,由於線程一般會共享父進程的內存空間,所以,內存的佔用會減小一些,在高併發的場景下,表現得比 prefork模式好。
worker模式的多進程+多線程模式中,各個進程之間都是獨立的,若是某個線程出現異常,受影響的只是Apache的一部分服務,而不是整個服務。其餘進程仍然能夠工做。
worker模式的優缺點比較:
- 優勢:佔據更少的內存,高併發下表現更優秀。
- 缺點:必須考慮線程安全的問題,由於多個子線程是共享父進程的內存地址的。若是使用keep-alive的長鏈接方式,也許中間幾乎沒有請求,這時就會發生阻塞,線程被掛起,須要一直等待到超時纔會被釋放。若是過多的線程,被這樣佔據,也會致使在高併發場景下的無服務線程可用。(該問題在prefork模式下,一樣會發生)
這個是 Apache中最新的模式,在如今版本里的已是穩定可用的模式。它和 worker模式很像,最大的區別在於,它解決了 keep-alive 場景下 ,長期被佔用的線程的資源浪費問題(某些線程由於被keep-alive,掛在那裏等待,中間幾乎沒有請求過來,一直等到超時)。
event工做模式中,會有一個專門的線程來管理這些keep-alive類型的線程,當有真實請求過來的時候,將請求傳遞給服務線程,執行完畢後,又容許它釋放。這樣,一個線程就能處理幾個請求了,實現了異步非阻塞。
event 工做模式在遇到某些不兼容的模塊時,會失效,將會回退到worker模式,一個工做線程處理一個請求。官方自帶的模塊,所有是支持event 的。
注意一點,event MPM須要Linux系統(Linux 2.6+)對Epoll的支持,才能啓用。
還有,須要補充的是HTTPS的鏈接(SSL),它的運行模式仍然是相似worker的方式,線程會被一直佔用,直到鏈接關閉。
[root@apache bin]# /etc/init.d/httpd -M #查看apache加載的模塊 [root@apache bin]# /etc/init.d/httpd -V #查看apache的工做模式 ..............#省略部份內容 Server's Module Magic Number: 20120211:61 Server loaded: APR 1.5.2, APR-UTIL 1.5.4 Compiled using: APR 1.5.2, APR-UTIL 1.5.4 Architecture: 64-bit Server MPM: event #這行即是它的工做模式 threaded: yes (fixed thread count) forked: yes (variable process count) ..............#省略部份內容 [root@apache bin]# cd /usr/local/http-2.4.23/conf/ #切換至指定目錄 [root@apache conf]# vim httpd.conf ..............#省略部份內容 Include conf/extra/httpd-mpm.conf #定位httpd-mpm到此,去除開頭的註釋符號 ..............#省略部份內容 LoadModule mpm_event_module modules/mod_mpm_event.so #LoadModule mpm_prefork_module modules/mod_mpm_prefork.so #LoadModule mpm_worker_module modules/mod_mpm_worker.so #定位worker至此行 #上面三行就是就是apache服務的三種工做模式,須要那種工做模式,只須要將原來的工做模式註釋掉 #而後將所須要的工做模式那行去掉註釋符號,而後再啓動服務便可(注意是啓動,不是重啓) ..............#省略部份內容 #如,我如今將其改成worker工做模式,那麼,配置以下: Include conf/extra/httpd-mpm.conf #定位httpd-mpm到此,去除開頭的註釋符號 ..............#省略部份內容 #LoadModule mpm_event_module modules/mod_mpm_event.so #LoadModule mpm_prefork_module modules/mod_mpm_prefork.so LoadModule mpm_worker_module modules/mod_mpm_worker.so [root@apache conf]# /etc/init.d/httpd restart #重啓時,可能會提示如下信息,是由於域名的緣由,不礙事 AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using fe80::c94:cd92:5c18:a1. Set the 'ServerName' directive globally to suppress this message #若想要解決那些提示信息,能夠打開apache的主配置文件進行更改: [root@apache conf]# pwd #肯定當前路徑 /usr/local/http-2.4.23/conf [root@apache conf]# vim httpd.conf #打開文件,更改下面的那行,其爲本機IP,如有域名,能夠直接寫域名 ServerName 192.168.20.4 #去掉開頭的註釋符號 [root@apache conf]# /etc/init.d/httpd -V #再次查看apache的工做模式 Server version: Apache/2.4.23 (Unix) Server built: Oct 10 2019 20:52:01 Server's Module Magic Number: 20120211:61 Server loaded: APR 1.5.2, APR-UTIL 1.5.4 Compiled using: APR 1.5.2, APR-UTIL 1.5.4 Architecture: 64-bit Server MPM: worker #能夠發現更改生效了 ..............#省略部份內容
在上面改工做模式,實際上是調用了別的地方的配置文件,其調用的配置文件就是conf/extra/httpd-mpm.conf,這也就是爲何在上面更改工做模式時,須要先去掉Include conf/extra/httpd-mpm.conf 這行的註釋了,就是爲了調用這個配置文件。
[root@apache conf]# cat extra/httpd-mpm.conf | egrep -v '^#|^$' #查看其文件內容,而且過濾掉註釋及空行 <IfModule !mpm_netware_module> PidFile "logs/httpd.pid" </IfModule> <IfModule mpm_prefork_module> <!--這就是prefork工做模式的參數--> StartServers 5 <!--apache啓動時默認開啓的子進程數--> MinSpareServers 5 <!--最小的閒置子進程數--> MaxSpareServers 10 <!--最大的閒置子進程數--> MaxRequestWorkers 250 <!-- MaxRequestWorkers最爲重要,它設置了容許同時的最大接入請求數量。任何超過 MaxRequestWorkers限制的請求將進入等候隊列,在apache2.3.1版本 MaxRequestWorkers被稱爲MaxClients,如今仍支持此名字 --> MaxConnectionsPerChild 0 <!-- MaxConnectionsPerChild設置的是每一個子進程可處理的請求數,每一個子進程在處理了 「MaxConnectionsPerChild」個請求後將自動銷燬。0表示無限制,即子進程永不銷燬。 雖然缺省設爲 0 可使每一個子進程處理更多的請求,但若是設成非零值也有兩點重要的好處: 一、可防止意外的內存泄漏。 二、在服務器負載降低的時侯會自動減小子進程數。所以,可根據服務器的負載來調整這個值。 在 Apache2.3.9 以前稱之爲 MaxRequestsPerChild。 --> <!--prefork控制進程在最初創建「StartServers」個子進程後,爲了知足「MinSpareServers」 設置的須要建立一個進程,等待一秒鐘,繼續建立兩個,再等待一秒鐘,繼續建立四個.... 如此按照此等級增長建立的進程數,最多達每秒鐘32個,直到知足MinSpareServers設置 的值爲止。這種模式 能夠沒必要在請求到來時再產生新的進程,從而減少了系統開銷以增長性能。 MaxSpareServers 設置了最大的空閒進程數,若是空閒進程數大於這個 值,Apache 會自動 kill掉一些多餘進程。這個值不要設得過大,但若是設的值比 MinSpareServers 小,Apache 會自動把其調整爲 MinSpareServers+1。若是站點負載較大, 可考慮同時加大MinSpareServers 和MaxSpareServers。--> </IfModule> <IfModule mpm_worker_module> <!--這是worker工做模式的參數--> StartServers 3 <!--apache啓動時默認開始的子進程數--> MinSpareThreads 75 <!--最小空閒數量的工做線程--> MaxSpareThreads 250 <!--最大空閒數量的工做線程--> ThreadsPerChild 25 <!--每一個子進程產生的線程數量--> MaxRequestWorkers 400 <!--與prefork模式相同--> MaxConnectionsPerChild 0 <!--與prefork模式相同--> </IfModule> <IfModule mpm_event_module> <!--這是event工做模式的參數,每一個配置項的含義與worker基本類似--> StartServers 3 MinSpareThreads 75 MaxSpareThreads 250 ThreadsPerChild 25 MaxRequestWorkers 400 MaxConnectionsPerChild 0 </IfModule> <!--如下內容暫時不用看--> <IfModule mpm_netware_module> ThreadStackSize 65536 StartThreads 250 MinSpareThreads 25 MaxSpareThreads 250 MaxThreads 1000 MaxConnectionsPerChild 0 </IfModule> <IfModule mpm_mpmt_os2_module> StartServers 2 MinSpareThreads 5 MaxSpareThreads 10 MaxConnectionsPerChild 0 </IfModule> <IfModule mpm_winnt_module> ThreadsPerChild 150 MaxConnectionsPerChild 0 </IfModule> <IfModule !mpm_netware_module> MaxMemFree 2048 </IfModule> <IfModule mpm_netware_module> MaxMemFree 100 </IfModule>
因爲上述配置文件解釋起來過於繁瑣,這裏附加一張圖,能夠參考此圖來更改上述配置:
如今我這裏的工做模式爲worker,能夠更改其上述的配置項,以便優化其性能,更改以下(我會故意更改的值超出其範圍,製造錯誤,而且寫出其錯誤解決方案):
[root@apache extra]# pwd <!--肯定當前路徑--> /usr/local/http-2.4.23/conf/extra [root@apache extra]# vim httpd-mpm.conf <!--編輯該文件,更改以下--> <IfModule mpm_worker_module> <!--就更改worker模塊--> StartServers 5 MinSpareThreads 150 MaxSpareThreads 200001 ThreadsPerChild 25 MaxRequestWorkers 400 MaxConnectionsPerChild 0 </IfModule> [root@apache extra]# /etc/init.d/httpd restart <!--重啓服務--> [root@apache extra]# ps -ef | grep httpd | wc -l 8 <!--共8行,其中一個是主進程,還有一個是不相干的,因此要減2,就是說,有6個子進程, 而配置文件中定義的每一個子進程有25個線程,也就知足了最小空閒線程150,若將最小空閒 子進程項改成200,那麼重啓後,等待1秒左右,就會發現又多了兩個子進程,以便知足最小空閒子進程-->
在上面的配置中雖然MaxSpareThreads的值爲200001(確定超過了它的最大範圍),但重啓時仍是沒有報錯,緣由就是MaxRequestWorkers的值仍是400,這個值生效了,攔截了MaxSpareThreads的值,因此沒有報錯,那麼接下來再將其更改以下:
[root@apache extra]# vim httpd-mpm.conf <!--編輯配置文件,將值都修改的大些--> <IfModule mpm_worker_module> StartServers 300 MinSpareThreads 200 MaxSpareThreads 2000001 ThreadsPerChild 25 MaxRequestWorkers 200001 <!--將此處的值也修改的大點--> MaxConnectionsPerChild 0 </IfModule> [root@apache extra]# /etc/init.d/httpd restart <!--重啓服務,會提示如下信息--> AH00316: WARNING: MaxRequestWorkers of 200001 is not an integer multiple of ThreadsPerChild of 25, decreasing to nearest multiple 200000, for a maximum of 8000 servers. AH00318: WARNING: MaxRequestWorkers of 200000 would require 8000 servers and would exceed ServerLimit of 16, decreasing to 400. To increase, please see the ServerLimit directive. <!--翻譯以下:AH00316:警告:MaxRequestWorkers的200001不是ThreadsPerChild的25的整數倍,減小到最近的200000的倍數,最多8000個服務器。 AH00318:警告:MaxRequestWorkers的200000將須要8000個服務器,將超過服務器限制16,減小到400。要增長,請參閱ServerLimit指令。--> <!--根據提示信息,須要進行如下更改--> [root@apache extra]# vim httpd-mpm.conf <!--編輯配置文件,更改以下--> <IfModule mpm_worker_module> ServerLimit 2000 StartServers 80 MinSpareThreads 200 MaxSpareThreads 2000 ThreadsPerChild 25 MaxRequestWorkers 2000 MaxConnectionsPerChild 0 </IfModule> [root@apache extra]# /etc/init.d/httpd restart <!--再次重啓,就沒有那些提示信息了-->
在上面的配置項中,各個配置項的值都是有默認的限制的,若想改變其限制,則須要在配置項的上一行增長ServerLimit配置項,並且ServerLimit配置項也是有最大限制的,若要修改各類值,建議仔細閱讀下面的內容,再進行更改。
線程就是指進程內的一個執行單元,也是進程內的可調度實體。
與進程的區別:
- 地址空間:進程內的一個執行單元;進程至少有一個線程;它們共享進程的地址空間;而進程有本身獨立的地址空間;
- 資源擁有:進程是資源分配和擁有的單位,同一個進程內的線程共享進程的資源;
- 線程是處理器調度的基本單位,但進程不是;
- 兩者都可併發執行;
進程和線程都是由操做系統所體會的程序運行的基本單元,系統利用該基本單元實現系統對應用的併發性。
進程和線程的區別在於:
簡而言之,一個程序至少有一個進程,一個進程至少有一個線程。
線程的劃分尺度小於進程,使得多線程程序的併發性高。
另外,進程在執行過程當中擁有獨立的內存單元,而多個線程共享內存,從而極大地提升了程
序的運行效率。
———————— 本文至此結束,感謝閱讀 ————————