目錄
一、Apache的工作模式
1、簡介
2、比較
二、CentOS6.x上安裝Apache
(一)rpm安裝apache
(二)編譯安裝apache2.2
1、安裝編譯環境
2、下載解壓依賴包
3、安裝apache2.2
4、測試apache2.2
5、查看apache相關信息
6、配置程序運行環境
7、導出庫文件
8、導出頭文件
9、導出手冊
10、將Apache添加到啟動服務
(三) 編譯安裝Apache2.4
1、編譯安裝apr
2、編譯安裝apr-util
3、安裝需要的依賴包
4、編譯安裝Apache2.4
5、安裝后配置
一、Apache的工作模式
Apache HTTP服務器被設計為一個強大的、靈活的能夠在多種平臺以及不同環境下工作的服務器。Apache HTTP服務器被設計為一個強大的、靈活的能夠在多種平臺以及不同環境下工作的服務器。這種模塊化的設計就叫做“多路處理模塊”(Multi-Processing Modules,MPMs),也叫做工作模式。
在編譯apache時必須選擇也只能選擇一個MPM,對類UNIX系統,有幾個不同的MPM可供選擇,它們會影響到apache的速度和可伸縮性。
1、簡介
Prefork MPM:
prefork是Unix平臺上的默認(缺?。㎝PM,使用多個子進程,每個子進程只有一個線程。每個進程在某個確定的時間只能維持一個連接,效率高,但內存占用量比較大。
這個多路處理模塊(MPM)實現了一個非線程型的、預派生的web服務器,它的工作方式類似于Apache 1.3。它適合于沒有線程安全庫,需要避免線程兼容性問題的系統。它是要求將每個請求相互獨立的情況下最好的MPM,這樣若一個請求出現問題就不會影響到其他請求。
這個MPM具有很強的自我調節能力,只需要很少的配置指令調整。最重要的是將MaxClients設置為一個足夠大的數值以處理潛在的請求高峰,同時又不能太大,以致需要使用的內存超出物理內存的大小。
Worker MPM:
worker使用多個子進程,每個子進程有多個線程,每個線程在某個確定的時間只能維持一個連接,內存占用量比較小,適合高流量的http服務器。缺點是假如一個線程崩潰,整個進程就會連同其任何線程一起”死掉”,所以要保證一個程式在運行時必須被系統識別為”每個線程都是安全的”。
此多路處理模塊(MPM)使網絡服務器支持混合的多線程多進程。由于使用線程來處理請求,所以可以處理海量請求,而系統資源的開銷小于基于進程的MPM。但是它也使用了多進程,每個進程又有多個線程,以獲得基于進程的MPM的穩定性。
每個進程可以擁有的線程數量是固定的。服務器會根據負載情況增加或減少進程數量。一個單獨的控制進程(父進程)負責子進程的建立。每個子進程可以建立ThreadsPerChild數量的服務線程和一個監聽線程,該監聽線程監聽接入請求并將其傳遞給服務線程處理和應答。
不管是Worker模式或是Prefork模式,Apache總是試圖保持一些備用的(spare)或者是空閑的子進程(空閑的服務線程池)用于迎接即將到來的請求。這樣客戶端就不需要在得到服務前等候子進程的產生。
Event MPM:
以上兩種穩定的MPM方式在非常繁忙的服務器應用下都有些不足。盡管HTTP的Keepalive方式能減少TCP連接數量和網絡負載,但是 Keepalive需要和服務進程或者線程綁定,這就導致一個繁忙的服務器會耗光所有的線程。 Event MPM是解決這個問題的一種新模型,它把服務進程從連接中分離出來。在服務器處理速度很快,同時具有非常高的點擊率時,可用的線程數量就是關鍵的資源限 制,此時Event MPM方式是最有效的。一個以Worker MPM方式工作的繁忙服務器能夠承受每秒好幾萬次的訪問量(例如在大型新聞服務站點的高峰時),而Event MPM可以用來處理更高負載。值得注意的是,Event MPM不能在安全HTTP(HTTPS)訪問下工作。
ITK MPM:
Linux自身提供了很強的權限系統,最簡單的方法就是使用這個系統實現不同站點之間的權限劃分,但apache所有進程往往都是運行在同一用戶下,這也就是問題的根源,于是有了apache itk,在debian 里包名叫做apache2-mpm-itk 。和prefork 和 worker 一樣是一個mpm(多路處理器),實際上itk 是基于prefork的,為每個虛擬主機prefork出來的子進程可以以不同的用戶身份運行。apache UMASK變量設置為027,對應ftp的Umask 也設置為027,這樣程序生成或后上傳的文件也只能被本站點所屬用戶修改,只能被同組人查看,實現了隔離的較果。
這種不是Apache的MPMs,只是Linux某種發行版對Apache的改進。
2、比較
1)prefork和worker模式的比較
prefork模式使用多個子進程,每個子進程只有一個線程。每個進程在某個確定的時間只能維持一個連接。在大多數平臺上,Prefork MPM在效率上要比Worker MPM要高,但是內存使用大得多。prefork的無線程設計在某些情況下將比worker更有優勢:它可以使用那些沒有處理好線程安全的第三方模塊,并且對于那些線程調試困難的平臺而言,它也更容易調試一些。
worker模式使用多個子進程,每個子進程有多個線程。每個線程在某個確定的時間只能維持一個連接。通常來說,在一個高流量的HTTP服務器上,Worker MPM是個比較好的選擇,因為Worker MPM的內存使用比Prefork MPM要低得多。但worker MPM也由不完善的地方,如果一個線程崩潰,整個進程就會連同其所有線程一起"死掉".由于線程共享內存空間,所以一個程序在運行時必須被系統識別為"每個線程都是安全的"。
總的來說,prefork方式速度要稍高于worker,然而它需要的cpu和memory資源也稍多于woker。
2)對于Event 模式,apache給出了以下警告:This MPM is experimental, so it may or may not work as expected .
這種MPM目前處于試驗狀態,他可能不能按照預期的那樣工作。這是httpd2.2版本的情況,在httpd2.4版本后event模式已經很穩定了,可以用于生產環境。
小結:
prefork:多進程模型,每個進程響應一個請求;一個主進程:負責生成n個子進程,子進程也稱為工作進程,每個子進程處理一個用戶請求;即便沒有用戶請求,也會預先生成多個空閑進程,隨時等待請求到達;最大不會超過1024個;
worker:多線程模型,每個線程響應一個請求;一個主進程:生成多個子進程,每個子進程負責生個多個線程,每個線程響應一個請求;m進程,n線程:m*n 。
event:事件驅動模型,每個線程響應n個請求;一個主進程:生成m個子進程,每個進程直接n個請求;m*n 。
httpd-2.2: event為測試使用
httpd-.24:event可生產使用
二、CentOS6.x上安裝Apache2.2
環境:CentOS6.7,Minimal安裝。
(一)rpm安裝apache
1、使用yum命令安裝Apache
# yum -y install httpd
2、啟動Apache
# service httpd start
3、設置開機啟動Apache
# chkconfig --levels 235 httpd on
4、如果在瀏覽器無法瀏覽,請關閉iptables防火墻。
# service iptables stop //關閉命令 # chkconfig iptables off //永久關閉防火墻 # service iptables status //查看防火墻狀態
5、如果要安裝Apache其它擴展,參考下面命令。
# yum -y install httpd-manual mod_ssl mod_perl mod_auth_mysql
rpm安裝的Apache,默認用的是prefork模式。
圖1 查看rpm安裝的Apache的模式
(二)編譯安裝apache2.2
1、安裝編譯環境。
查看現有的編譯環境。
圖2 查看是否安裝編譯環境
安裝編譯環境:
# yum install "Development tools" "Server Platform Development" -y
2、下載解壓依賴包
Apache的編譯安裝需要依賴apr(Apache Portable Runtime )和apr-util,因此需要先安裝此兩個依賴包。Apache2.2版本需要apr/apr-util 1.2以上版本,Apache2.4版本需要apr/apr-utli 1.4以上版本。
CentOS6.7在安裝編譯環境時已經安裝了apr-1.3.9和apr-util-1.3.9,所以在CentOS6.7上安裝Apache2.2版本,不需要再安裝apr和apr-util。如果在CentOS6.7上編譯安裝Apache2.4版本,則需要下載apr/apr-utli 1.4以上版本。查找及下載方法見下。
(1)查找源碼包
圖3 查找并獲取源碼包下載地址
(2)下載源碼包。
圖4 下載源碼包
(3)解壓安裝依賴包
安裝apr。
# tar -xf apr-1.5.2.tar.bz2 # cd apr-1.5.2 # ./configure --prefix=/usr/local/apr # make && make install
安裝apr-util。
# tar -xf apr-util-1.5.4.tar.bz2 # cd apr-util-1.5.4 # ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr # make && make install
(4)安裝其它依賴包
如果編譯安裝Apache時要用到pcre,則需要pcre-devel依賴包。
# yum install pcre-devel -y
其它額外功能需要依賴包,按照上述方法安裝即可。
3、安裝Apache源碼包
# wget http://mirrors.hust.edu.cn/apache//httpd/httpd-2.2.31.tar.bz2 # tar -xf httpd-2.2.31.tar.bz2# cd httpd-2.2.31 # ./configure --prefix=/usr/local/apache22 --sysconfdir=/usr/local/httpd22 \ --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util \ --with-zlib --with-pcre --with-mpm=prefork --enable-so --enable-ssl \ --enable-cgi --enable-rewrite --enable-modules=most --enable-mpms-shared=all # make -j 4 && make install
4、測試Apache
(1)測試主配置文件語法
# cd /usr/local/apache22 # bin/apache22/bin/apachectl -t
圖5 測試主配置文件語法
測試Apache主配置文件httpd.conf是否有語法錯誤,出現”Syntax OK“表示配置文件無問題。
(2)查看監聽端口
# netstat -tan
圖6 查看監聽端口
(3)關閉防火墻
apache啟動完畢后,我們來查看下是否可訪問。
圖7 wget測試網頁
還可以嘗試用瀏覽器訪問http://192.168.163.12,如果無法訪問,關閉防火墻。
圖8 關閉防火墻
5、查看Apache相關信息
圖9 查看Apache相關信息
6、配置程序運行環境
每次用httpd或者apachectl程序時,都要在前面輸入一大段路徑,非常不方便。用”echo $PATH“查看環境變量時,”/usr/local/apache22/bin“路徑沒有配置在環境變量中。將此路徑添加到PATH環境變量中,以后調用httpd/apachectl就不需要輸入路徑了。
圖10 配置程序運行環境
這種方式的export只對當前shell有效,要想永久有效,執行以下步驟。
(1)編輯生成文件
# vim /etc/profile.d/httpd.sh
在此文件中寫入"export PATH=/usr/local/apache22/bin:$PATH",保存退出。
(2)執行
# source /etc/profile.d/httpd.sh
或者
# . /etc/profile.d/httpd.sh
圖11 導入路徑到環境變量
7、導入庫文件
一般應用程序運行都依賴于標準庫里面的文件,Linux系統會在特定路徑下為應用查找所依賴的庫文件:/lib64, /lib, /usr/lib64, /usr/lib, /usr/lib, /usr/lib64, /usr/local/lib, /usr/local/lib64 。某些應用程序需要的庫文件標準庫中沒有,那么就需要添加應用程序自身提供的庫文件到系統搜索路徑中。那么就要添加修改配置文件,讓系統搜索到此庫文件。
添加步驟:
(1) 編輯添加/etc/ld.so.conf.d/*.conf文件,*表示的文件名自己取。添加新庫文件搜索路徑至此文件中,每行一個。
(2) 執行ldconfig命令,重新生成庫映射緩存ld.so.conf 。
圖12 導入庫文件
ldconfig命令用法看手冊
# man ldconfig
8、導出頭文件
方法一:
復制所有新生成的頭文件(/usr/local/apache22/include目錄下的所有文件)至/usr/include目錄中(不推薦);
# cp /usr/local/apache22/include/* /usr/include/
方法二:創建鏈接
連接源目錄到目標文件
# ln -sv /usr/local/apache22/include /usr/include/httpd
連接源文件到目標目錄中
# ln -sv /usr/local/apache22/include/* /usr/include/
9、導出手冊
Linux會到特定目錄下查找用戶需要使用命令的手冊,系統是依據“/etc/man.config”配置文件中“MANPATH”指令指向的手冊路徑搜索的。要讓讓系統能夠搜索到apache手冊路徑,我們就需要編輯此配置文件。
在此文件新增MANPATH指令,并指向新的命令手冊路徑;
或者,在man命令執行時使用-M選項顯式指定手冊而查找路徑即可;
圖13 導出手冊
10、將Apache添加到啟動服務
(1)修改httpd的主配置文件,設置其Pid文件的路徑。
編輯/etc/httpd/httpd.conf,添加如下行即可:
PidFile "/var/run/httpd.pid"
(2)提供SysV服務腳本/etc/rc.d/init.d/httpd,內容如下:
#!/bin/bash # # httpd Startup script for the Apache HTTP Server # # chkconfig: - 85 15 # description: Apache is a World Wide Web server. It is used to serve \ # HTML files and CGI. # processname: httpd # config: /etc/httpd/conf/httpd.conf # config: /etc/sysconfig/httpd # pidfile: /var/run/httpd.pid # Source function library. . /etc/rc.d/init.d/functions if [ -f /etc/sysconfig/httpd ]; then . /etc/sysconfig/httpd fi # Start httpd in the C locale by default. HTTPD_LANG=${HTTPD_LANG-"C"} # This will prevent initlog from swallowing up a pass-phrase prompt if # mod_ssl needs a pass-phrase from the user. INITLOG_ARGS="" # Set HTTPD=/usr/sbin/httpd.worker in /etc/sysconfig/httpd to use a server # with the thread-based "worker" MPM; BE WARNED that some modules may not # work correctly with a thread-based MPM; notably PHP will refuse to start. # Path to the apachectl script, server binary, and short-form for messages. apachectl=/usr/local/apache22/bin/apachectl httpd=${HTTPD-/usr/local/apache22/bin/httpd} prog=httpd pidfile=${PIDFILE-/var/run/httpd22.pid} lockfile=${LOCKFILE-/var/lock/subsys/httpd22} RETVAL=0 start() { echo -n $"Starting $prog: " LANG=$HTTPD_LANG daemon --pidfile=${pidfile} $httpd $OPTIONS RETVAL=$? echo [ $RETVAL = 0 ] && touch ${lockfile} return $RETVAL } stop() { echo -n $"Stopping $prog: " killproc -p ${pidfile} -d 10 $httpd RETVAL=$? echo [ $RETVAL = 0 ] && rm -f ${lockfile} ${pidfile} } reload() { echo -n $"Reloading $prog: " if ! LANG=$HTTPD_LANG $httpd $OPTIONS -t >&/dev/null; then RETVAL=$? echo $"not reloading due to configuration syntax error" failure $"not reloading $httpd due to configuration syntax error" else killproc -p ${pidfile} $httpd -HUP RETVAL=$? fi echo } # See how we were called. case "$1" in start) start ;; stop) stop ;; status) status -p ${pidfile} $httpd RETVAL=$? ;; restart) stop start ;; condrestart) if [ -f ${pidfile} ] ; then stop start fi ;; reload) reload ;; graceful|help|configtest|fullstatus) $apachectl $@ RETVAL=$? ;; *) echo $"Usage: $prog {start|stop|restart|condrestart|reload|status|fullstatus|graceful|help|configtest}" exit 1 esac exit $RETVAL
將標記的地方改為你的apache路徑。
(3)而后為此腳本賦予執行權限:
# chmod +x /etc/rc.d/init.d/httpd
(4)加入服務列表:
# chkconfig --list # chkconfig --add httpd # chkconfig --list | grep httpd
這個時候輸出的結果:
httpd 0:off 1:off 2:off 3:off 4:off 5:off 6:off
此時0~6均為off,則說明httpd服務不會在系統啟動的時候自動啟動。我們輸入chkconfig httpd on后,再次檢查輸出結果變為:
httpd 0:off 1:off 2:on 3:on 4:on 5:on 6:off
這個時候2~5都是on,就表明會自動啟動了。
接下來就可以啟動服務進行測試了。
(三)編譯安裝Apache2.4
Apache2.4依賴apr/apr-util 1.4及以上版本,所以在CentOS6.7上安裝Apache2.4,要升級或安裝較新的apr/apr-util版本。安裝步驟參看前面。
1、編譯安裝apr
# ./configure --prefix=/usr/local/apr # make && make install
2、編譯安裝apr-util
# ./configure --prefix=/usr/local/apr-util --with=/usr/local/apr # make && make install
3、安裝需要的依賴包
前面安裝編譯環境不會自動安裝的開發組件,需要手工安裝下。
# yum install pcre-devel -y
4、編譯安裝Apache2.4
編譯安裝前,卸載已安裝的rpm安裝包。
# yum remove httpd
卸載以前編譯安裝的Apache2.2。
# rm -rf /usr/local/apache22 # rm -rf /usr/local/src/apache-2.2.31
路徑導出文件、庫導出文件、頭文件導出文件、手冊導出文件等可以刪除,也可以等編譯安裝完Apache2.4后直接修改。
開始編譯安裝Apache2.4
# groupadd -r apache # useradd -r -g apache apahce # ./configure --prefix=/usr/local/apache24 \ --enable-modules=most \ --enable-so \ --enable-ssl \ --enable-cgi \ --enable-rewrite \ --with-zlib \ --with-pcre \ --with-apr=/usr/local/apr \ --with-apr-util=/usr/local/apr-util/ \ --enable-mpms-shared=all \ --with-mpm=prefork # make && make install
5、安裝后配置
編譯安裝完畢后,導出二進制路徑、導出庫文件、導出頭文件、導出手冊和添加啟動服務等設置,與編譯安裝Apache2.2一樣,只是把對應的路徑改為Apache2.4的路徑。
原創文章,作者:Net17-卓格,如若轉載,請注明出處:http://www.www58058.com/16583
已置頂,寫的好認真,恭喜加入免檢家族
@stanley:謝謝老師的肯定,就是排版太痛苦了。建議下載安裝“css custom”插件,這樣可以自定義樣式。我博客文章都寫好了,復制過來結果全變樣了,不得不再次在wordpress里面重新排版,過程太痛苦了。
@Net17-卓格:你的文章寫的很好 我想保留 怎么轉載到我的里
@Net17-卓格:你的文章寫的很好 我想保留 怎么轉載到我的里
@Net 20-北京自由鳥:復制粘貼。