源碼編譯安裝http2.4

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。

(完)


  1. 在httpd2.4中,prefork、worker、event作爲模塊,可使用配置文件切換。2.2中則不能作爲動態模塊,只能和httpd一塊編譯。CentOS6默認是將3者都編譯了,對應不同的應用程序/usr/bin/httpd、/usr/bin/httpd.worker、/usr/bin/httpd.event。
  2. 還可使用disable、without,顯式地指定禁用哪些功能、不依賴哪些程序包等。
  3. 包括運行httpd的user、group也變成了daemon而不是apache。
    編譯安裝配置和yum安裝的配置很多不一樣,可在配置文件看到,此處不贅述了
  4. 所以CentOS 6爲了用戶可使用prefork、worker、event三種模式,把三種都分別編譯了。默認使用prefork,另外兩模式對應的程序爲/usr/bin/httpd.worker和/usr/bin/httpd.event。服務腳本自動啓動的是prefork,這是在服務腳本配置文件/etc/sysconfig/httpd中定義的
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章