1 概述
很多軟體沒有釋出rpm包,而是直接釋出了源碼,好處是這樣能相容更多的平台,但是,使用者需要對源碼進行編譯後安裝。利用工具make将源碼生成二進制檔案。
本文主要講解了對httpd進行編譯安裝。分别介紹centOS6和centOS7兩個系統版本上httpd的安裝
2 CentOS6編譯安裝httpd
下載下傳httpd-2.2.34.tar.bz2這個安裝包到centOS6,一般建議把軟體包放在路徑/usr/local/src這個路徑下。
解開該壓縮檔案 tar -xvf httpd-2.2.34.tar.bz2。
接下來,要用make來變成C程式的檔案。解壓後的目錄下,預設還沒有Makefile這個檔案,該檔案用來記錄如何編譯該軟體,安裝在哪個路徑下,哪些軟體功能啟用,哪些功能不啟用。這個就是展現了源碼編譯安裝的靈活度,可以定制功能。Makefile是通過configure這個工具來生成的,由源碼釋出者提供。
Makefile 是configure工具借助Makefile.in這個模闆來生成的檔案
C語言源代碼編譯安裝三步驟:
1、./configure
(1) 通過選項傳遞參數,指定啟用特性、安裝路徑等;執行時會參考使用者的指定以及Makefile.in檔案生成Makefile
(2) 檢查依賴到的外部環境,如依賴的軟體包
2、make 根據Makefile檔案,建構應用程式
3、make install 複制檔案到相應路徑
有些情況下,沒有configure檔案,可以通過autoconf生成configure腳本,automake這個工具用來生成Makefile.in這個檔案,一般這兩個檔案由開發者生成釋出。
configure腳本支援大量的選項,根據不同的選項來生成Makefile檔案
安裝開發包組,這個是編譯開發軟體要用到的工具。建議都要安裝。這個包組安裝完成後,可能在編譯過程還需要用到其他工具,具體情況根據缺失提示資訊再安裝對應的開發包。
configure要指定安裝目錄,--prefix=PREFIX 指定軟體包的安裝路徑,如果沒有指定,則是按照預設的路徑安裝。
運作如下語句,生成Makefile檔案
./configure --prefix=/sunny/httpd66 --sysconfdir=/etc/httpd66 --enable-ssl
運作語句,發現如下報錯,一般這種是缺失相應的開發包,比如提示OpenSSL缺失,就另行安裝openssl-devel這個包。一般的包就是提示缺失的名字後加devel這種包就是了。不同的軟體缺失的插件不一樣,根據實際情況安裝軟體包。

圖一 configure報錯
該步驟完成後,除了生成Makefile這個檔案外,還會生成其他相關的檔案。
執行make,這裡根據軟體的大小決定了編譯時間的長短,電腦性能好的話,編譯時間會明顯縮短。編譯完成後 ,會生成新的檔案
make
執行make install 開始安裝
make install
到這裡,httpd軟體安裝成功。接下來需要對軟體進行啟動以及配置。
如果這裡有指定軟體的安裝路徑,則到對應路徑的/bin目錄下開啟軟體,如本實驗中路徑是/sunny/httpd66/bin/apachectl,但是這樣的操作比較麻煩,建議直接在/etc/profile.d目錄下生成檔案,寫入該路徑,這裡建議把路徑放在前面,因為系統裡有一個路徑和這個服務一樣,會先比對執行前面的
echo 'export PATH=/sunny/httpd66/bin:$PATH' > /etc/profile.d/httpd66.sh
. /etc/profile.d/httpd66.sh //運作該檔案,使得路徑生效
這裡有個小細節,用單引号,不會展開PATH這個變量,比較好看,如果用雙引号,則會展開變量,路徑比較長,而且路徑已經被固定了,但是,在這裡兩個寫法都是正确的寫法,結果如下圖
圖二 單引号和雙引号的差別
啟動apache服務
apachectl start
驗證一下,ss -ntl 檢視80端口是否打開,如果打開就可以去通過網頁打開。
由于編譯時指定了路徑,這裡如果要改變浏覽器首頁的資訊,可以到路徑/sunny/httpd66/htdocs/ 更改index.html這個檔案。
如果要使用man幫助檢視httpd的相關資訊,需要把軟體的man文檔路徑加入到man的配置檔案裡執行如下語句
vim /etc/man.config
MANPATH /sunny/httpd66/man //添加檔案安裝指定路徑下的man路徑
3 一鍵安裝apache代碼
#!/bin/bash
# ----------------+---------------------------------------+
# * Author : Sunny
# * Create time : 2017-08-08
# * Last modified : 2017-08-08
# * Filename : httpd.sh
# * Description : Auto install apache for centOS6
# * version : 1.0
# ----------------+---------------------------------------+
#定義變量
export httpdpkg=`find / -name "httpd-2.2.34.tar.bz2" | head -1`
echo "httpdpkg is $httpdpkg"
export pkgnu=`find / -name "httpd-2.2.34.tar.bz2" | wc -l`
echo "pkgnu is $pkgnu"
export httpdir="/usr/local/src/httpd-2.2.34"
#解壓httpd服務包
case $pkgnu in
0)
cd /usr/local/src ;
wget http://apache.fayea.com/httpd/httpd-2.2.34.tar.bz2;
tar xvf httpd-2.2.34.tar.bz2;
;;
*)
tar xvf $httpdpkg -C /usr/local/src/ &>/dev/null ;
;;
esac
#安裝編譯
[ -d $httpdir ] && cd $httpdir || echo "httpdir is not exist.please check"
echo "You are in `pwd` now"
yum grouplist "development tools" &>/dev/null|| yum -y groupinstall "Development Tools" &>/dev/null || echo "Devel tools is install"
rpm -q apr-devel &>/dev/null || yum -y install apr-devel &>/dev/null;
rpm -q apr-util-devel &>/dev/null || yum -y install apr-util-devel &>/dev/null;
rpm -q openssl-devel &>/dev/null || yum -y install openssl-devel &>/dev/null;
rpm -q gcc &>/dev/null ||yum -y install gcc &>/dev/null;
#因為編譯過程可能會缺失各種工具包,是以這裡不隐藏編譯過程,如果有問題,可以及時發現解決
./configure --prefix=/sunny66/httpd66 &>/dev/null;
[ $? = 0 ] && make &>/dev/null|| echo "Please check configure"
[ $? = 0 ] && make install &>/dev/null || echo "Please check make";
[ $? = 0 ] && echo " httpd is successful install" || echo "Warning,install is failure,Please check make install"
#簡單的初始化配置,注意是添加apache的bin路徑到PATH
echo 'export PATH=/sunny66/httpd66/bin:$PATH' > /etc/profile.d/httpd22.sh
. /etc/profile.d/httpd22.sh && echo "Now PATH is $PATH"
echo "MANPATH /sunny66/sunny66/man" >> /etc/man.config;
echo "ServerName localhost:80" >>/sunny66/httpd66/conf/httpd.conf
sed -i 's/It works!/Welcome to Sunny Home/g' /sunny66/httpd66/htdocs/index.html
apachectl start;
#關閉防火牆和selinux
setenforce 0;
iptables -F;
#檢查端口狀态
ss -ntl | grep 80;
[ $? = 0 ] && echo "httpd is success.you can open web to check" || echo "Apache do not start"
#解除變量
unset httpdpkg;
unset pkgnu;
unset httpdir;
echo "Congratulation";
exit 0;