目錄
一、Apache的工作模式
1、簡介
2、比較
二、CentOS6.x上安裝Apache2.2
(一)rpm安裝apache
(二)編譯安裝apache
1、安裝編譯環境
2、下載解壓依賴包
3、安裝apache
4、測試apache
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平臺上的默認(缺省)MPM,使用多個子進程,每個子進程只有一個線程。每個進程在某個確定的時間只能維持一個連接,效率高,但內存佔用量比較大。
這個多路處理模塊(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
(3)關閉防火牆
apache啓動完畢後,我們來查看下是否可訪問。
還可以嘗試用瀏覽器訪問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 -j 4 && make install
5、安裝後配置
編譯安裝完畢後,導出二進制路徑、導出庫文件、導出頭文件、導出手冊和添加啓動服務等設置,與編譯安裝Apache2.2一樣,只是把對應的路徑改爲Apache2.4的路徑。
卓格 完成於家
2016年5月29日 初稿
2016年6月9日 20:55:15 更新。圖片添加註釋說明。