我常用的 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: 編譯習慣了就都當日常了 ↓

compile configure make make install

 

最後修改日期: 2021 年 10 月 14 日

作者

留言

撰寫回覆或留言

發佈留言必須填寫的電子郵件地址不會公開。