系統(tǒng)運維
一.編譯安裝apache2.4.23博文結(jié)構(gòu)
創(chuàng)新互聯(lián)長期為成百上千家客戶提供的網(wǎng)站建設(shè)服務(wù),團隊從業(yè)經(jīng)驗10年,關(guān)注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為本溪企業(yè)提供專業(yè)的網(wǎng)站設(shè)計、成都做網(wǎng)站,本溪網(wǎng)站改版等技術(shù)服務(wù)。擁有10多年豐富建站經(jīng)驗和眾多成功案例,為您定制開發(fā)。
安裝apache
工作模式
新版本的 httpd-2.4 新增以下特性;
新增模塊; mod_proxy_fcgi(可提供 fcgi 代理)
mod_ratelimit(限制用戶帶寬)
mod_request(請求模塊,對請求做過濾)
mod_remoteip(匹配客戶端的 IP 地址)
對于基于 IP 的訪問控制做了修改,不再支持 allow,deny,order 機制,而是統(tǒng)一使用 require 進行
新增以下幾條新特性;
1、MPM 支持在運行時裝載;不過要開啟這種特性,在編譯安裝要啟用這三種功能; --enable-mpms-shared=all --with-mpm=event
2、支持 event
3、支持異步讀寫
4、在每個模塊及每個目錄上指定日志級別
5、增強版的表達式分析器
6、每請求配置:
7、毫秒級別的 keepalive timeout
8、基于 FQDN 的虛擬主機不再需要 NameVirtualHost 指令
9、支持使用自定義變量
下載源碼包
注:apr(Apache Portable Runtime)Apache 可移植運行庫,它是一個對操作系統(tǒng)調(diào)用的抽 象庫,用來實現(xiàn) Apache 內(nèi)部組件對操作系統(tǒng)的使用,提高系統(tǒng)的可移植性。 安裝 apr 和 apr-util
解壓縮[root@localhost media]# ls
apr-1.5.2.tar.gz cronolog-1.6.2.tar.gz openssl-1.0.1u.tar.gz
apr-util-1.5.4.tar.gz httpd-2.4.23.tar.gz pcre-8.39.tar.gz
[root@localhost media]# tar zxf apr-1.5.2.tar.gz -C /usr/src/
[root@localhost media]# tar zxf apr-util-1.5.4.tar.gz -C /usr/src/
[root@localhost media]tar zxf zlib-1.2.8.tar.gz -C /usr/src/
[root@localhost media]# tar zxf pcre-8.39.tar.gz -C /usr/src/
[root@localhost media]# tar zxf httpd-2.4.23.tar.gz -C /usr/src/
[root@localhost media]# tar zxf openssl-1.0.1u.tar.gz -C /usr/src/
安裝
[root@localhost src]# cd /usr/src/
[root@localhost src]# ls
apr-1.5.2 apr-util-1.5.4 debug httpd-2.4.23 kernels openssl-1.0.1u pcre-8.39
[root@localhost src]# cd apr-1.5.2/
[root@www apr-1.5.2]# ./configure --prefix=/usr/local/apr
[root@www apr-1.5.2]# make && make install
[root@www ~]# cd apr-util-1.5.4/
[root@www apr-util-1.5.4]# ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr
[root@www apr-util-1.5.4]# make && make install
安裝zlib
[root@www ~]# cd zlib-1.2.8/
[root@www zlib-1.2.8]# ./configure --prefix=/usr/local/zlib
[root@www zlib-1.2.8]# make && make install
安裝pcre
[root@www ~]# cd pcre-8.39/
[root@www pcre-8.39]# ./configure --prefix=/usr/local/pcre
[root@www pcre-8.39]# make && make install
安裝openssl
安裝 apache2.4.23 時提示 openssl 版本過低,centos7 自帶版本 openssl-1.0.1e
[root@www ~]# cd openssl-1.0.1u/
[root@www openssl-1.0.1u]# ./config -fPIC --prefix=/usr/local/openssl enable-shared
[root@www openssl-1.0.1u]# make && make install
[root@www ~]# mv /usr/bin/openssl /usr/bin/openssl.1.0.1e
[root@www ~]# ln -s /usr/local/openssl/bin/openssl /usr/bin/openssl
[root@www ~]# cd httpd-2.4.23/
[root@www 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
[root@www httpd-2.4.23]# make && make install
[root@www httpd-2.4.23]# ln -s /usr/local/http-2.4.23/bin/* /usr/local/bin/
\\\\優(yōu)化 http 程序執(zhí)行路徑
[root@www httpd-2.4.23]# ln -s /usr/local/http-2.4.23/bin/* /usr/local/bin
\\\\修改配置文件 httpd.conf,設(shè)置其中的 ServerName 值
[root@www /]# /usr/local/http-2.4.23/apachectl start
[root@www httpd-2.4.23]# cp /usr/local/http-2.4.23/bin/apachectl /etc/init.d/httpd
\\\\開機后自動啟動
[root@www httpd-2.4.23]# vi /etc/init.d/httpd \\\\添加下面?zhèn)z行帶#
# chkconfig: 35 85 15 (在 3 和 5 啟動模式下的--啟動優(yōu)先級)
# description: apache 2.4.23
[root@www httpd-2.4.23]# chkconfig --add httpd
[root@www httpd-2.4.23]# chkconfig httpd on
\\\\將 Apache 加入開機自動啟動
[root@www httpd-2.4.23]# service httpd start
[root@www httpd-2.4.23]# netstat -anplt | grep 80 tcp6
0 0 :::80 :::* LISTEN 4807/httpd
參數(shù)解釋:
--enable-so:支持動態(tài)共享模塊(即打開 DSO 支持)
--enable-rewrite:支持 url 重寫
--enable-ssl:支持 ssl --with-ssl=/usr/local/openssl:指定 ssl 安裝位置
--enable-cgi:啟用 cgi --enable-cgid:MPM 使用的是 event 或 worker 要啟用 cgid -
-enable-modules=most:明確指明要靜態(tài)編譯到 httpd 二進制文件的模塊,為 空格分隔的模塊名列表、all 或者 most,all 表示包含所有模塊,most 表示包含大部分常用模 塊
--enable-mods-shared=most:明確指明要以 DSO 方式編譯的模塊,為空格分隔 的模塊名列表、all 或者 most,all 表示包含所有模 塊,most 表示包含大部分模塊
--enable-mpms-shared=all:啟用 MPM 所有支持的模式,這樣 event、worker、prefork 就會以 模塊化的方式安裝,要用哪個就在 httpd.conf 里配置就好了。
--with-mpm=event:指定啟用的 mpm 模式,默認使用 enevt 模式,在 apache 的早期版本 2.0 默認 prefork,2.2 版本是 worker,2.4 版本是 event.
--with-pcre=/usr/local/pcre:支持 pcre
--with-z=/usr/local/zlib:使用 zlib 壓縮庫
--with-apr=/usr/local/apr:指定 apr 的安裝路徑
--with-apr-util=/usr/local/apr-util:指定 apr-util 的安裝路徑
二.apache的優(yōu)化及模塊解釋
apache 所運行的硬件環(huán)境都是對性能影響的因素,即使不能對硬件進行升級,也最好 給 apache 一個單獨的主機以免受到其他應(yīng)用的干擾。各個硬件指標中,對性能影響的 是內(nèi)存,對于靜態(tài)內(nèi)容(圖片、javascript 文件、css 文件等),它決定了 apache 可以緩存多 少內(nèi)容,它緩存的內(nèi)容越多,在硬盤上讀取內(nèi)容的機會就越少,大內(nèi)存可以極大提高靜態(tài)站 點的速度;對動態(tài)高負載站點來說,每個請求保存的時間更多一些,apache 的 mpm 模塊會 為每個請求派生出相應(yīng)的進程或線程分別處理,而進程或線程的數(shù)量與內(nèi)存的消耗近似成正 比,因此增大內(nèi)存對提高動態(tài)站點的負載和運行速度也極為有利 其次是硬盤的速度,靜態(tài)站點尤為突出,apache 不斷的在讀取文件并發(fā)送給相應(yīng)的請求, 硬盤的讀寫是極其頻繁的;動態(tài)站點也要不斷的加載 web 程序(php 等),一個請求甚至要讀 取十幾個文件才能處理完成,因此盡可能的提高硬盤速度和質(zhì)量對提高 apache 的性能是有 積極意義的。 最后是 cpu 和網(wǎng)絡(luò),cpu 影響的是 web 程序執(zhí)行速度,網(wǎng)絡(luò)影響流量大小。
工作模式
Apache HTTP 服務(wù)器被設(shè)計為一個強大的、靈活的能夠在多種平臺以及不同環(huán)境下工作的服 務(wù)器。這種模塊化的設(shè)計就叫做“多進程處理模塊”(Multi-Processing Module,MPM),也叫 做工作模式
注:如果要更改工作模式里面的進程需要到主配置文件里面把
[root@www ~]# vi /usr/local/http-2.4.23/conf/httpd.conf
Include conf/extra/httpd-mpm.conf \\這條前面#去掉就可以更改進程了(大約在456頁搜索mpm)
[root@www /]# ps -ef | grep httpd \\看進程
[root@www /]# apachectl -t \\jian檢查語法
其工作方式:當Apache服務(wù)啟動后,mpm_prefork模塊會預(yù)先創(chuàng)建多個子進程(默認為5個),每個子進程只有一個線程,當接收到客戶端請求后,mpm_prefork模塊再將請求轉(zhuǎn)交給子進程進行處理,并且每個子進程同時只能用于單個請求。如果當前的請求數(shù)將超過預(yù)先創(chuàng)建的子進程數(shù)時,mpm_prefork模塊就會創(chuàng)建新的子進程來處理額外的請求。
開啟prefork模式的方法:[root@localhost ~]# vim /usr/local/http-2.4.23/conf/httpd.conf
//編寫httpd的主配置文件,修改一下內(nèi)容
Include conf/extra/httpd-mpm.conf //默認存在刪除“#”號即可
#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
//這三行便是apache的三種工作模式,可根據(jù)實際情況進行切換
[root@localhost ~]# systemctl restart httpd //重新啟動httpd服務(wù)
[root@localhost ~]# systemctl start httpd //手動再啟動一下
[root@localhost ~]# httpd -V //查看httpd的工作模式
//找到這一行即可
Server MPM: prefork //可以看到現(xiàn)在Apache工作在prefork模式
[root@www ~]# apachectl –l //小寫 L,只顯示靜態(tài)模塊)
修改 prefork 參數(shù)
[root@www ~]# vi /usr/local/http-2.4.23/conf/extra/httpd-mpm.conf
//設(shè)置prefork模式也就只有這幾個參數(shù),具體含義:
//這就是prefork工作模式的參數(shù)-
StartServers 5 //apache啟動時默認開啟的子進程數(shù)
MinSpareServers 5 //最小的閑置子進程數(shù)
MaxSpareServers 10 //的閑置子進程數(shù)
MaxRequestWorkers 250 // 設(shè)置了允許同時的接入請求數(shù)量
MaxConnectionsPerChild 0 //0表示每個子進程處理完數(shù)據(jù)后進程永不銷毀,設(shè)置成非0時,可防止內(nèi)存泄漏,服務(wù)器在負載小時自動減少自己進程數(shù)
注 1:MaxRequestWorkers 是這些指令中最為重要的一個,設(shè)定的是 Apache 可以同時處理 的請求,是對 Apache 性能影響的參數(shù)。如果請求總數(shù)已達到這個值(可通過 ps -ef|grep http|wc -l 來確認),那么后面的請求就要排隊,直到某個已處理請求完畢。這就是系統(tǒng)資源 還剩下很多而 HTTP 訪問卻很慢的主要原因。雖然理論上這個值越大,可以處理的請求就越 多,建議將初始值設(shè)為(以 Mb 為單位的物理內(nèi)存/2),然后根據(jù)負載情況進行動態(tài)調(diào)整。 比如一臺 4G 內(nèi)存的機器,那么初始值就是 4000/2=2000
注 2:prefork 控制進程在最初建立“StartServers”個子進程后,為了滿足 MinSpareServers 設(shè)置的需要創(chuàng)建一個進程,等待一秒鐘,繼續(xù)創(chuàng)建兩個,再等待一秒鐘,繼續(xù)創(chuàng)建四個……如 此按指數(shù)級增加創(chuàng)建的進程數(shù),最多達到每秒 32 個,直到滿足 MinSpareServers 設(shè)置的值為止。這種模式 可以不必在請求到來時再產(chǎn)生新的進程,從而減小了系統(tǒng)開銷以增加性能。 MaxSpareServers 設(shè)置了的空閑進程數(shù),如果空閑進程數(shù)大于這個 值,Apache 會自動 kill 掉一些多余進程。這個值不要設(shè)得過大,但如果設(shè)的值比 MinSpareServers 小,Apache 會自 動把其調(diào)整為 MinSpareServers+1。如果站點負載較大,可考慮同時加大 MinSpareServers 和 MaxSpareServers。
注 3:ServerLimit 和 MaxClients(MaxRequestWorkers)有什么區(qū)別呢? 是因為在 apache1 時代,控制進程數(shù)只有 MaxClients 這個參數(shù),并且這個參數(shù)值為 256,并且是寫死了的,試圖設(shè)置為超過 256 是無效的,這是由于 apache1 時代的服務(wù)器硬 件限制的。但是 apache2 時代由于服務(wù)器硬件的升級,硬件已經(jīng)不再是限制,所以使用 ServerLimit 這個參數(shù)來控制進程數(shù),ServerLimit 值>=MaxClient 值才有效。ServerLimit 要放在 MaxClients 之前,值要不小于 MaxClients
優(yōu)點:成熟,兼容所有新老模塊。進程之間完全獨立,使得它非常穩(wěn)定。同時,不需要擔心線程安全的問題。(我們常用的mod_php,PHP的拓展不需要支持線程安全)
缺點:一個進程相對占用更多的系統(tǒng)資源,消耗更多的內(nèi)存。而且,它并不擅長處理高并發(fā)請求,在這種場景下,它會將請求放進隊列中,一直等到有可用進程,請求才會被處理。
Worker 模式(多線程多進程)和 prefork 模式相比,worker 使用了多進程和多線程的混合模式,worker 模式也同樣會先預(yù)派生一些子進程,然后每個子進程創(chuàng)建一些線程,同時包括一個監(jiān)聽線程,每個請求過來會 被分配到一個線程來服務(wù)。線程比起進程會更輕量,因為線程是通過共享父進程的內(nèi)存空間, 因此,內(nèi)存的占用會減少一些,在高并發(fā)的場景下會比 prefork 有更多可用的線程,表現(xiàn)會 更優(yōu)秀一些;另外,如果一個線程出現(xiàn)了問題也會導(dǎo)致同一進程下的線程出現(xiàn)問題,如果是 多個線程出現(xiàn)問題,也只是影響 Apache 的一部分,而不是全部。由于用到多進程多線程, 需要考慮到線程的安全了,在使用 keep-alive 長連接的時候,某個線程會一直被占用,即使 中間沒有請求,需要等待到超時才會被釋放(該問題在 prefork 模式下也存在) 總的來說,prefork 方式速度要稍高于 worker,然而它需要的 cpu 和 memory 資源也稍多于 woker。
work模式的配置/自行修改httpd主配置文件,切換模式并重啟服務(wù),接下來
[root@localhost ~]# vim /usr/local/http-2.4.23/conf/extra/httpd-mpm.conf
//這是worker工作模式的參數(shù)
StartServers 3 //apache啟動時默認開始的子進程數(shù)
MinSpareThreads 75 //最小空閑數(shù)量的工作線程-
MaxSpareThreads 250 //空閑數(shù)量的工作線程-
ThreadsPerChild 25 //每個子進程產(chǎn)生的線程數(shù)量
MaxRequestWorkers 400 //每個進程接受的請求數(shù)量
MaxConnectionsPerChild 0 //表示永不銷毀
Worker模式下所能同時處理的請求總數(shù)是由子進程總數(shù)乘以ThreadsPerChild 值決定的,應(yīng)該大于等于MaxRequestWorkers。如果負載很大,現(xiàn)有的子進程數(shù)不能滿足時,控制進程會派生新的子進程。默認的子進程總數(shù)是16,加大時 也需要顯式聲明ServerLimit(值是20000)。需要注意的是,如果顯式聲明了ServerLimit,那么它乘以 ThreadsPerChild的值必須大于等于MaxRequestWorkers,而且MaxRequestWorkers必須是ThreadsPerChild的整數(shù)倍,否則 Apache將會自動調(diào)節(jié)到一個相應(yīng)值。
優(yōu)點:占據(jù)更少的內(nèi)存,高并發(fā)下表現(xiàn)更優(yōu)秀。
缺點:必須考慮線程安全的問題,因為多個子線程是共享父進程的內(nèi)存地址的。如果使用keep-alive的長連接方式,也許中間幾乎沒有請求,這時就會發(fā)生阻塞,線程被掛起,需要一直等待到超時才會被釋放。如果過多的線程,被這樣占據(jù),也會導(dǎo)致在高并發(fā)場景下的無服務(wù)線程可用。(該問題在prefork模式下,同樣會發(fā)生)。
Event 模式 多進程+多線程+epoll這是 Apache 最新的工作模式,是 worker 模式的變種,它把服務(wù)進程從連接中分離出來,一 worker 模式不同的是在于它解決了 keep-alive 長連接的時候占用線程資源被浪費的問題,在 event 工作模式中,會有一些專門的線程用來管理這些 keep-alive 類型的線程,當有真實請
求過來的時候,將請求傳遞給服務(wù)器的線程,執(zhí)行完畢后,又允許它釋放。這增強了在高并 發(fā)場景下的請求處理。event 模式不能很好的支持 https 的訪問(HTTP 認證相關(guān)的問題)。
地址空間:進程內(nèi)的一個執(zhí)行單元;進程至少有一個線程;它們共享進程的地址空間;而進程有自己獨立的地址空間;
資源擁有:進程是資源分配和擁有的單位,同一個進程內(nèi)的線程共享進程的資源;
線程是處理器調(diào)度的基本單位,但進程不是;
二者均可并發(fā)執(zhí)行;