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這種包就是了。不同的軟件缺失的插件不一樣,根據實際情況安裝軟件包。
該步驟完成后,除了生成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路徑
到這里為止,httpd編譯完成,服務可以正常啟用
3 一鍵安裝apache代碼
以下是在centOS6上一鍵編譯安裝apache的腳本
#!/bin/bash
# ----------------+---------------------------------------+
# * Author? ? ? ? : Sunny
# * Email? ? ? ? : 951408320@qq.com
# * 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;