目錄
一、包管理器使用
二、自動依賴管理
2.1 yum
2.2 apt
三、編譯安裝 Nginx
3.1 下載原始碼
3.2 解壓
3.3 配置和解決依賴
3.4 編譯和安裝。
四、為什麼會有編譯安裝?
五、總結
六、問題
在 Linux 上安裝程式大概有 2 種思路:
直接編譯原始碼;使用包管理器。受開源運動影響,Linux 上很多軟體都可以拿到原始碼,這也是 Linux 能取得成功的一個重要原因。
一、包管理器使用Linux 下的應用程式多數以軟體包的形式釋出
Linux 下兩大主流的包就是rpm和dpkg。
dpkg(debian package),是linux一個主流的社群分支開發出來的。社群就是開源社群,有很多世界頂級的程式設計師會在社群貢獻程式碼,比如 github。一般衍生於debian的 Linux 版本都支援dpkg,比如ubuntu。rpm(redhatpackage manager)。RedHat 是一個做 Linux 的公司,你可以把它理解成一家“保險公司”。 很多公司購買紅帽的服務,是為了給自己的業務上一個保險。以防萬一哪天公司內部搞不定 Linux 底層,或者底層有 Bug,再或者底層不適合當下的業務發展,需要修改等問題,紅帽的工程師都可以幫企業解決。
再比如,RedHat 收購了JBoss,把 JBoss 改名為 WildFly。 像 WildFly 這種工具更多是面向企業級,比如沒有大量研發團隊的企業會更傾向使用成熟的技術。RedHat 公司也有自己的 Linux,就叫作 RedHat。RedHat 系統比較重要的 Linux 有 RedHat/Fedora 等。
無論是dpkg還是rpm都抽象了自己的包格式,就是以.dpkg或者.rpm結尾的檔案。
dpkg和rpm也都提供了類似的能力:
二、自動依賴管理Linux 是一個開源生態,因此工具非常多。工具在給使用者使用之前,需要先打成dpkg或者rpm包。 有的時候一個包會依賴很多其他的包,而dpkg和rpm不會對這種情況進行管理,有時候為了裝一個包需要先裝十幾個依賴的包,過程非常艱辛!因此現在多數情況都在用yum和apt。
2.1 yumyum的全名是 Yellodog Updator,Modified。 看名字就知道它是基於Yellodog Updator這款軟體修改而來的一個工具。yum是 Python 開發的,提供的是rpm包,因此只有redhat系的 Linux,比如 Fedora,Centos 支援yum。yum的主要能力就是幫你解決下載和依賴兩個問題。
下載之所以是問題,是因為 Linux 生態非常龐大,有時候使用者不知道該去哪裡下載一款工具。比如使用者想安裝vim,只需要輸入sudo yum install vim就可以安裝了。
yum的伺服器收集了很多linux軟體,因此yum會幫助使用者找到vim的包。
另一方面,yum幫助使用者解決了很多依賴,比如使用者安裝一個軟體依賴了 10 個其他的軟體,yum會把這 11 個軟體一次性的裝好。
關於yum的具體用法,你可以使用man工具進行學習。
2.2 aptapt全名是 Advanced Packaging Tools,是一個debian及其衍生 Linux 系統下的包管理器。由於advanced(先進)是相對於dpkg而言的,因此它也能夠提供和yum類似的下載和依賴管理能力。
比如在沒有vim的機器上,我們可以用下面的指令安裝vim。如下圖所示:
然後用dpkg指令檢視 vim 的狀態是ii。第一個i代表期望狀態是已安裝,第二個i代表實際狀態是已安裝。
下面我們解除安裝vim,再透過dpkg檢視,如下圖所示:
我們看到 vim 的狀態從ii變成了rc,r是期望刪除,c是實際上還有配置檔案遺留。 如果我們想徹底刪除配置檔案,可以使用apt purge,就是徹底清除的意思,如下圖所示:
再使用dpkg -l時,vim已經清除了。
期待結果是u就是 unkonw (未知)說明已經沒有了。實際結果是n,就是 not-installed(未安裝)。
如果想查詢mysql相關的包,可以使用apt serach mysql,這樣會看到很多和mysql相關的包,如下圖所示:
如果我們想精確查詢一個叫作mysql-server的包,可以用apt list。
這裡我們找到了mysql-server包。
另外有時候國內的apt伺服器速度比較慢,你可以嘗試使用阿里雲的映象伺服器。
cat /etc/apt/sources.list--以下是檔案內容--deb http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiversedeb http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiversedeb http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiversedeb http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiversedeb http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiversedeb-src http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiversedeb-src http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiversedeb-src http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiversedeb-src http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiversedeb-src http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse
映象地址可以透過/etc/apt/sources.list配置,注意focal是我用的ubuntu版本,你可以使用sudo lsb_release檢視自己的 Ubuntu 版本。如果你想用我上面給出的內容覆蓋你的sources.list,只需把版本號改成你自己的。注意,每個ubuntu版本都有自己的代號。
透過上面的學習,相信你已經逐漸瞭解了包管理器的基本概念和使用。如果你是centos或者fedora,需要自己man一下yum。
三、編譯安裝 Nginx接下來我們說說編譯安裝 Nginx(發音是 engine X),是一個家喻戶曉的 Web 伺服器。 它的發明者是俄國的伊戈爾·賽索耶夫。賽索耶夫 2002 年開始寫 Nginx,主要目的是解決同一個網際網路節點同時進入大量併發請求的問題。注意,大量併發請求不是大量 QPS 的意思,QPS 是吞吐量大,需要快速響應,而高併發時則需要合理安排任務排程。
後來塞索耶夫成立了 Nginx 公司, 2018 年估值到達到 4.3 億美金。現在基本上國內大廠的 Web 伺服器都是基於 Nginx,只不過進行了特殊的修改,比如淘寶用 Tengine。
如上圖所示,可以看到 nginx-1.18.0 的網址是:http://nginx.org/download/nginx-1.19.2.tar.gz。然後我們用 wget 去下載這個包。 wget 是 GNU 專案下的下載工具,GNU 是早期unix專案的一個變種。linux下很多工具都是從unix繼承來的,這就是開源的好處,很多工具不用再次開發了。你可能很難想象windows下的命令工具可以在linux下用,但是linux下的工具卻可以在任何系統中用。 因此,linux下面的工具發展速度很快,如今已成為最受歡迎的伺服器作業系統。
當然也有同學的機器上沒有wget,那麼你可以用apt安裝一下。
3.1 下載原始碼3.2 解壓tar是用來打包和解壓用的。之所以叫作tar是有一些歷史原因:t代表tape(磁帶);ar是 archive(檔案)。因為早期的儲存介質很小,人們習慣把檔案打包然後儲存到磁帶上,那時候unix用的命令就是tar。因為linux是個開源生態,所以就沿襲下來繼續使用tar。
-x代表 extract(提取)-z代表gzip,也就是解壓gz型別的檔案。-v代表 verbose(顯示細節),如果你不輸入-v,就不會列印解壓過程了。-f代表 file,這裡指的是要操作檔案,而不是磁帶。所以tar解壓通常帶有x和f,打包通常是c就是 create 的意思。
3.3 配置和解決依賴可以看到一個叫作configure的檔案是綠色的,也就是可執行檔案。
這個配置檔案來自一款叫作autoconf的工具,也是 GNU 專案下的,說白了就是bash(Bourne Shell)下的安裝打包工具(就是個安裝程式)。
這個安裝程式支援很多配置,你可以用./configure --help看到所有的配置項,如下圖所示:
這裡有幾個非常重要的配置項,叫作prefix。prefix配置項決定了軟體的安裝目錄。如果不配置這個配置項,就會使用預設的安裝目錄。
sbin-path決定了nginx的可執行檔案的位置。conf-path決定了nginx配置檔案的位置。我們都使用預設,然後執行./configure如下圖所示:
我們看到配置程式開始執行。但是最終報了一個錯誤,如下圖所示:
報錯的內容是,nginx的HTTP rewrite模組,需要PCRE庫。 PCRE 是perl語言的相容正則表示式庫。perl語言一直以支援原生正則表示式,而受到廣大程式設計愛好者的喜愛。
開始安裝PCRE。
一般這種依賴庫,會叫pcre-dev或者libpcre。用apt查詢了一下,然後grep。
我們看到有pcre2也有pcre3。這個時候可以考慮試試pcre3。
安裝完成之後再試試./configure,提示還需要zlib。然後我們用類似的方法解決zlib依賴。
zlib包的名字叫zlib1g不太好找,需要查資料才能確定是這個名字。
我們再嘗試配置,終於配置成功了。
3.4 編譯和安裝。通常配置完之後,我們輸入make && sudo make install進行編譯和安裝。
make是linux下面一個強大的構建工具。
autoconf也就是./configure會在當前目錄下生成一個 MakeFile 檔案。
make會根據MakeFile檔案編譯整個專案。
編譯完成後,能夠形成和當前作業系統以及 CPU 指令集相容的二進位制可執行檔案。然後再用make install安裝。&&符號代表執行完make再去執行make installl。
你可以看到編譯是個非常慢的活。等待了差不多 1 分鐘,終於結束了。
nginx被安裝到了/usr/local/nginx中,如果需要讓nginx全域性執行,可以設定一個軟連線到/usr/local/bin,具體如下:
ln -sf /usr/local/nginx/sbin/nginx /usr/local/sbin/nginx
四、為什麼會有編譯安裝?
你可能會問,為什麼會有編譯安裝這麼複雜的事情。
原來使用 C/C++ 寫的程式存在一個交叉編譯的問題。就是寫一次程式,在很多個平臺執行。
而不同指令集的 CPU 指令,還有作業系統的可執行檔案格式是不同的。因此,這裡有非常多的現實問題需要解決。一般是由作業系統的提供方,比如 RedHat 來牽頭解決這些問題。你可以用apt等工具提供給使用者已經編譯好的包。apt會自動根據使用者的平臺型別選擇不同的包。
但如果某個包沒有在平臺側註冊,也沒有提供某個 Linux 平臺的軟體包,我們就需要回退到編譯安裝,透過原始碼直接在某個平臺安裝。
五、總結包管理安裝很方便,但是有兩點劣勢。
第一點是需要提前將包編譯好,因此有一個釋出的過程,如果某個包沒有釋出版本,或者在某個平臺上找不到對應的釋出版本,就需要編譯安裝。第二點就是如果一個軟體的定製程度很高,可能會在編譯階段傳入引數,比如利用configure傳入配置引數,這種時候就需要編譯安裝。六、問題在編譯安裝 MySQL 時,發現找不到 libcrypt.so,應該如何處理?
遇到這類問題,首先應該去查資料。 比如查 StackOverflow,搜尋關鍵詞:libcrypt.so not found,或者帶上自己的作業系統ubuntu。下圖是關於 Stackoverflow 的一個解答: