在CentOS 7.x系統上編譯安裝httpd2.2版本

一、實驗環境說明

(1) Selinux關閉;
(2) Firewalld啓用,默認策略;
(3) 192.168.56.221這個單機環境;
(4) CentOS 7.3版本,X86_64;

二、下載相關軟件包說明

(1) apr軟件包版本 apr-1.5.2
軟件包下載鏈接:http://archive.apache.org/dist/apr/
爲了和apr-util保持一致,我也選了一個1.5.2的版本。

(2) apr-util軟件包版本 apr-util-1.5.2
軟件包下載鏈接:http://archive.apache.org/dist/apr/
進過反覆實驗和網上文檔求證,這裏因爲CentOS 7.x系統原因,建議使用apr-util下於或等於1.5.2版本以下的,否則編譯httpd的時候會包莫名的錯誤(如果要解決,可能修改源碼類),只有httpd2.4版本纔對apr有特殊要求,官網有給出,詳情請見下面章節的說明。

(3) httpd軟件包版本 httpd-2.2.34
軟件包下載鏈接:http://archive.apache.org/dist/httpd/
httpd的包,我們無論下載是2.2.x多少都行,這裏我實驗是下載的2.2版本中最新的。

三、編譯源碼包前注意事項

1、編譯安裝前,先查看官網介紹的編譯安裝以及注意事項;
httpd2.2編譯安裝,官方介紹鏈接地址:
http://httpd.apache.org/docs/2.2/install.html
2、其次,在編譯某個應用程序之前,先看一下應用程序中提供的文檔或說明
README或README.mk以及其他類似字眼;
INSTALL
3、httpd2.2以及apr較舊版本,源碼包中並不包含製作rpm包的spec文件,如果不懂得如何寫製作rpm包用到的spec文件時,建議直接源碼包安裝。

4、在編譯安裝apr、apr-util以及httpd之前,建議先通過./configure --help來查閱相關編譯選項詳情,建議瞭解大部分的之後再來編譯(出錯概念減少了,瞭解編譯選項後)

四、編譯安裝

4.1、httpd編譯安裝依賴情況

(1) 磁盤空間
安裝的時候,需要50MB大小的臨時空間,安裝後,大約佔用空間10MB,不過根據用戶選擇的編譯選項不同,加入的模塊不同,所以
實際佔用空間,可能會在10MB左右變動。
(2) ANSI-C編譯與編譯系統
ANSI-C編譯器。以及make命令
(3) 精準計時
web服務要保證你服務器時間精準。所以建議自己配置時間同步的策略。比如ntpdate等
(4) Perl 5
apxs以及dbmmanage需要Perl支持,
Perl5, 5.003或者以上版本
(5) apr/apr=util >-1.4
apr和apr-util需要1.4以及以上版本。(我們上面提到用apr-util-1.5.2以上版本會遇到問題,那種問題是可以解決的。假設安裝httpd2.2的環境apr版本小於1.4,比如1.2版本,正常是直接編譯錯誤)

4.2、安裝編譯所需基本組件和庫文件

在linux的bash接口中執行下面的命令。前提是網絡正常,而且配置的yum客戶端配置文件指向的yum倉庫能夠正常訪問。

yum -y install gcc gcc-c++ autoconf make libtool openssl-devel zlib-devel pcre-devel expat-devel openldap-devel db4-devel
安裝過程省略。

4.3、編譯安裝apr

1、準備說明
上傳軟件包到一個指定的目錄,我這裏指定的是/opt/soft。如果不存在,先創建,然後通過相關手段上傳,ftp或者其他方式等。上傳過程省略。軟件包信息如下:

[root@localhost soft]# pwd
/opt/soft
[root@localhost soft]# ls -l /opt/soft/
total 14004
-rw-r--r-- 1 root root  826885 Dec  8 02:03 apr-1.5.2.tar.bz2
-rw-r--r-- 1 root root  693258 Dec  7 21:39 apr-util-1.5.2.tar.bz2
-rw-r--r-- 1 root root 5779739 Dec  7 17:19 httpd-2.2.34.tar.bz2
-rw-r--r-- 1 root root 7031632 Nov 16 09:55 httpd-2.4.37.tar.bz2
[root@localhost soft]# file *.bz2
apr-1.5.2.tar.bz2:      bzip2 compressed data, block size = 900k
apr-util-1.5.2.tar.bz2: bzip2 compressed data, block size = 900k
httpd-2.2.34.tar.bz2:   bzip2 compressed data, block size = 900k
httpd-2.4.37.tar.bz2:   bzip2 compressed data, block size = 900k

確保bzip2工具有安裝,如果沒有安裝,先安裝,因爲這些壓縮包都是使用bzip2工具壓縮的。
創建編譯安裝根目錄:

[root@localhost soft]# mkdir -p /data/application
[root@localhost soft]# ls -l /data/application/
total 0
[root@localhost soft]# 

2、 開始編譯安裝apr

解壓:
[root@localhost soft]# tar -xf apr-1.5.2.tar.bz2 
[root@localhost soft]# ls
apr-1.5.2  apr-1.5.2.tar.bz2  apr-util-1.5.2.tar.bz2  httpd-2.2.34.tar.bz2  httpd-2.4.37.tar.bz2

進入解壓後目錄:
[root@localhost soft]# cd apr-1.5.2
[root@localhost apr-1.5.2]# ./configure --help
#幫助信息省略。
[root@localhost apr-1.5.2]# ls -l apr.spec README README.cmake 
-rw-r--r-- 1 1000 1000 2543 Apr 25  2015 apr.spec
-rw-r--r-- 1 1000 1000 5633 Mar  2  2010 README
-rw-r--r-- 1 1000 1000 4505 Jan 20  2014 README.cmake
#較新版的apr的包,裏面有提供製作rpm包用到的spec文件,可以參考官方文檔進行查看如何根據官方提供軟件
包的spec文件來製作(之前我有一篇博文也有粗略介紹過,有興趣可以去檢索一下)。如果官方沒有提供spec文
件,相信自己編寫spec文件來製作rpm包,對於很多人來說,門檻過高,所以我們使用編譯安裝。在編譯apr
之前,我們可以先看看其提供的README文檔,如果有注意事項以及安裝簡要說明,你要特別留意,養成良好的
習慣是,在通過源碼包安裝軟件前,要先閱讀其自身提供的相關說明文檔。

最終我的configure腳本爲:
#這一步可以做一下,腳本中有一行代碼寫的略有問題,可能不同環境略有不同體現,不影響大體安裝
sed -i '/$RM "$cfgfile"/s/^/#/' configure   
./configure --prefix=/data/application/apr-1.5.2
上面步驟沒有報錯的化,直接下面的步驟:
make
make install
安裝過程,我們省略,安裝後爲:
[root@localhost apr-1.5.2]# ls -l /data/application/
total 0
drwxr-xr-x 6 root root 58 Dec  8 20:54 apr-1.5.2
爲了多版本並存以及方便,我們對/data/application/apr-1.5.2版本做一個軟鏈接
ln -sf /data/application/apr-1.5.2 /data/application/apr
執行創建軟鏈接後:
[root@localhost apr-1.5.2]# ls -l /data/application/
total 0
lrwxrwxrwx 1 root root 27 Dec  8 20:55 apr -> /data/application/apr-1.5.2
drwxr-xr-x 6 root root 58 Dec  8 20:54 apr-1.5.2

#apr就編譯安裝完成了。

4.4、編譯安裝apr-util

下面我們的安裝過程省略掉大部分說明語句。apr-util編譯安裝需要apr的二進制程序文件apr-1-config,我們可以直接指向這個文件,也可以直接指向apr編譯安裝的根目錄。configure腳本以及簡要步驟爲:

cd /opt/soft/
tar -xf apr-util-1.5.2.tar.bz2
cd apr-util-1.5.2
./configure --prefix=/data/application/apr-util-1.5.2 --with-apr=/data/application/apr
make
make install
ln -sf /data/application/apr-util-1.5.2 /data/application/apr-util

#查看安裝後結果:
[root@localhost apr-util-1.5.2]# ls -l /data/application/
total 0
lrwxrwxrwx 1 root root 27 Dec  8 20:55 apr -> /data/application/apr-1.5.2
drwxr-xr-x 6 root root 58 Dec  8 20:54 apr-1.5.2
lrwxrwxrwx 1 root root 32 Dec  8 21:00 apr-util -> /data/application/apr-util-1.5.2
drwxr-xr-x 5 root root 43 Dec  8 20:59 apr-util-1.5.2

apr-util的編譯安裝完成了。

4.5、編譯安裝httpd(prefork模型)

#要確保apr以及apr-util軟件包符合之前的要求。httpd2.2的要求是apr和apr-util 不能低於1.4版本(可能略有不精確),建議編譯安裝httpd2.2的時候,使用apr和apr-util版本在1.4.x 到1.5.2之間,實際上官方只有版本不小於1.4的限制,不過我實際測試過程中,不同的編譯選項會有不同的效果,網上也有很多版本出現過,經過測試apr-util版本不能使用大於apr-util-1.5.3以及以上版本, 在centos 7上編譯使用httpd2.2,所以apr版本也跟着降低成apr-1.5.2最好(不過後邊參照官方的SRPM包中的spec文件,發現apr和apr-util在1.5.2版本以上也沒有問題,不過apr的1.6版本算是比較新的了)。

解壓並進入目錄:

[root@localhost apr-util-1.5.2]# cd /opt/soft/
[root@localhost soft]# tar -xf httpd-2.2.34.tar.bz2 
[root@localhost soft]# cd httpd-2.2.34
建議對以下的文件進行簡單的查閱(如果有需要,可以看看自帶的spec文件,可以製作rpm包的)
[root@localhost httpd-2.2.34]# ls -l README* INSTALL VERSIONING NOTICE CHANGES ABOUT_APACHE LICENSE httpd.spec
-rw-r--r-- 1 1001 1001  14882 Nov 22  2004 ABOUT_APACHE
-rw-r--r-- 1 1001 1001 147887 Jun 29  2017 CHANGES
-rw-r--r-- 1 1001 1001  12053 Jul  7  2017 httpd.spec
-rw-r--r-- 1 1001 1001   5129 Jan 10  2017 INSTALL
-rw-r--r-- 1 1001 1001  28690 Jan 19  2008 LICENSE
-rw-r--r-- 1 1001 1001    828 Jan  3  2017 NOTICE
-rw-r--r-- 1 1001 1001   5954 Jan 10  2007 README
-rw-r--r-- 1 1001 1001   4178 Aug 28  2014 README.platforms
-rw-r--r-- 1 1001 1001   2553 Dec 21  2010 README-win32.txt
-rw-r--r-- 1 1001 1001   8183 Oct 18  2005 VERSIONING

精簡版的configure編譯參數:(本次博文以這個爲準)

cd httpd-2.2.34
./configure \
--prefix=/data/application/httpd-2.2.34 \
--sysconfdir=/data/application/httpd-2.2.34/etc \
--enable-modules=all \
--enable-mods-shared=all \
--enable-deflate \
--enable-expires \
--enable-headers \
--enable-ssl \
--enable-cgi \
--enable-cgid \
--enable-rewrite \
--enable-so \
--with-apr=/data/application/apr \
--with-apr-util=/data/application/apr-util \
--with-mpm=prefork

#上面沒有問題的話,執行:
make
make install
ln -sf /data/application/httpd-2.2.34 /data/application/httpd

繁雜版的configure的編譯參數:(該編譯選項我也反覆測試過)

cd httpd-2.2.34
./configure \
--prefix=/data/application/httpd-2.2.34 \
--bindir=/data/application/httpd-2.2.34/bin \
--sbindir=/data/application/httpd-2.2.34/sbin \
--libexecdir=/data/application/httpd-2.2.34/libexec \
--sysconfdir=/data/application/httpd-2.2.34/etc \
--sharedstatedir=/data/application/httpd-2.2.34/com \
--localstatedir=/data/application/httpd-2.2.34/var \
--libdir=/data/application/httpd-2.2.34/lib \
--includedir=/data/application/httpd-2.2.34/include \
--oldincludedir=/usr/include \
--datarootdir=/data/application/httpd-2.2.34/share \
--datadir=/data/application/httpd-2.2.34/share \
--infodir=/data/application/httpd-2.2.34/share/info \
--localedir=/data/application/httpd-2.2.34/share/locale \
--mandir=/data/application/httpd-2.2.34/share/man \
--docdir=/data/application/httpd-2.2.34/share/doc/PACKAGE \
--htmldir=/data/application/httpd-2.2.34/share/doc/PACKAGE/html \
--dvidir=/data/application/httpd-2.2.34/share/doc/PACKAGE/dvi \
--pdfdir=/data/application/httpd-2.2.34/share/doc/PACKAGE/pdf \
--psdir=/data/application/httpd-2.2.34/share/doc/PACKAGE/psdir \
--enable-modules=all \
--enable-mods-shared=all \
--enable-file-cache \
--enable-cache \
--enable-disk-cache \
--enable-mem-cache \
--enable-deflate \
--enable-mime-magic \
--enable-expires \
--enable-headers \
--enable-usertrack \
--enable-proxy \
--enable-proxy-connect \
--enable-proxy-http \
--enable-proxy-scgi \
--enable-proxy-balancer \
--enable-ssl \
--enable-http \
--enable-info \
--enable-cgi \
--enable-cgid \
--enable-rewrite \
--enable-so \
--with-apr=/data/application/apr \
--with-apr-util=/data/application/apr-util \
--with-mpm=prefork

make
make install
ln -sf /data/application/httpd-2.2.34 /data/application/httpd

httpd2.2安裝後目錄說明:

[root@localhost httpd-2.2.34]# cd /data/application/httpd
[root@localhost httpd]# ls -l /data/application/httpd/
total 36
drwxr-xr-x  2 root root  243 Dec  8 21:13 bin
drwxr-xr-x  2 root root  167 Dec  8 21:13 build
drwxr-xr-x  2 root root   38 Dec  8 21:13 cgi-bin
drwxr-xr-x  3 root root 4096 Dec  8 21:13 error
drwxr-xr-x  4 root root   84 Dec  8 21:13 etc
drwxr-xr-x  2 root root   24 Dec  8 21:13 htdocs
drwxr-xr-x  3 root root 8192 Dec  8 21:13 icons
drwxr-xr-x  2 root root 4096 Dec  8 21:13 include
drwxr-xr-x  2 root root    6 Dec  8 21:13 logs
drwxr-xr-x  4 root root   30 Dec  8 21:13 man
drwxr-xr-x 14 root root 8192 Dec  8 21:13 manual
drwxr-xr-x  2 root root 4096 Dec  8 21:13 modules

主目錄說明:
drwxr-xr-x  2 root root  243 Dec  8 21:13 bin   #普通用戶執行文件目錄(我設定的編譯選項,一些工具存放在這個目錄了)
drwxr-xr-x  2 root root  167 Dec  8 21:13 build #構建的時候,一些文件目錄
drwxr-xr-x  2 root root   38 Dec  8 21:13 cgi-bin  #cgi腳本程序目錄
drwxr-xr-x  3 root root 4096 Dec  8 21:13 error #安裝好後的一些固定文件目錄,不可刪,會影響httpd工作
drwxr-xr-x  4 root root   84 Dec  8 21:13 etc #配置文件目錄
drwxr-xr-x  2 root root   24 Dec  8 21:13 htdocs #主頁文件目錄
drwxr-xr-x  3 root root 8192 Dec  8 21:13 icons #一些圖片的目錄
drwxr-xr-x  2 root root 4096 Dec  8 21:13 include  #一些頭文件目錄
drwxr-xr-x  2 root root    6 Dec  8 21:13 logs #日誌文件目錄
drwxr-xr-x  4 root root   30 Dec  8 21:13 man #man手冊目錄
drwxr-xr-x 14 root root 8192 Dec  8 21:13 manual #官方的離線手冊目錄(可以配置指向這個目錄,然後瀏覽器一般開發,一般查看幫助文檔,對於離線環境很有用)
drwxr-xr-x  2 root root 4096 Dec  8 21:13 modules #模塊文件目錄

#配置環境變量,以及man 手冊指向
echo 'export PATH=$PATH:/data/application/httpd/bin' > /etc/profile.d/httpd22.sh
source /etc/profile

echo 'MANDATORY_MANPATH /data/application/httpd/man' >> /etc/man_db.conf
#注意centos 7和centos 6不同,centos6是:
echo 'MANPATH /data/application/httpd/man' >>/etc/man.config

如果沒有配置指向我們自定義的安裝路徑的man,我們可以通過man的-M指定查詢,例如:
man -M /data/application/httpd/man httpd
man -M /data/application/httpd/man ab
等等。

查看配置後的信息:
[root@localhost ~]# echo 'export PATH=$PATH:/data/application/httpd/bin' > /etc/profile.d/httpd22.sh
[root@localhost ~]# cat /etc/profile.d/httpd22.sh
export PATH=$PATH:/data/application/httpd/bin
[root@localhost ~]# source /etc/profile
[root@localhost ~]# httpd -v
Server version: Apache/2.2.34 (Unix)
Server built:   Dec  8 2018 21:12:33
[root@localhost ~]# man -M /data/application/httpd/man httpd
[root@localhost ~]# echo $?
0
[root@localhost ~]# echo 'MANPATH /data/application/httpd/man' >>/etc/man.config
[root@localhost ~]# tail -n 1 /etc/man.config
MANPATH /data/application/httpd/man
[root@localhost ~]# 

4.6、非完全編譯安裝httpd(worker模型)

由於httpd2.2,prefork,worker以及event只能以靜態編譯的方式編譯進來,通過–with-mpm=xxx,所以一旦選定,我們無法動態更改,於是會有時候爲了切換方便,我們也會把worker以及event編譯進來,默認不指定–with-mpm,表示是prefork。關於prefork、worker、event這三者的是什麼東西以及差異點,不在我們本次博文的範圍內。(是進程的io模型,這三個,我將在其他博文會有專門地方介紹)。

那麼,我們之前已經編譯過來prefork,那麼我們現在重新指定configure時–with-mpm時候的值,然後make一下。不執行make install,我們手動拷貝編譯後的httpd文件到之前編譯根目錄的bin目錄(有時候是sbin,是具體編譯指向而定)下,我們把其名字改爲httpd.worker (關於這一點做法,我是借鑑的centos 6.x上yum安裝的httpd可以自動切換模型的思路)

[root@localhost ~]# cd /opt/soft/httpd-2.2.34
[root@localhost httpd-2.2.34]# make clean
省略......
./configure \
--prefix=/data/application/httpd-2.2.34 \
--sysconfdir=/data/application/httpd-2.2.34/etc \
--enable-modules=all \
--enable-mods-shared=all \
--enable-deflate \
--enable-expires \
--enable-headers \
--enable-ssl \
--enable-cgi \
--enable-cgid \
--enable-rewrite \
--enable-so \
--with-apr=/data/application/apr \
--with-apr-util=/data/application/apr-util \
--with-mpm=worker

make
#到這步,我們不能再執行安裝了,因爲默認編譯出來的二進制程序文件都叫httpd,我們爲了保留prefork和worker,所以我們只需要複製通過指定爲worker時候的程序文件httpd重命名爲httpd.worker.
[root@localhost httpd-2.2.34]# ls -l httpd
-rwxr-xr-x 1 root root 1704312 Dec  8 21:45 httpd
[root@localhost httpd-2.2.34]# pwd
/opt/soft/httpd-2.2.34
[root@localhost httpd-2.2.34]# ./httpd -l
Compiled in modules:
  core.c
  worker.c
  http_core.c
  mod_so.c
[root@localhost httpd-2.2.34]# cp -a httpd /data/application/httpd/bin/httpd.worker
[root@localhost httpd-2.2.34]# /data/application/httpd/bin/httpd.worker -l
Compiled in modules:
  core.c
  worker.c
  http_core.c
  mod_so.c
  httpd程序的-l選項可以查看(靜態編譯)的模塊,上面依次是核心功能模塊,mpm的worker的模塊,http的核心
  模塊,dso模塊(支持在啓動或重新啓動時將可執行代碼和模塊加載到服務器中)。

4.7、非完全編譯安裝httpd(event模型,實驗模型)

說明:在httpd2.2中,event模型只是實驗模型,所以CentOS 6通過rpm包(yum直接安裝)的httpd2.2版本,默認不能切換到event,所以如果我們實驗,我們可以測試一下。但是,對於生產環境,想要使用httpd的event模型,建議升級到httpd2.4。而且httpd2.4對三種模塊可以通過動態模塊加載的方式進行隨機切換。實驗測試,和上面類似:

[root@localhost httpd-2.2.34]# cd /opt/soft/httpd-2.2.34
[root@localhost httpd-2.2.34]# make clean

./configure \
--prefix=/data/application/httpd-2.2.34 \
--sysconfdir=/data/application/httpd-2.2.34/etc \
--enable-modules=all \
--enable-mods-shared=all \
--enable-deflate \
--enable-expires \
--enable-headers \
--enable-ssl \
--enable-cgi \
--enable-cgid \
--enable-rewrite \
--enable-so \
--with-apr=/data/application/apr \
--with-apr-util=/data/application/apr-util \
--with-mpm=event

給出的提示:
============================================================
    WARNING: THE 'event' MPM IS EXPERIMENTAL  #mpm的event是實驗階段的
============================================================
 The selected MPM might not be fully functional!  #非完整功能

 Development of this MPM is not complete. Do not use this
 MPM unless you are a programmer willing to help fix it.

 If you are looking for a stable server, you should not use
 the 'event' MPM until it is moved out of experimental.
============================================================

make
過程略......
[root@localhost httpd-2.2.34]# ls httpd
httpd
[root@localhost httpd-2.2.34]# pwd
/opt/soft/httpd-2.2.34
[root@localhost httpd-2.2.34]# ./httpd -l
Compiled in modules:
  core.c
  event.c
  http_core.c
  mod_so.c
[root@localhost httpd-2.2.34]# cp -a httpd /data/application/httpd/bin/httpd.event
[root@localhost httpd-2.2.34]# /data/application/httpd/bin/httpd.event -l
Compiled in modules:
  core.c
  event.c
  http_core.c
  mod_so.c

#現在我們的httpd的三個模型程序都安裝的,只需要使用的時候切換了,我們這裏就不演示切換和使用了,
具體操作和介紹說明,會在其他博文給出。
[root@localhost httpd-2.2.34]# ls -l /data/application/httpd/bin/http*
-rwxr-xr-x 1 root root 1665168 Dec  8 21:13 /data/application/httpd/bin/httpd
-rwxr-xr-x 1 root root 1710416 Dec  8 21:54 /data/application/httpd/bin/httpd.event
-rwxr-xr-x 1 root root 1704312 Dec  8 21:45 /data/application/httpd/bin/httpd.worker

[root@localhost ~]# httpd -M|grep 'mpm'
httpd: Could not reliably determine the server's fully qualified domain name, using localhost.localdomain for ServerName
Syntax OK
 mpm_prefork_module (static)

[root@localhost ~]# httpd.worker -M|grep 'mpm'
httpd.worker: Could not reliably determine the server's fully qualified domain name, using localhost.localdomain for ServerName
Syntax OK
 mpm_worker_module (static)
 
[root@localhost ~]# httpd.event -M|grep 'mpm'
httpd.event: Could not reliably determine the server's fully qualified domain name, using localhost.localdomain for ServerName
Syntax OK
 mpm_event_module (static)

五、學習官方舊版srpm包中的spec文件的編譯選項

5.1、獨立環境說明

系統髮型版:
CentOS 7.3 x86_64
源碼包:
apr-1.6.5.tar.bz2
apr-util-1.6.1.tar.bz2
httpd-2.2.34.tar.bz2

SRPM包:(源代碼格式的rpm包)
apr-1.2.8-1.src.rpm
apr-util-1.2.8-1.src.rpm
httpd-2.2.3-1.src.rpm

#查看:
[root@localhost ~]# ls -l /opt/soft/
total 6904
-rw-r--r-- 1 root root  855393 Dec  1 14:05 apr-1.6.5.tar.bz2
-rw-r--r-- 1 root root  428595 Dec  1 14:05 apr-util-1.6.1.tar.bz2
-rw-r--r-- 1 root root 5779739 Dec  7 17:19 httpd-2.2.34.tar.bz2
drwxr-xr-x 2 root root      94 Dec  8 22:01 srpm
[root@localhost ~]# ls -l /opt/soft/srpm/
total 7900
-rw-r--r-- 1 root root 1109494 Dec  8 18:58 apr-1.2.8-1.src.rpm
-rw-r--r-- 1 root root  642247 Dec  8 18:58 apr-util-1.2.8-1.src.rpm
-rw-r--r-- 1 root root 6332956 Dec  8 17:48 httpd-2.2.3-1.src.rpm

5.2、apr的spec文件中的編譯選項以及最終自己微調後實測

可以從下面這個目錄找到apr老版本的srpm包:
http://archive.apache.org/dist/apr/binaries/

解壓apr的srpm包:

[root@localhost srpm]# mkdir apr-srpm
[root@localhost srpm]# ls
apr-1.2.8-1.src.rpm  apr-srpm  apr-util-1.2.8-1.src.rpm  httpd-2.2.3-1.src.rpm
[root@localhost srpm]# cp apr-1.2.8-1.src.rpm apr-srpm/
[root@localhost srpm]# cd apr-srpm/
[root@localhost apr-srpm]# pwd
/opt/soft/srpm/apr-srpm
[root@localhost apr-srpm]# rpm2cpio apr-1.2.8-1.src.rpm | cpio -div
apr-1.2.8.tar.gz
apr.spec
2168 blocks
[root@localhost apr-srpm]# ls -l
total 2172
-rw-r--r-- 1 root root 1109494 Dec  8 22:04 apr-1.2.8-1.src.rpm
-rw-rw-r-- 1 root root 1107189 Dec  8 22:04 apr-1.2.8.tar.gz #這格式製作rpm包時候用到的apr的源碼包
-rw------- 1 root root    2393 Dec  8 22:04 apr.spec #這個是製作rpm包時的spec文件

製作apr的rpm包的spec中關於configure的部分:(沒有spec基礎,可以略過第五章)

%build
# regenerate configure script etc.
./buildconf
%configure \
        --prefix=/usr \
        --includedir=%{_includedir}/apr-%{aprver} \
        --with-installbuilddir=%{_libdir}/apr/build-%{aprver} \
        --with-devrandom=/dev/urandom \
        CC=gcc CXX=g++
make %{?_smp_mflags} && make dox

%check
# Run non-interactive tests
pushd test
make %{?_smp_mflags} testall CFLAGS=-fno-strict-aliasing
./testall -v || exit 1
popd

%install
rm -rf $RPM_BUILD_ROOT
make install DESTDIR=$RPM_BUILD_ROOT

最終我自己生成的編譯選項和精簡步驟爲:
cd apr-1.6.5
sed -i '/$RM "$cfgfile"/s/^/#/' configure
./configure \
    --prefix=/data/application/apr-1.6.5 \
    --with-devrandom=/dev/urandom

make
make install
ln -sf /data/application/apr-1.6.5 /data/application/apr

安裝依賴庫和組件:

yum -y install gcc gcc-c++ autoconf make libtool openssl-devel zlib-devel pcre-devel expat-devel openldap-devel db4-devel
過程略......

使用上面我們自己生成的選項,來編譯安裝:

[root@localhost ~]# mkdir -p /data/application
[root@localhost ~]# cd /opt/soft/
[root@localhost soft]# tar -xf apr-1.6.5.tar.bz2 
[root@localhost soft]# cd apr-1.6.5
[root@localhost apr-1.6.5]# sed -i '/$RM "$cfgfile"/s/^/#/' configure
[root@localhost apr-1.6.5]# ./configure \
>     --prefix=/data/application/apr-1.6.5 \
>     --with-devrandom=/dev/urandom
過程省略......
[root@localhost apr-1.6.5]# make
過程省略......
[root@localhost apr-1.6.5]# make install
過程省略......
[root@localhost apr-1.6.5]# ls -l /data/application/
total 0
lrwxrwxrwx 1 root root 27 Dec  8 22:12 apr -> /data/application/apr-1.6.5
drwxr-xr-x 6 root root 58 Dec  8 22:11 apr-1.6.5
[root@localhost apr-1.6.5]# ls -l /data/application/apr/bin/apr-1-config 
-rwxr-xr-x 1 root root 6974 Dec  8 22:11 /data/application/apr/bin/apr-1-config

apr高版本編譯安裝結束,有參考rpm包的spec文件。

5.3、apr-util的spec文件中的編譯選項以及最終自己微調後實測

解壓apr的srpm包:

[root@localhost srpm]# ls
apr-1.2.8-1.src.rpm  apr-srpm  apr-util-1.2.8-1.src.rpm  httpd-2.2.3-1.src.rpm
[root@localhost srpm]# mkdir apr-util-srpm
[root@localhost srpm]# cp -a apr-util-1.2.8-1.src.rpm apr-util-srpm/
[root@localhost srpm]# cd apr-util-srpm/
[root@localhost apr-util-srpm]# rpm2cpio apr-util-1.2.8-1.src.rpm | cpio -div
apr-util-1.2.8.tar.gz
apr-util.spec
1268 blocks
[root@localhost apr-util-srpm]# ls -l
total 1264
-rw-r--r-- 1 root root 642247 Dec  8 18:58 apr-util-1.2.8-1.src.rpm
-rw-rw-r-- 1 root root 646379 Dec  8 22:13 apr-util-1.2.8.tar.gz
-rw------- 1 root root   2395 Dec  8 22:13 apr-util.spec

spec文件中關於configure的部分:

%build
%configure --with-apr=%{_prefix} \
        --includedir=%{_includedir}/apr-%{apuver} \
        --with-ldap --without-gdbm
make %{?_smp_mflags} && make dox

%check
# Run non-interactive tests
pushd test
make %{?_smp_mflags} testall CFLAGS=-fno-strict-aliasing
./testall -v || exit 1
popd

%install
rm -rf $RPM_BUILD_ROOT
make install DESTDIR=$RPM_BUILD_ROOT

最終自己生成的編譯選項和精簡安裝步驟:
./configure \
    --prefix=/data/application/apr-util-1.6.1 \
    --with-apr=/data/application/apr \
    --with-ldap \
    --without-gdbm
make
make install
ln -s /data/application/apr-util-1.6.1 /data/application/apr-util

使用上面我們自己生成的選項,來編譯安裝:

[root@localhost test]# ls
httpd-2.2.3  httpd-2.2.3-1.src.rpm  httpd-2.2.3.tar.gz  httpd.spec
[root@localhost test]# vim httpd.spec 
[root@localhost apr-util-srpm]# vim apr-util.spec 
[root@localhost apr-util-srpm]# cd /opt/soft/
[root@localhost soft]# tar -xf apr-util-1.6.1.tar.bz2 
[root@localhost soft]# cd apr-util-1.6.1
[root@localhost apr-util-1.6.1]# ./configure \
>     --prefix=/data/application/apr-util-1.6.1 \
>     --with-apr=/data/application/apr \
>     --with-ldap \
>     --without-gdbm
過程省略......
[root@localhost apr-util-1.6.1]# make
過程省略......
[root@localhost apr-util-1.6.1]# make install
過程省略......
ln -s /data/application/apr-util-1.6.1 /data/application/apr-util

查看:
[root@localhost apr-util-1.6.1]# ls -l /data/application/
total 0
lrwxrwxrwx 1 root root 27 Dec  8 22:12 apr -> /data/application/apr-1.6.5
drwxr-xr-x 6 root root 58 Dec  8 22:11 apr-1.6.5
lrwxrwxrwx 1 root root 32 Dec  8 22:20 apr-util -> /data/application/apr-util-1.6.1
drwxr-xr-x 5 root root 43 Dec  8 22:19 apr-util-1.6.1
[root@localhost apr-util-1.6.1]# ls -l /data/application/apr-util/bin/apu-1-config 
-rwxr-xr-x 1 root root 6177 Dec  8 22:19 /data/application/apr-util/bin/apu-1-config

#apr-util編譯安裝結束。

5.4、httpd的spec文件中的編譯選項以及最終自己微調後實測

解壓srpm包:

[root@localhost srpm]# ls
apr-1.2.8-1.src.rpm  apr-srpm  apr-util-1.2.8-1.src.rpm  apr-util-srpm  httpd-2.2.3-1.src.rpm
[root@localhost srpm]# mkdir httpd-srpm
[root@localhost srpm]# cd httpd-srpm/
[root@localhost httpd-srpm]# cp ../httpd-2.2.3-1.src.rpm .
[root@localhost httpd-srpm]# rpm2cpio httpd-2.2.3-1.src.rpm | cpio -div
httpd-2.2.3.tar.gz
httpd.spec
12426 blocks
[root@localhost httpd-srpm]# ls -l
total 12404
-rw-r--r-- 1 root root 6332956 Dec  8 22:21 httpd-2.2.3-1.src.rpm
-rw-r--r-- 1 root root 6342475 Dec  8 22:22 httpd-2.2.3.tar.gz
-rw------- 1 root root   19127 Dec  8 22:22 httpd.spec

spec文件中關於httpd的configure部分:

../configure -C \
        --prefix=%{_sysconfdir}/httpd \
        --with-apr=/usr/bin/apr-1-config \
        --with-apr-util=/usr/bin/apu-1-config \
        --exec-prefix=%{_prefix} \
        --bindir=%{_bindir} \
        --sbindir=%{_sbindir} \
        --mandir=%{_mandir} \
        --libdir=%{_libdir} \
        --sysconfdir=%{_sysconfdir}/httpd/conf \
        --includedir=%{_includedir}/httpd \
        --libexecdir=%{_libdir}/httpd/modules \
        --datadir=%{contentdir} \
        --with-mpm=$mpm \
        --enable-suexec --with-suexec \
        --with-suexec-caller=%{suexec_caller} \
        --with-suexec-docroot=%{contentdir} \
        --with-suexec-logfile=%{_localstatedir}/log/httpd/suexec.log \
        --with-suexec-bin=%{_sbindir}/suexec \
        --with-suexec-uidmin=500 --with-suexec-gidmin=500 \
        --with-devrandom \
        --with-ldap --enable-ldap --enable-authnz-ldap \
        --enable-cache --enable-disk-cache --enable-mem-cache --enable-file-cache \
        --enable-ssl --with-ssl \
        --enable-deflate --enable-cgid \
        --enable-proxy --enable-proxy-connect \
        --enable-proxy-http --enable-proxy-ftp \
        $*

make %{?_smp_mflags}
popd
}

# Only bother enabling optional modules for main build.
mpmbuild prefork --enable-mods-shared=all

# To prevent most modules being built statically into httpd.worker, 
# easiest way seems to be enable them shared.
mpmbuild worker --enable-mods-shared=all

這裏介紹一個系統文件,裏面有定義一些書寫spec文件的一些常見的宏變量:

/usr/lib/rpm/macros文件中有定義宏:(以下是我摘錄於該系統配置文件,編譯簡單理解上面的spec的語法)
%{_sysconfdir}對應目錄爲:/etc
%{_prefix}對應目錄爲:/usr
%{_bindir}對應目錄爲:/usr/bin
%{_sbindir}對應目錄爲: /usr/sbin
%{_mandir}對應目錄爲:/usr/share/man
%{_libdir}對應目錄爲:/usr/lib  #如果是64位系統,到時候會替換爲/usr/lib64
%{_includedir}對應目錄爲:/usr/include
%{contentdir} 這裏的宏在spec文件中有定義,默認的宏定義文件不存在,spec文件中定義的值爲/var/www
%{suexec_caller} 在spec中定義的值爲apache
%{_localstatedir}值爲:/usr/var

最終自己生成的一份configure和精簡安裝步驟:
./configure \
    --prefix=/data/application/httpd-2.2.34 \
    --with-apr=/data/application/apr/bin/apr-1-config \
    --with-apr-util=/data/application/apr-util/bin/apu-1-config \
    --exec-prefix=/data/application/httpd-2.2.34 \
    --bindir=/data/application/httpd-2.2.34/bin \
    --sbindir=/data/application/httpd-2.2.34/sbin \
    --mandir=/data/application/httpd-2.2.34/share/man \
    --libdir=/data/application/httpd-2.2.34/lib64 \
    --sysconfdir=/data/application/httpd-2.2.34/conf \
    --includedir=/data/application/httpd-2.2.34/include/httpd \
    --libexecdir=/data/application/httpd-2.2.34/modules \
    --datadir=/data/application/httpd-2.2.34/www \
    --with-mpm=prefork \
    --enable-suexec \
    --with-suexec \
    --with-suexec-caller=apache \
    --with-suexec-docroot=/data/application/httpd-2.2.34/www \
    --with-suexec-logfile=/data/application/httpd-2.2.34/var/log/httpd/suexec.log \
    --with-suexec-bin=/data/application/httpd-2.2.34/sbin/suexec \
    --with-suexec-uidmin=500 \
    --with-suexec-gidmin=500 \
    --with-devrandom \
    --with-ldap \
    --enable-ldap \
    --enable-authnz-ldap \
    --enable-cache \
    --enable-disk-cache \
    --enable-mem-cache \
    --enable-file-cache \
    --enable-ssl \
    --with-ssl \
    --enable-deflate \
    --enable-cgid \
    --enable-proxy \
    --enable-proxy-connect \
    --enable-proxy-http \
    --enable-proxy-ftp \
    --enable-mods-shared=all
make
make install
ln -sf /data/application/httpd-2.2.34 /data/application/httpd	

實際安裝步驟略(我們按照之前介紹的,把三種mpm,prefork、worker、event都編譯成靜態文件),安裝後結果爲:

[root@localhost ~]# ls -l /data/application/httpd
lrwxrwxrwx 1 root root 30 Dec  8 22:30 /data/application/httpd -> /data/application/httpd-2.2.34
[root@localhost ~]# ls -l /data/application/httpd/
total 4
drwxr-xr-x 2 root root    6 Dec  8 22:30 bin
drwxr-xr-x 4 root root   84 Dec  8 22:30 conf
drwxr-xr-x 3 root root   19 Dec  8 22:30 include
drwxr-xr-x 2 root root    6 Dec  8 22:30 logs
drwxr-xr-x 2 root root 4096 Dec  8 22:30 modules
drwxr-xr-x 2 root root  296 Dec  8 22:35 sbin
drwxr-xr-x 3 root root   17 Dec  8 22:30 share
drwxr-xr-x 8 root root   88 Dec  8 22:30 www
[root@localhost ~]# ls  /data/application/httpd/sbin/
ab         apxs      dbmmanage  envvars-std   htdbm     htpasswd  httpd.event   httxt2dbm   rotatelogs
apachectl  checkgid  envvars    htcacheclean  htdigest  httpd     httpd.worker  logresolve  suexec
[root@localhost ~]# cd /data/application/httpd/sbin/
[root@localhost sbin]# ./httpd -l 
Compiled in modules:
  core.c
  prefork.c
  http_core.c
  mod_so.c
[root@localhost sbin]# ./httpd.worker -l 
Compiled in modules:
  core.c
  worker.c
  http_core.c
  mod_so.c
[root@localhost sbin]# ./httpd.event -l 
Compiled in modules:
  core.c
  event.c
  http_core.c
  mod_so.c
[root@localhost sbin]# ls
ab         apxs      dbmmanage  envvars-std   htdbm     htpasswd  httpd.event   httxt2dbm   rotatelogs
apachectl  checkgid  envvars    htcacheclean  htdigest  httpd     httpd.worker  logresolve  suexec
[root@localhost sbin]# cd ../
[root@localhost httpd]# ls
bin  conf  include  logs  modules  sbin  share  www
[root@localhost httpd]# ls -l share/man
total 0
drwxr-xr-x 2 root root  95 Dec  8 22:30 man1
drwxr-xr-x 2 root root 144 Dec  8 22:30 man8
[root@localhost httpd]# pwd
/data/application/httpd
[root@localhost httpd]# ls -l www/
total 28
drwxr-xr-x  2 root root  167 Dec  8 22:30 build
drwxr-xr-x  2 root root   38 Dec  8 22:30 cgi-bin
drwxr-xr-x  3 root root 4096 Dec  8 22:30 error
drwxr-xr-x  2 root root   24 Dec  8 22:30 htdocs
drwxr-xr-x  3 root root 8192 Dec  8 22:30 icons
drwxr-xr-x 14 root root 8192 Dec  8 22:30 manual
[root@localhost httpd]# ls -l conf/
total 88
drwxr-xr-x 2 root root   290 Dec  8 22:30 extra
-rw-r--r-- 1 root root 17425 Dec  8 22:30 httpd.conf
-rw-r--r-- 1 root root 12958 Dec  8 22:30 magic
-rw-r--r-- 1 root root 53015 Dec  8 22:30 mime.types
drwxr-xr-x 3 root root    37 Dec  8 22:30 original
[root@localhost httpd]# ls -l bin/
total 0
[root@localhost httpd]# ls -l logs/
total 0
[root@localhost httpd]# ls -l modules/ | tail -n 3
-rwxr-xr-x 1 root root   43776 Dec  8 22:30 mod_usertrack.so
-rwxr-xr-x 1 root root   26928 Dec  8 22:30 mod_version.so
-rwxr-xr-x 1 root root   39872 Dec  8 22:30 mod_vhost_alias.so
[root@localhost httpd]# ls -l modules/ | wc -l
69

添加環境變量和man手冊的指向:

echo 'export PATH=$PATH:/data/application/httpd/sbin' > /etc/profile.d/httpd22.sh
source /etc/profile
echo 'MANPATH /data/application/httpd/share/man' >>/etc/man.config

查看:
[root@localhost httpd]# httpd -v
Server version: Apache/2.2.34 (Unix)
Server built:   Dec  8 2018 22:28:44
[root@localhost httpd]# httpd.worker -v
Server version: Apache/2.2.34 (Unix)
Server built:   Dec  8 2018 22:31:42
[root@localhost httpd]# httpd.event -v
Server version: Apache/2.2.34 (Unix)
Server built:   Dec  8 2018 22:33:53
[root@localhost httpd]# httpd -l && httpd.worker -l && httpd.event -M |grep 'mpm'
Compiled in modules:
  core.c
  prefork.c
  http_core.c
  mod_so.c
Compiled in modules:
  core.c
  worker.c
  http_core.c
  mod_so.c
httpd.event: Could not reliably determine the server's fully qualified domain name, using localhost.localdomain for ServerName
Syntax OK
 mpm_event_module (static)

apache的httpd項目的官網地址:http://httpd.apache.org/
apache的apr項目的官網地址:https://apr.apache.org/
舊版的httpd的源碼包官網的下載鏈接:http://archive.apache.org/dist/httpd/
舊版的apr先關的源碼包官網的下載鏈接:http://archive.apache.org/dist/apr/
apache所有項目的舊版源碼包官網的下載鏈接:http://archive.apache.org/dist/
可以從下面這個目錄找到httpd2.2老版本的srpm包和rpm包:http://archive.apache.org/dist/httpd/binaries/
可以從下面這個目錄找到apr以及apr-util老版本的srpm包:http://archive.apache.org/dist/apr/binaries/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章