我常用的 Linux 作業系統是 CentOS (它要再見的事就不提了 >,.<“)。
一般情況下要安裝套件只要 yum install XXX 即可 , 8 版加入了 dnf (與 yum 同存) 都是安裝套件的工具,
好處是 yum 可以幫你處理所有相依性套件也一並安裝 ,
缺點是可能連你想不到會有關係的套件也都裝起來了 (但機率小)。
如果要移除也只要 yum remove XXX 就好 , 不過就有可能遇到相依性的套件是被其它套件需要的,所以要連同其它套件也需要一並被移除或不能移除,所以要小心操作看清楚。
好了,既然 yum 這麼方便,為何還需要自行編譯套件,原因就是我要最新的版本,或特殊原因我需要其中的模組或功能。
你會想,要最新版本直接 yum 不就好了 ,但有幾種情況是 yum 安裝不到的,
1. CentOS 系統較舊 ,已沒有 yum 庫可以更新了 ,就可能要自己到處找 rpm 套件來裝 (你相信的來源) ,但不一定有 。
2. yum rpm 套件還沒有最新的 , 就算有也可能只保留最穩定的版本,或重大漏洞的更新版本。
所以我就要選擇自行編譯。
對了,自行編譯還有一好處是,我不想破壞原本運作正常的環境, 前面說到 yum 可以處理相依性套件,可能會連同其它套件也一並更新,這說不定會影響其它套件的連鎖衝突,所以盡量避開。
舉個例子
最近我想讓網站支援 TLSv1.3 , 但本身系統的 apache 只到 2.4.6,而 openssl 只到 1.0.2k
我就開始 ↓↓
編譯 openssl
openssl 最新已到 3.0.0 了,但跟 1.1.1l 相差無幾,不過我還是用 1.1.1l
我編譯路徑放到 /usr/local/ssl-1.1.1l (全部內容會在這裡面) 不跟 rpm 的 openssl 相衝
version="1.1.1l"
wget https://www.openssl.org/source/openssl-${version}.tar.gz --no-check-certificate
tar zxvf openssl-${version}.tar.gz
cd openssl-${version}
make clean
./config --prefix=/usr/local/ssl-${version} --openssldir=/usr/local/ssl-${version} -fpic shared
make
make install
echo "/usr/local/ssl-${version}/lib" >> /etc/ld.so.conf
ldconfig
編譯 apache
免不了也要 yum 安裝一些開發套件,除非它版本要大於多少就只能選擇用編譯的方式帶入了
yum install libxml2-devel expat-devel autoconf libtool svn lua-devel -y
version='2.4.51'
wget http://archive.apache.org/dist/httpd/httpd-${version}.tar.gz
tar -zxvf httpd-${version}.tar.gz
cd httpd-${version}
svn co http://svn.apache.org/repos/asf/apr/apr/trunk srclib/apr
./buildconf
再來為了符合現有的 rpm 套件環境 (先前已是用 yum 安裝的了),作了以下調整,
這是 apache 支援自作 layout ,可以調整同 rpm 的路徑 ,在編譯時定義這個 layout (config.layout 裡面有其它系統的 layout) , 其實它同等於用 ./configure –help 看到的 –prefix 等參數意義相同。
cat << EOF >> config.layout
prefix: /etc/httpd
exec_prefix: /usr
localstatedir: /var
runtimedir: /run/httpd
bindir: \${exec_prefix}/bin
sbindir: \${exec_prefix}/sbin
libdir: \${exec_prefix}/lib64
libexecdir: \${libdir}/httpd/modules
mandir: \${exec_prefix}/share/man
sysconfdir: \${prefix}/conf
datadir: \${localstatedir}/www
installbuilddir: \${libdir}/httpd/build
errordir: \${exec_prefix}/share/httpd/error
iconsdir: \${exec_prefix}/share/httpd/icons
htdocsdir: \${datadir}/html
manualdir: \${exec_prefix}/share/httpd/manual
cgidir: \${datadir}/cgi-bin
includedir: \${exec_prefix}/include/httpd
logfiledir: \${localstatedir}/log/httpd
proxycachedir: \${localstatedir}/cache/httpd
EOF
再來在 configure 時加入 –enable-layout=CROSS 及其它參數
make clean ; ./configure --enable-layout=CROSS --with-suexec-bin=/usr/sbin/suexec \
--enable-mods-shared=all \
--enable-cache \
--enable-so \
--enable-echo \
--enable-data \
--enable-ratelimit \
--enable-reflector \
--enable-log-forensic \
--enable-charset-lite \
--enable-deflate \
--enable-lua \
--enable-mime-magic \
--enable-expires \
--enable-usertrack \
--enable-unique-id \
--enable-remoteip \
--enable-proxy \
--enable-proxy-connect \
--enable-proxy-fcgi \
--enable-proxy-ajp \
--enable-session \
--enable-slotmem-plain \
--enable-ssl=shared \
--enable-ssl-staticlib-deps \
--enable-dialup \
--enable-http2 \
--enable-nghttp2-staticlib-deps \
--enable-mpms-shared=all \
--enable-systemd \
--enable-heartbeat \
--enable-heartmonitor \
--enable-asis \
--enable-info \
--enable-suexec \
--enable-cgi \
--enable-dav-lock \
--enable-vhost-alias \
--enable-rewrite \
--with-included-apr \
--with-apr \
--with-apr-util \
--with-pcre \
--with-libxml2 \
--with-ssl=/usr/local/ssl-1.1.1l \
--with-nghttp2=/usr/local/nghttp2 \
--with-curl=/usr/local/curl \
--with-program-name=httpd
make
make install
不過編譯時難免遇到問題,像 ↓
問題一
can't find libxml/parser.h
解決一
cd /usr/include ln -s libxml2/libxml .
問題二
libapr-2.so.0: cannot open shared object file: No such file or directory
解決二
ln -s /usr/lib/libapr-2.so.0 /usr/lib64/libapr-2.so.0
像以上這些問題還好,不同環境下可能會遇到少了某套件,或是某套件要大於幾版的才行 (其實編譯就會有可能產生這種連鎖反應)
此時就先拿 yum 安裝, 不行的話就要下載 xxx.tar.gz , 再自行編譯後在 configure 時指定給 –with-xxx=/path 等等
像是上面的 –with-ssl=/usr/local/ssl-1.1.1l ,因為我要 openssl 1.1.1l 所以這樣子指定給它先前安裝的路徑,它才能吃到我要的版本
編譯安裝完後就可以像平常的習慣操作 apcache 作確認,httpd -v 或 systemctl restart httpd 等等
最後
有時自行編譯要心臟夠大條才能使用,會遇到沒有這個沒有那個的不在少數,也要接受最後可能失敗的情況 (通常是 upgrade CentOS 解決)。
PS: 編譯習慣了就都當日常了 ↓

留言