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