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

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

buck com 解決 linu 查詢 命令 網絡連接 描述符 evel

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

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

那就是 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)

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

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

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

其實不是的哦 -_-

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

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

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

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

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

那什麽是動態網站呢?

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

技術分享圖片

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

輸入完成之後(比如:張三 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為例子 我們按照如下的方式操作和最終驗證即可

技術分享圖片

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

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

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

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

技術分享圖片

最後的 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版大媽就比較先進了,她記下了同學甲的信息,比如說他的房間號,那麽等同學甲的朋友到來時,只需要告訴該朋友同學甲在哪個房間即可,不用自己親自帶著人滿大樓的找人了

理解到這裏 目前就夠用了

接下來 檢查內核版本的方法很簡單 如下
符合我們的要求
技術分享圖片

接下來 咱們在 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中

技術分享圖片

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啦~

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