一、HTTPD特性
(1)高度模塊化:core(核心) + modules(模塊) = apache
(2)動態模塊加載DSO機制: Dynamic Shared Object(動態共享對象)
(3)MPM:Multipath Processing Modules(多路處理模塊)多種不同的IO處理模型
Aapche的三種工作模型:
prefork:2.2版本默認的模型,多進程模型,每個進程響應一個請求;進程之間彼此獨立,每個子進程只有一個線程,最穩定。缺點:內存消耗較大
一個主進程:負責生成n個子進程,子進程也稱為工作進程,每個子進程處理一個用戶請求;即便沒有用戶請求,也會預先生成多個空閑進程,隨時等待請求到達;最大不會超過1024個;主進程監聽套接字,在請求到來時fork出一個子進程去處理該請求。
worker:多線程模型,每個線程響應一個請求;
一個主進程:生成多個子進程,每個子進程負責生個多個線程,每個線程響應一個請求;
m進程,n線程:m*n
優點:線程之間內存共享,系統內存利用率較高,內存消耗比prefork小的多,適用於高流量的http服務器。
缺點:一個進程崩潰整個進程,整個進程里面的線程全部一起掛掉。
event:事件驅動模型,每個線程響應n個請求;
一個主進程:生成m個子進程,每個進程直接n個請求;m*n
在非常繁忙的服務器下,以上兩種模型都不再適用,在work基礎上,event把服務進程從連接中分離出來。服務器處理速度很快,同時具有非常高的點擊率時,可用的線程數量就是關鍵的資源限制,此時Event MPM方式是最有效的
在2.2版本的httpd中,三種模式的切換需要重新編譯,2.4版本后,無需編譯,直接修改配置導入module即可。
二、Centos 7.4編譯安裝部署Apache 2.2.31
①下載安裝包 [root@longlinux ]# cd /usr/local/src //切換到下載目錄 [root@longlinux src]# wget http://mirrors.cnnic.cn/apache/httpd/httpd-2.2.31.tar.gz ②解壓 [root@longlinux src]# tar -jxvf httpd-2.2.31.tar.bz2 //解壓 ③配置編譯參數 [root@longlinux src]# cd httpd-2.2.31 [root@longlinux httpd-2.2.31]# ./configure \ --prefix=/usr/local/apche2 \ //指定安裝位置 --with-included-apr \ //httpd依賴的包apr,可支持httpd跨平台運作 --enable-so \ //表示啟用DSO --enable-deflate=shared \ //表示動態共享的方式編譯deflate,后面參數同理 --enable-expires=shared \ --enable-rewrite=shared \ --with-pcre //正則相關的庫 配置時出現了如下錯誤:error: mod_deflate has been requested but can not be built due to prerequisite failures 由於缺少了zlib-devel庫,需要安裝: [root@longlinux httpd-2.2.31]# yum install -y zlib-devel Tips: DSO是Dynamic Shared Objects(動態共享目標)的縮寫,它提供了一種在運行時將特殊格式的代碼在程序運行需要時,將需要的部分從外存調入內存執行的方法。Apache 支持動態共享模塊,也支持靜態模塊,靜態的話,會把需要的目標直接編譯進apache的可執行文件中,相比較動態,雖然省去了加載共享模塊的步驟,但是也加大了二進制執行文件的空間,變得臃腫。 ④編譯 為了避免編譯的時候出錯,需事先安裝好一些庫文件 [root@longlinux httpd-2.2.31]# yum install pcre pcre-devel apr apr-devel gcc gcc++ [root@longlinux httpd-2.2.31]# make ⑤安裝 [root@longlinux httpd-2.2.31]# make install ⑥啟動服務
[root@longlinux httpd-2.2.31]# /usr/local/apche2/bin/apachectl -t //檢查語法配置文件的語法
[root@longlinux httpd-2.2.31]# /usr/local/apche2/bin/apachectl start //啟動httpd服務
啟動的時候出現了如下錯誤,需要修改配置文件 /usr/local/apache2/conf/httpd.conf
[root@longlinux httpd-2.2.31]# vim /usr/local/apache2/conf/httpd.conf
,搜索‘#ServerName’ ,添加ServerName localhost:80
[root@longlinux httpd-2.2.31]# /usr/local/apache2/bin/apachectl restart //再重新啟動apche即可
/usr/local/apache2/bin/apachectl -M 查看動態模塊
/usr/local/apache2/bin/apachectl -l 查看靜態模塊
/usr/local/apache2/bin/apachectl -t 查看配置文件/usr/local/apache2/conf/httpd.conf是否存在錯誤語法
三、Centos7.4安裝部署Apache 2.4.33
(1)Yum方式安裝
[root@localhost ~]# yum install -y httpd [root@localhost ~]# systemctl enable httpd [root@localhost ~]# systemctl start httpd
(2)源碼方式安裝
①下載httpd-2.4.33源碼包
[root@localhost ~]# wget http://mirror.bit.edu.cn/apache/httpd/httpd-2.4.33.tar.gz [root@localhost ~]# tar -zxvf httpd-2.4.33.tar.gz
②編譯安裝
[root@localhost httpd-2.4.33]# ./configure --prefix=/usr/local/apache-2.4.33 \ #指定安裝位置 --with-included-apr \ #httpd依賴的包apr,可支持httpd跨平台運作 --enable-so \ #啟用DSO --enable-deflate=shared \ #動態共享的方式編譯deflate,后面的參數同理 --enable-mods-shared=most \ --enable-rewrite=shared \
--enable-mpms-shared \ #2.4版本使用動態更換mpm模式必須使用該參數 --with-pcre #正則相關的庫 [root@localhost httpd-2.4.33]# make && make install
③編譯過程報錯解決
apache 2.4版本后,需要提前安裝apr和apr-util的包以解決依賴關系,以及解決正則庫依賴,不然會有以下報錯:
錯誤1:error: mod_deflate has been requested but can not be built due to prerequisite failures 解決:yum install -y zlib-devel 錯誤2:configure: error: Bundled APR requested but not found at ./srclib/. Download and unpack the corresponding apr and apr-util packages to ./srclib/. 解決: [root@localhost ~]# wget http://archive.apache.org/dist/apr/apr-util-1.5.1.tar.gz [root@localhost ~]# wget http://archive.apache.org/dist/apr/apr-1.5.1.tar.gz [root@localhost ~]# cp -rf apr-util-1.5.1 httpd-2.4.33/srclib/apr-util [root@localhost ~]# cp -rf apr-1.1.1 httpd-2.4.33/srclib/apr 錯誤3:/usr/local/apr-util/lib/libaprutil-1.so: undefined reference to `XML_GetErrorCode' /usr/local/apr-util/lib/libaprutil-1.so: undefined reference to `XML_SetEntityDeclHandler' /usr/local/apr-util/lib/libaprutil-1.so: undefined reference to `XML_ParserCreate' /usr/local/apr-util/lib/libaprutil-1.so: undefined reference to `XML_SetCharacterDataHandler' /usr/local/apr-util/lib/libaprutil-1.so: undefined reference to `XML_ParserFree' /usr/local/apr-util/lib/libaprutil-1.so: undefined reference to `XML_SetUserData' /usr/local/apr-util/lib/libaprutil-1.so: undefined reference to `XML_StopParser' /usr/local/apr-util/lib/libaprutil-1.so: undefined reference to `XML_Parse' /usr/local/apr-util/lib/libaprutil-1.so: undefined reference to `XML_ErrorString' /usr/local/apr-util/lib/libaprutil-1.so: undefined reference to `XML_SetElementHandler' collect2: error: ld returned 1 exit status make[2]: *** [htpasswd] Error 1 make[2]: Leaving directory `/usr/local/httpd-2.4.26/support' make[1]: *** [all-recursive] Error 1 make[1]: Leaving directory `/usr/local/httpd-2.4.26/support' make: *** [all-recursive] Error 1 解決:更換apr,apr-util的版本,前期用了1.6版本報錯,更換了1.5版本后可正常編譯
④Apache啟動
[root@localhost httpd-2.4.33]# /usr/local/apache-2.4.33/bin/apachectl -t #apache配置文件語法檢測 Syntax OK
[root@localhost httpd-2.4.33]# /usr/local/apache-2.4.33/bin/apachectl start #apache啟動
[root@localhost httpd-2.4.33]# ps -ef |grep httpd #查看apache進程 root 32457 1 0 12:34 ? 00:00:00 /usr/local/apache-2.4.33/bin/httpd -k start daemon 32458 32457 0 12:34 ? 00:00:00 /usr/local/apache-2.4.33/bin/httpd -k start daemon 32459 32457 0 12:34 ? 00:00:00 /usr/local/apache-2.4.33/bin/httpd -k start daemon 32460 32457 0 12:34 ? 00:00:00 /usr/local/apache-2.4.33/bin/httpd -k start root 32567 34939 0 12:36 pts/1 00:00:00 grep --color=auto httpd root 34201 34186 0 03:35 ? 00:00:03 httpd -DFOREGROUND bin 34242 34201 0 03:35 ? 00:00:00 httpd -DFOREGROUND bin 34243 34201 0 03:35 ? 00:00:00 httpd -DFOREGROUND bin 34244 34201 0 03:35 ? 00:00:00 httpd -DFOREGROUND
[root@localhost httpd-2.4.33]# netstat -tulnp |grep 80 #查看apache是否監聽80端口 tcp6 0 0 :::80 :::* LISTEN 32457/httpd
[root@localhost httpd-2.4.33]# curl localhost #訪問apache <html><body><h1>It works!</h1></body></html>