0 目錄
1 環境
本篇是在CentOS 6.8編譯安裝httpd2.4。
由於在 http://blog.csdn.net/wangzhenyu177/article/details/69808141 中已經說明編譯安裝步驟,本文不再贅述。主要是編譯httpd2.4過程中需要注意的。
2 編譯安裝步驟
編譯安裝需要先安裝開發包組”Development tools”和”Server Platform”和gcc。
httpd2.4源碼在 http://httpd.apache.org 下載。
2.1 apr、apr-util
httpd可在windows、linux、unix等多種平臺部署,而並不需要爲每種平臺都編寫不同的代碼實現。因爲有apr、apr-util。
apr:apache portable runtime,類似於虛擬機,爲apache提供運行環境。針對不同平臺有不同的apr。httpd通過不同的apr,就可運行於不同的平臺之上了。
CentOS 6安裝的apr和apr-util版本是1.4以前的:
[root@node1 ~]% rpm -q apr
apr-1.3.9-5.el6_2.x86_64
[root@node1 ~]% rpm -q apr-util
apr-util-1.3.9-3.el6_0.1.x86_64
而httpd2.4需要apr、apr-util在1.4以上版本(apr和apr-util版本號可不一致),所以要先編譯安裝這兩工具。
可在 http://apr.apache.org 下載。
由於apr-util依賴於apr,所以先編譯安裝apr,在解壓後的apr目錄下,執行:
[root@node1 apr-1.6.3]% ./configure --prefix=/usr/local/apr
……
[root@node1 apr-1.6.3]% make && make install
……
查看指定目錄有內容,一般就正常了:
[root@node1 apr-1.6.3]% ls /usr/local/apr/
bin build-1 include lib
apr-util類似,不過要指定依賴的apr的位置:
[root@node1 apr-util-1.6.1]% ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr
之後也是make,make install。但make時報了個錯
error: expat.h: No such file or directory
沒有找到expat.h頭文件。這個文件在expat-devel包,默認沒裝,裝上就ok了:
[root@node1 apr-util-1.6.1]% rpm -ql expat-devel
/usr/include/expat.h
……
[root@node1 apr-util-1.6.1]% ls /usr/local/apr-util/
bin include lib
2.2 安裝httpd2.4
2.2.1 configure常用選項
httpd的./configure的常用選項:
選項 | 意義 |
---|---|
–enable-so | 啓用動態裝載模塊功能 |
–enable-ssl | 啓用ssl功能。注意要先安裝 |
–enable-cgi | 啓用cgi功能 |
–enable-rewrite | 啓用URL重定向功能 |
–enable-modules=[all | most | ……] | 指定啓用哪些模塊。可指定具體的模塊名,也可使用all表示啓用所有模塊,most表示啓用大多數常用模塊。一般使用most即可 |
–enable-mpms-shared=[prefork | worker | event | all] | 指定編譯哪些MPM模塊1。可使用all表示全編譯 |
–with-mpm=[prefork | worker | event] | 如3種MPM模塊都編譯了,則通過此項指定默認使用哪種 |
–with-zlib | 依賴zlib庫用於頁面壓縮 |
–with-pcre | 依賴pcre庫用於解決正則表達式問題。 |
–with-apr=PATH | 指定依賴的apr路徑。注意必須指明路徑,否則編譯時會自動去找/usr下的apr,而不是編譯的高版本apr,下同 |
–with-apr-util=PATH | 指定依賴的apr-util路徑 |
–sysconfdir=PATH | 指定配置文件在安裝在哪個路徑。如不指定,配置文件就在程序安裝的目錄;如指定/etc目錄,注意起個別的名字,不要覆蓋httpd2.2的 |
可以看到enable類的一般用於指定啓用哪些功能,with類的一般表示依賴於哪些2。
2.2.2 常見錯誤
默認沒有安裝pcre-devel包。在./configure時報如下錯誤:
configure: error: pcre-config for libpcre not found
默認沒有安裝openssl-devel包。在./configure時報如下錯誤:
configure: error: mod_ssl has been requested but can not be built due to prerequisite failures
筆者最開始使用的apr-util是1.6以上的,make時報如下錯誤:
/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_GetErrorCode'
/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_ErrorString'
/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_ParserFree'
/usr/local/apr-util/lib/libaprutil-1.so: undefined reference to `XML_SetElementHandler'
/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_SetCharacterDataHandler'
apr-util使用低於1.6版本的,恢復正常。
據說在CentOS 7上使用apr-utl1.6以上的沒有問題。看來在CentOS 6編譯安裝,apr-util的版本既不能低於1.4,也不能高於1.6。
將上述錯誤一一修正後,編譯安裝完成。
該主機IP爲192.168.0.106,因爲是編譯安裝,所以沒有歡迎頁,但訪問時會顯示已啓動:
3 各目錄內容
編譯完成後所生成的各目錄:
[root@node1 httpd_24]% ls /usr/local/httpd_24/
bin build cgi-bin error htdocs icons include lib logs man manual modules
大部分目錄見名知意,其中:
build目錄存放的是編譯過程中產生的文件,其中文件config.nice記錄了configure時指定的選項:
[root@node1 httpd_24]% ls build/ config.nice config_vars.mk instdso.sh library.mk ltlib.mk mkdir.sh program.mk rules.mk special.mk [root@node1 httpd_24]% cat build/config.nice #! /bin/sh # # Created by configure "./configure" \ "--prefix=/usr/local/httpd_24" \ "--sysconfdir=/etc/httpd_24" \ "--enable-so" \ "--enable-ssl" \ "--enable-cgi" \ "--enable-rewrite" \ "--enable-modules=most" \ "--enable-mpms-shared=all" \ "--with-mpm=prefork" \ "--with-zlib" \ "--with-pcre" \ "--with-apr=/usr/local/apr" \ "--with-apr-util=/usr/local/apr-util" \ "$@"
- error,記錄了各錯誤頁面內容。404等錯誤頁面就放在這裏,報錯時顯示的就是這些頁面內容。
- htdocs,網頁文件放置位置。因爲是編譯安裝的,網頁文件沒有放在/var下3。
- man,man手冊
- manual,官方文檔
- modules,各模塊
- logs,日誌。httpd的pid文件也在此目錄
因爲編譯時,通過–sysconfdir選項指定了配置文件路徑爲/etc/httpd_24,否則配置文件也在/usr/local/httpd_24:
[root@node1 httpd_24]% ls /etc/httpd_24
extra httpd.conf magic mime.types original
除了主配置文件httpd.conf,其他配置文件都在extra目錄:
[root@node1 httpd_24]% ls /etc/httpd_24/extra/
httpd-autoindex.conf httpd-info.conf httpd-mpm.conf httpd-userdir.conf
httpd-dav.conf httpd-languages.conf httpd-multilang-errordoc.conf httpd-vhosts.conf
httpd-default.conf httpd-manual.conf httpd-ssl.conf proxy-html.conf
CentOS 7上的httpd的其他配置文件,是在/etc/conf.d/*和/etc/conf.modules.d/*。
4 服務腳本修改
編譯安裝的程序一般沒有服務腳本,不過httpd自帶有啓動腳本apachectl:
[root@node1 httpd_24]% ls /usr/local/httpd_24/bin
ab apu-1-config checkgid envvars fcgistarter htdbm htpasswd httxt2dbm rotatelogs
apachectl apxs dbmmanage envvars-std htcacheclean htdigest httpd logresolve
可以看到命令httpd也在此目錄。把該路徑添加至PATH就可以使用了,否則要使用絕對路徑。
不過即便把該路徑添加至PATH,仍不能使用service來控制,可以把系統上httpd2.2的服務腳本做些修改作爲2.4的服務腳本:
[root@node1 init.d]% cd /etc/rc.d/init.d/
[root@node1 init.d]% cp httpd httpd_24
修改httpd_24中的部分內容:
1、把其中讀取httpd服務腳本配置文件/etc/sysconfig/httpd的語句刪除。這是爲避免httpd2.2的服務腳本配置文件影響到httpd_24(雖然一般httpd的服務腳本配置文件也都是註釋信息):
if [ -f /etc/sysconfig/httpd ]; then
. /etc/sysconfig/httpd
fi
2、修改apachectl、httpd的文件路徑,修改pid文件、鎖文件:
apachectl=/usr/sbin/apachectl
httpd=${HTTPD-/usr/sbin/httpd}
prog=httpd
pidfile=${PIDFILE-/var/run/httpd/httpd.pid}
lockfile=${LOCKFILE-/var/lock/subsys/httpd}
修改爲:
apachectl=/usr/local/httpd_24/bin/apachectl
httpd=${HTTPD-/usr/local/httpd_24/bin/httpd}
prog=httpd
pidfile=${PIDFILE-/usr/local/httpd_24/logs/httpd.pid}
lockfile=${LOCKFILE-/var/lock/subsys/httpd_24}
apachectl和httpd改爲httpd2.4對應的路徑;
鎖文件改個名就行;
pid文件也可不修改,如果不修改則httpd2.2和httpd2.4不能同時啓動,因爲pid文件相同。這裏把pid文件也改了。編譯安裝的pid文件是/usr/local/httpd_24/logs/httpd.pid。
這樣就可以通過服務腳本httpd_24控制了:
[root@node1 ~]% service httpd_24 start
Starting httpd: [ OK ]
[root@node1 ~]% curl 192.168.0.106
<html><body><h1>It works!</h1></body></html>
加入至chkconfig,令chkconfig管理其開機是否啓動:
[root@node1 ~]% chkconfig --add httpd_24
[root@node1 ~]% chkconfig --list httpd_24
httpd_24 0:off 1:off 2:off 3:off 4:off 5:off 6:off
5 與httpd2.2部分特性對比
MPM在2.4已經是一個可動態裝載、卸載的模塊,prefork、worker、event模式的切換可通過配置文件調整;而httpd2.2中的MPM是靜態模塊,只能一同編譯,不能動態裝載卸載:
[root@node1 ~]% httpd -l
Compiled in modules:
core.c
prefork.c
http_core.c
mod_so.c
[root@node1 ~]% /usr/local/httpd_24/bin/httpd -l
Compiled in modules:
core.c
mod_so.c
http_core.c
可以看到2.2默認使用的是prefork4,並且是和httpd一併編譯的。而httpd2.4的編譯的模塊就不再有prefork。
(完)
- 在httpd2.4中,prefork、worker、event作爲模塊,可使用配置文件切換。2.2中則不能作爲動態模塊,只能和httpd一塊編譯。CentOS6默認是將3者都編譯了,對應不同的應用程序/usr/bin/httpd、/usr/bin/httpd.worker、/usr/bin/httpd.event。 ↩
- 還可使用disable、without,顯式地指定禁用哪些功能、不依賴哪些程序包等。 ↩
- 包括運行httpd的user、group也變成了daemon而不是apache。
編譯安裝配置和yum安裝的配置很多不一樣,可在配置文件看到,此處不贅述了 ↩ - 所以CentOS 6爲了用戶可使用prefork、worker、event三種模式,把三種都分別編譯了。默認使用prefork,另外兩模式對應的程序爲/usr/bin/httpd.worker和/usr/bin/httpd.event。服務腳本自動啓動的是prefork,這是在服務腳本配置文件/etc/sysconfig/httpd中定義的 ↩