1. 程式人生 > >1:先補補Linux系統和伺服器的基礎 打好Nginx執行的環境基礎

1:先補補Linux系統和伺服器的基礎 打好Nginx執行的環境基礎

【學習前準備工作 強調幾點注意事項】

之前看過序章的朋友 一定還記得大米跟大家提過, 一個最最簡單的網站(靜態網站)基礎框架組成部分是什麼?

那就是 NGINX(WEB伺服器) + 伺服器 + 作業系統(Linux)

這裡給大家補充說明幾點

第一: 首先 咱們先來說一下Linux這個重頭戲的組成部分,Linux因為它的開源以及穩定等等的優質特性,現如今已經基本統一了伺服器作業系統的標準,說真的 現在去機房 再想找出一臺不是跑著Linux的伺服器(跑著其他的系統) 估計挺難的了

在我們的專欄中(包括後續的專欄)全部都是基於Linux給大家搭建環境 並講解的

所以 本專欄需要大家對Linux 有一定的基礎後 再繼續閱讀
(本專欄中 涉及到的 過於基礎的Linux知識 我們就不再額外花篇幅講解了 )

第二:關於伺服器,在序章的時候 跟大家說過 它指的是一臺物理伺服器 , 所謂的網際網路 其實不過就是 由無數無數的物理伺服器連線在一起 最終繪製而成的(比較有經驗的同學 可能會擡槓了, 誰說都是物理伺服器的,現在很多不都是雲虛擬機器了嗎? 問的對,現在確實很多中小企業 都不再購買真正的物理伺服器來搭建自己的"網際網路產品", 但是 歸根到底,雲機只不過是針對企業使用者或者個人使用者來說的, 從技術層面上說, 雲機是通過虛擬化技術 在物理伺服器上 劃分出的區域 本質永遠脫離不了 本體的物理伺服器)

然而 在我們的專欄學習的過程中,伺服器是每個人必須準備的, 然而為了學習而購買一臺上萬的物理伺服器肯定不現實 也沒有必要
(因為我們並不是真的要 搭建一個被好幾萬人訪問的網站 )

這裡推薦大家 兩種方式來 搭建我們的伺服器(虛擬機器)

第一種 (推薦):在活動折扣期間 購買任意雲平臺的 最低配置虛擬機器兩臺(學習過程中 最少使用兩臺 三臺最佳 後面會講解為什麼)

這樣的做法 是大米比較推薦的,雖然會產生一定的費用(折扣活動期間 最低配的一臺雲機 一年也不過100-200塊錢而已 比較划算 )然而 靈活性非常的高 因為購買的雲機 可擁有公網IP地址 可以在任意地點登入使用和維護 這樣以來 就對地點不再侷限 可以在任意地方進行遠端登入

另外 現在大多數雲平臺的雲機 都支援按量付費 也就是說 用的時候才會產生費用 (一天幾毛錢到幾塊錢 看配置高低 和 使用時長了 基本按照小時出賬單) 用完後釋放 就不會再產生費用, 需要注意的就是 千萬別弄高配置 高頻寬 那費用成指數上升 就很嚇人了 一切就按最低配置來即可 學習足夠用了

另外還有一個好處,就是多接觸各類雲端計算平臺的使用方法 對以後想從事運維工程師相關工作來說 是一個非常好的鍛鍊和準備

第二種(免費):這個自然就是 使用我們的筆記本 或者 PC桌上型電腦 安裝Linux虛擬機器

估計大多數人還是會選擇這樣的方式來安裝Linux虛擬機器 , 畢竟免費嘛 ^_^

這裡 強烈推薦大家使用 virtual box 來安裝虛擬機器(因為簡單 又免費) , Linux映象選擇Centos6/7 即可

關於如何在windows上使用virtual box安裝虛擬機器,這個非常簡單 度娘一搜就一堆 這裡就不再跟大家囉嗦了
(唯一有點麻煩的就是 需要提前下載好一個 Centos.ios的映象檔案 這個檔案很大 最好常備一份兒)

最穩妥的方式 推薦大家在接有網線的 桌上型電腦 或者 筆記本上 安裝虛擬機器三臺, 網路選擇"物理橋接即可"
然後每臺Linux虛擬機器 手動分配固定IP (不要用DHCP自動分配 不然時不時變IP非常討厭, 所以伺服器99%的情況 都是手動分配固定IP)

第三:解釋一下什麼叫做 靜態站點和動態站點

關於什麼是靜態和動態站點 我們之前跟大家提過兩次, 在這裡 咱們來解釋一下意思

靜態網站? 網頁都是靜止不動的? 只要畫面有變動就成動態網站了? 是這個意思嗎?

其實不是的哦 -_-

所謂的靜態網站 準確的定義 是網站所提供的網頁內容對於所有來訪的使用者都是保持一致 不隨使用者的互動動作而計算且發生變化 除非是伺服器端的靜態資源(例如 文字 圖片 視訊 動畫 聲音)發生了改變

這裡理解起來可能會產生誤區,比如 有的學員可能就會問 比如開啟一個純看圖片的網站,這算是靜態了對吧, 可是當我滑鼠點選站內另外一個圖片連結的時候,畫面就變了唉 這不就是隨著我的動作發生改變了嗎? 變成動態網站了?

大米給大家的解釋是,沒錯 這裡點選另外的圖片 確實是畫面發生了改變, 但是這並不是動態網站效果 為什麼呢?

因為 另外的圖片連結原本就存在在站內,只不過是當你點選到了 才看到而已, 這裡的動作只是發生了頁面跳轉 而並不是根據你的動作和輸入 經過計算後發生改變

這麼解釋 估計還可能有同學不是很明白,不用太著急 接下來 咱們看一下動態網站的定義 再返回頭來看 就明白多了

那什麼是動態網站呢?

最直接簡單的例子 就是一個登入歡迎頁面

1:先補補Linux系統和伺服器的基礎 打好Nginx執行的環境基礎

就像上面這張圖這樣, 大家都見過吧, 網頁一上來就先讓你輸入使用者名稱和密碼

輸入完成之後(比如:張三 123456) 然後會有一個對應的"程式" 把你輸入的賬號和密碼 攜帶著去到資料庫裡查驗

看看這個賬號是不是存在, 再看看密碼是否正確, 如果錯誤 就返回失敗, 如果正確 就返回 一個頁面寫著 歡迎你 張三

這種就屬於動態網站的功能, 因為網站跟使用者有互動的動作, 使用者會有資料的提交 ,而且根據每個使用者輸入資料的不同 返回的結果可能都不一樣 比如 李四登入成功 就顯示 歡迎你 李四, 別人登入成功的話 就會變了

除此之外 動態網站還有兩個非常重要的元件 , 那就是 網站後面有程式程式碼在執行和判斷 還有動態網站 必然存在資料庫的支援 (靜態網站一般沒有)

另外 從URL(也就是你輸入的網址 也可以進行判斷)

靜態網站 更多以 .htm .html .xml結尾, 而動態網站 更多以 .php .asp .jsp .cgi (CGI通用閘道器介面 是最早實現動態網站的技術 大米之前在序章提過的)等等結尾 在動態網頁網址中有一個標誌性的符號——“?”,如有這樣一個動態網頁的地址為:
http://www.testdami.com/index.php?id=12345

其實現階段來看 動態網站和靜態網站 基本上已經不是獨立存在的了, 絕大多數情況 都是混合再一起的網站 既有靜態又有動態

就拿我們平時嚐嚐訪問的幾個入口網站來說, 一般都帶有新聞首頁對吧 上面附帶著大量的靜態頁面內容(文字 圖片 等等), 然而與此同時 所有入口網站 都支援 使用者註冊登入 郵箱 搜尋等等動態網站的內容

在我們的專欄的課程中 我們先做出和搭建一個最簡單的靜態網站為目標 後面會再加入動態網站的內容

提問:既然網站有靜態和動態之分 那NGINX是不是都可以支援呢?

回答:NGINX本身只有處理靜態WEB的能力 ,處理動態站點的話 NGINX本身不會自己去處理 但是它擁有的模組 (fastcgi->主要用來傳遞PHP , uwsgi->主要用來傳遞python web)會識別動態請求 進而把請求傳遞給後端的其他程式來處理

【開始準備我們學習用的Linux伺服器吧】

接下來 咱們就可以著手準備我們的伺服器了

大米假設大家到了這個時候 所有的Linux虛擬機器都已經安裝完畢了哦 ^^

接下來 我們的伺服器 需要完成一些環境的配置工作 才可以正常使用的哦

  • 首先是Linux的FQDN設定

首先咱們先確認 我們的虛擬主機擁有 完整主機名(FQDN) 並且可以相互ping通哦

Linux上完整主機名的配置 不光是對於NGINX, 對於其他任何服務來說 都是非常重要的

有些服務 如果檢測不到正確主機名的配置 就會不斷報錯 甚至無法使用

另外 在生產環境中的Linux伺服器,完整主機名的配置是硬性要求 因為當伺服器數量大了以後,混亂的主機名會給維護帶來極大的不便

完善的主機名 最簡單的理解 就是 一個主機名+域名 來組成 而並不僅僅只是給機器起個名字這麼簡單哦 ^^

主機名:代表的是機器本身 域名:代表的是處在哪個域

例如 server001.study.com. 主機名是 server001 , 域是 study.com

就用Centos6為例子 我們按照如下的方式操作和最終驗證即可

1:先補補Linux系統和伺服器的基礎 打好Nginx執行的環境基礎

如上圖中所示 一共有 三個地方需要修改 一個是 /etc/sysconfig/network 當中定義 HOSTNAME
再一個就是 /etc/hosts下面的設定

/etc/hosts 是一個非常重要的 Linux解析配置檔案, Linux最早就是依靠它 來完成 機器名和ip地址的轉換工作
比如 在上面圖中 /etc/hosts檔案 定義了咱們三臺機器的 機器名和IP地址對應關係

server01.example.com server02.example.com server03.example.com
另外 在每一行的最後還定義了一個短名稱 這個叫做別名

這樣以來, 三臺機器之間 就可以相互使用 完整機器名 或者其別名 來呼叫了

1:先補補Linux系統和伺服器的基礎 打好Nginx執行的環境基礎

最後的 hostname -f (-f代表FQDN) 可以正確顯示完整主機名 即可

接下來 我們檢查Linux核心版本 請保證核心版本在2.6以上
為什麼呢? 因為2.6以上版本的Linux核心 才支援epoll

說到這裡會有疑問了 epoll又是個啥?(經常配置nginx的同學 一定見過 或者聽說過這個詞)
其實這裡相關的有三個主要詞彙 select , poll , epoll

這幾個是nginx配置檔案中 可選的配置項(events模組 ,後面會講到)

這裡容易有個誤區 ,以為這三個選項 是nginx獨有的"特性" ,實則不然

select/poll , epoll 其實是Linux核心中 多路複用I/O的 三種方法,跟nginx其實並沒有直接的關係

如果要真的完全解釋清楚 這三種模式在Linux核心中的實現方法 是相當複雜的

我們在當前可以先簡單按照如下 理解即可

首先 這三種模式 都是Linux核心 為了解決處理高併發問題而設計的

隨著核心的發展 誕生的先後順序為 select -> poll -> epoll , epoll可以理解為 poll方法的增強版

其實 這三種方法的本質 都是多路複用 提高核心處理網路連線的工作效率

那多路複用又是個啥?

以一個生活中的例子來解釋一下吧(如下一段 取自別處 個人認為很恰當的例子).

假設你在大學中讀書,要等待一個朋友來訪,而這個朋友只知道你在A號樓,但是不知道你具體住在哪裡,於是你們約好了在A號樓門口見面.

如果你使用的阻塞IO模型來處理這個問題,那麼你就只能一直守候在A號樓門口等待朋友的到來,在這段時間裡你不能做別的事情,不難知道,這種方式的效率是低下的.

現在時代變化了,開始使用多路複用IO模型來處理這個問題.你告訴你的朋友來了A號樓找樓管大媽,讓她告訴你該怎麼走.這裡的樓管大媽扮演的就是多路複用IO的角色.

既然 明白了什麼是 多路複用 那麼我們看下三種方法的區別

select版大媽做的是如下的事情:比如同學甲的朋友來了,select版大媽比較笨,她帶著朋友挨個房間進行查詢誰是同學甲

而poll和select差不太多, poll只是解決了 select的 FD問題, 但是本質並無大變化 依然無法很好支援高併發(檔案描述符的限制 ,感興趣的同學 可以自己搜尋相關文章)

epoll版大媽就比較先進了,她記下了同學甲的資訊,比如說他的房間號,那麼等同學甲的朋友到來時,只需要告訴該朋友同學甲在哪個房間即可,不用自己親自帶著人滿大樓的找人了

理解到這裡 目前就夠用了

接下來 檢查核心版本的方法很簡單 如下
符合我們的要求
1:先補補Linux系統和伺服器的基礎 打好Nginx執行的環境基礎

接下來 咱們在 Linux上 (Centos) 使用yum 安裝一些軟體, 這些軟體都是nginx必備的 我們分別來解釋一下
(yum就不用多介紹了吧 Centos/Redhat Linux 最重要的 軟體包安裝管理工具)

如下安裝的這些外掛 如果是平時經常配置NGINX的同學一定很常見,但是我們要知其所以然 不能總是跟著網上搜來的安裝教程複製幾個命令一跑完事

1: gcc編譯器的安裝

C/C++語言編譯器 我們後面的課程中 nginx最終都會採用原始碼編譯的方式來安裝
(Linux下兩種安裝nginx的方式, yum 和 原始碼編譯 , yum安裝的 直接就可以執行,簡單方便 但是無法自由擴充套件nginx功能, 原始碼編譯的方式 是把nginx的原始碼下載下來,然後我們自己通過編譯器 自己按照需求 生成我們需要的nginx ,這個方式麻煩的多 但是 卻自由度很高 也是企業中絕大部分的 部署開源軟體的方式)

況且 後面也會講到 自行修改開發nginx模組, 這些都離不開C/C++編譯器的哦
(不管是想學好Linux 還是深入Linux上執行的各種開源軟體, C語言都是必不可少的)

安裝的方式很簡單
yum install -y gcc gcc-c++

2: PCRE庫的安裝

PCRE這個平時應該也挺常見的吧 :) , 其實它的全稱是 Perl Compatibel Regular Expressions : Perl相容正則表示式

意思也就是說 ,如果你的NGINX以後在配置的過程中 需要使用正則表示式 就必須裝這個外掛(PCRE)
(所謂的正則表示式 就是一種使用各類特殊符號 來達到匹配或者過濾 字串的目的 是一種通用技能)

類似就是這樣的配置 :

rewrite ^(.*)index.php\?$ http://10.86.255.119$request_uri;

看著就頭暈有點 對不? ^_^ (其實這已經算很簡單的 正則了)
確實 正則表示式 不好學 很不容易找規律 而且最關鍵的是不好記憶 但是又非學不可
(後面我們會有專門的篇幅來學習它)

安裝的方式也很簡單

yum install -y pcre pcre-devel

3: zlib庫的安裝

nginx處理HTTP響應的時候,是可以支援gzip先壓縮 後傳輸的方式 進而來減少網路傳輸量的哦
如果你希望nginx開啟這個功能,就得把zlib編譯進入nginx中

1:先補補Linux系統和伺服器的基礎 打好Nginx執行的環境基礎

yum install -y zlib zlib-devel

4: OpenSSL庫的安裝

HTTPS大家不陌生吧 ,HTTP+SSL形成的更安全的傳輸協議 , 這個庫幾乎是預設必須安裝的
現在基本上大部分網站 都支援HTTPS 只有一部分介面依然走HTTP , 這也是大勢所趨了

yum install -y openssl openssl-devel

上面安裝的幾個軟體包 只不過是完成Web伺服器最基本功能所需的,後續 隨著我們不斷的深入學習,還有可能繼續再增加別的軟體包擴充套件 目前先了解清楚 這四個

必要的軟體包裝好了以後,咱們最後來看一下Linux核心引數的優化

大米先給大家解釋一下 為什麼要優化核心

我們平時總說 效能調優 效能優化之類的話對吧 其實說白了 就是通過各種引數調整 讓伺服器的效能達到最大化

一個伺服器上其實是存在這麼幾層的巢狀關係的 從最底層開始 依次是

物理硬體 作業系統 服務軟體 程式程式碼

其實優化的最終目的 是發揮物理硬體的最大效能 因為物理資源是不能隨意改變的

至於硬體往上的部分 其實是層層巢狀的關係 一個會制約另一個 就好比 作業系統中的最大連線數沒有放開 但是服務軟體配置中的放開了 也是沒有作用的 所以 這種巢狀關係有點像接在一起的 水龍帶 光是一段很寬沒用 必須都寬才行

接下來 咱們看下 針對咱們即將安裝的Nginx , Linux的核心引數優化 應該掌握些什麼

由於預設的Linux核心引數是最通用的場景,不符合咱們一直談的支援高併發的特性,所以 我們需要做出一些初步的調整 把作業系統 這一層的"水龍頭" 放開一些 ^_^

fs.file-max = 100000
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_max_tw_buckets = 5000
net.ipv4.ip_local_port_range = 1024 61000

核心的引數專案很多,因為我們在這兒不是專門講Linux核心優化的 所以先拿出幾個例子來簡單說一下

file-max 程序可以同時開啟的最大控制代碼數 (聽說過Linux一切皆檔案的說法吧) 這一項直接限制最大併發連線數

tcp_tw_reuse 允許將處於 TIME_WAIT狀態的socket重新用於新TCP連線, 平時我們在伺服器上 應該能看到大量的 TIME_WAIT狀態的連結對不?(netstat -an | grep -i wait) ,這對於處理高併發的伺服器來說 意義很大

keepalive_time 這個引數表示 TCP傳送keepalive訊息的頻度 ,預設是2個小時 這太長了。。。 設定的小一些 有利於清理無效的連結

port_range TCP/UDP 連線的埠範圍 , 建立一個連線就肯定會消耗掉一個埠 ,如果不把這個值改大了 高併發的時候 連線就無法建立了。。

做好如上的準備後 我從下一篇開始接觸NGINX啦~