天天看點

企業級LNMP環境應用實踐

大約在2010年以前,網際網路公司最常用的經典web服務環境組合就是lamp(即linux,apache,mysql,php),近幾年随着nginx web服務的逐漸流行,又出現了新的web服務環境組合--lnmp或lemp,其中lnmp為linux,nginx,mysql,php等首字母的縮寫,而lemp中的e則表示nginx,它取自nginx名字的發音(engine x)。現在,lnmp已經逐漸成為國内大中型網際網路公司網站的主流組合環境,是以,我們必須熟練掌握lnmp環境的搭建,優化及維護方法。
在深入學習lnmp組合之前,有必要先來了解以下lnmp環境組合的基本原理,也就是它們之間到底是怎樣互相排程的? 在lnmp組合工作時,首先是使用者通過浏覽器輸入域名請求nginx web服務,如果請求是靜态資源,則由nginx解析傳回給使用者;如果是動态請求(.php結尾),那麼nginx就會把它通過fastcgi接口(生産常用方法)發送給php引擎服務(fastcgi程序php-fpm)進行解析,如果這個動态請求要讀取資料庫資料,那麼php就會繼續向後請求mysql資料庫,以讀取需要的資料,并最終通過nginx服務把擷取的資料傳回給使用者,這就是lnmp環境的基本請求順序流程。這個請求流程是企業使用lnmp環境的常用流程。
企業級LNMP環境應用實踐
mysql是網際網路領域裡非常重要的,深受廣大使用者歡迎的一款開源關系型資料庫軟體,由瑞典mysql ab公司開發與維護。2006年,mysql ab公司被sun公司收購,2008年,sun公司又被傳統資料資料庫領域大佬甲骨文(oracle)公司收購。是以,mysql資料庫軟體目前屬于oracle公司,但扔是開源的,oracle公司收購mysql的戰略意圖顯而易見,其自身的oracle資料庫繼續服務于傳統大中型企業,而利用收購的mysql搶占網際網路領域資料庫份額,完成其戰略布局。 mysql是一種關系型資料庫管理軟體,關系型資料庫的特點是将資料儲存在不同的二維表中,并且将這些表放入不同的資料庫中,而不是把所有資料統一放在一個大倉庫裡,這樣的設計增加了mysql的讀取速度,靈活性和可管理性也得到了很大提高。通路及管理mysql資料庫的最常用标準化語言為sql結構化查詢語言。
目前,絕大多數使用linux作業系統的網際網路企業都使用mysql作為後端的資料庫,從大型的bat門戶,到電商門戶平台,分類門戶平台等無一例外。那麼,mysql資料庫到底有哪些優勢和特點,讓大家毫不猶豫的選擇它呢?

原因可能有以下幾點

性能卓越,服務穩定,很少出現異常當機。

開放源代碼且無版權制約,自主性強,使用成本低。

曆史悠久,社群及使用者非常活躍,遇到問題,可以很快擷取到幫助。

軟體體積小,安裝使用簡單,并且易于維護,安裝及維護成本低。

支援多種作業系統,提供多種api接口,支援多種開發語言,特别是對流行的php語言無縫支援。

品牌口碑效應,使得企業無需考慮就直接用之。

mysql有幾種不同的産品線,且每種産品線又有很多不同的版本,這裡選擇目前企業使用最廣的社群版mysql5.5系列作為lnmp的組合環境資料庫平台。 mysql的安裝方法也有很多,常見的方法如下圖所示:
企業級LNMP環境應用實踐

備注:安裝mysql的注意事項如下:

(1)建議和之前介紹的nginx服務安裝在同一台機器上。

(2)重視操作過程的報錯輸出,有錯誤要解決掉再繼續,不能忽略編譯中的錯誤。

本例采用mysql二進制安裝包進行安裝示範

(1) 建立mysql使用者的賬号

(2)擷取mysql二進制軟體包

百度雲盤:http://pan.baidu.com/s/1hrbczsc

提取碼:4yjf

企業級LNMP環境應用實踐

(3) 采用二進制方式安裝mysql

[x] :當安裝lnmp一體化環境時,mysql資料庫要裝在nginx所在的機器上。如果mysql和nginx不在一台機器上,那麼,nginx伺服器上的mysql資料庫軟體包隻要解壓移動到/usr/local/目錄,改名為mysql就可以了,不需要進行後面的初始化配置。

[x] :在非一體的lnmp環境(nginx和mysql不在一台機器上),編譯php環境時,也是需要mysql資料庫環境的,但是高版本的php,例如5.3版本以上,内置了php需要的mysql程式,是以,對于此類版本就不需要在nginx伺服器上安裝mysql軟體了,隻需要在編譯php時指定相關參數即可。這個php的編譯參數為--with-mysql=mysqld,表示php程式在編譯時會調用内置的mysql的庫。

(4)初始化mysql配置檔案my.cnf

指令如下:

提示: support-files下有my.cnf的各種配置樣例。 使用cp全路徑/bin/cp,可實作拷貝而不出現替換提示,即如果有重名檔案會直接覆寫 本例為測試安裝環境,是以選擇參數配置小的my-small.cnf配置模版,如果是生産環境可以根據硬體選擇更進階的配置檔案,上述配置檔案模版對硬體的要求從低到高依次為:

(5)初始化mysql資料庫檔案

初始化指令如下:

以上的指令主要作用是生成如下資料庫檔案

這些mysql資料檔案是mysql正确運作所必需的基本資料庫檔案,其功能是對mysql權限,狀态等進行管理。

錯誤示例1:

錯誤示例2:

錯誤示例3:

此故障必須解除,否則,後面會出現登陸不了資料庫等問題。

(1)設定mysql啟動腳本,指令如下:

(2)mysql二進制預設安裝路徑是/usr/local/mysql,啟動腳本裡是/usr/local/mysql。如果安裝路徑不同,那麼腳本裡路徑等都需要替換

(3)啟動mysql資料庫,指令如下:

以上是啟動資料庫的規範方法之一,但還可以用如下方式啟動, <code>/usr/local/mysql/bin/mysqld_safe --user=mysql &amp;</code> 這個指令結尾的“&amp;”符号,作用是在背景執行mysql服務,指令執行完還需要按下回車才能進入指令行狀态。

(4)檢查mysql資料庫是否啟動,指令如下:

如果發現3306端口沒起來,請tail -100 /usr/local/mysql/data/主機名.err檢視日志資訊,看是否有報錯資訊,然後根據相關錯誤提示進行調試。經常檢視服務運作日志是個很好的習慣,也是高手的習慣。

(5)檢視mysql資料庫啟動結果日志,指令如下:

(6)設定mysql開機自啟動,指令如下:

提示:也可以将啟動指令/etc/init.d/mysqld start 放到/etc/rc.local裡面

(7)配置mysql指令的全局使用路徑,指令如下:

(8)登陸mysql測試,指令如下:

mysql安裝完成以後,預設情況下,root賬戶是無密碼的,這個必須要設定。

(1)為mysql的root使用者設定密碼,指令如下:

(2)清理無用的mysql使用者及庫,指令如下:

cgi的全稱為“通用網關接口”(common gateway interface),為http伺服器與其他機器上的程式服務通信交流的一種工具,cgi程式須運作在網絡伺服器上。 傳統cgi接口方式的主要缺點是性能較差,因為每次http伺服器遇到動态程式時都需要重新啟動解析器來執行解析,之後結果才會被傳回給http伺服器。這在處理高并發通路時幾乎是不可用的,是以就誕生了fastcgi。另外,傳統的cgi接口方式安全性也很差,故而現在已經很少被使用了。
fastcgi是一個可伸縮的,高速地在http伺服器和動态腳本語言間通信的接口(在linux下,fastcgi接口即為socket,這個socket可以是檔案socket,也可以是ip socket),主要優點是把動态語言和http伺服器分離出來。多數流行的http伺服器都支援fastcgi,包括apache,nginx和lighttpd等。 同時,fastcgi也被許多腳本語言所支援,例如目前比較流程的腳本語言php。fastcgi接口采用的是c/s架構,它可以将http伺服器和腳本解析伺服器分開,同時還能在腳本解析伺服器上啟動一個或多個腳本來解析守護程序。當http伺服器遇到動态程式時,可以将其直接傳遞給fastcgi程序來執行,然後将得到的結果傳回給浏覽器。這種方式可以讓http伺服器專一地處理靜态請求,或者将動态腳本伺服器的結果傳回給用戶端,這在很大程度上提高了整個應用系統的性能。

fastcgi的重要特點如下:

http伺服器和動态腳本語言間通信的接口或工具。

可把動态語言解析和http伺服器分離開。

nginx,apache,lighttpd,以及多數動态語言都支援fastcgi。

fastcgi接口方式采用c/s結構,分為用戶端(http伺服器)和伺服器端(動态語言解析伺服器)

php動态語言伺服器端可以啟動多個fastcgi的守護程序(例如php-fpm(fcgi process mangement))

http伺服器通過(例如nginx fastcgi_pass)fastcgi用戶端和動态語言fastcgi伺服器端通信(例如php-fpm)

nginx不支援對外部動态程式的直接調用或者解析,所有的外部程式(包括php)必須通過fastcgi接口來調用。fastcgi接口在linux下是socket,為了調用cgi程式,還需要一個fastcgi的wrapper(可以了解為用于啟動另一個程式的程式),這個wrappper綁定在某個固定的socket上,如端口或檔案socket。當nginx将cgi請求發送給這個socket的時候,通過fastcgi接口,wrapper接收到請求,然後派生出一個新的線程,這個線程調用解釋器或外部程式處理腳本來讀取傳回的資料;接着,wrapper再将傳回的資料通過fastcgi接口,沿着固定的socket傳遞給nginx;最後,nginx将傳回的資料發送給用戶端,這就是nginx+fastcgi的整個運作過程。
企業級LNMP環境應用實踐

fastcgi的主要優點是把動态語言和http伺服器分離開來,使nginx專門處理靜态請求及向後轉發的動态請求,而php/php-fpm伺服器則專門解析php動态請求。

(1)檢查确認nginx及mysql的安裝路徑,指令如下:

(2)檢查端口及啟動情況,指令如下:

(3)測試通路nginx及mysql是否ok,指令如下:

如果通路結果和上述一緻,就表明nginx及mysql的安裝一切正常

php程式在開發及運作時會調用一些諸如zlib,gd等函數庫,是以需要确認lib庫是否已經安裝,執行過程如下:

[x] :每個lib一般都會存在對應的以“*-devel”命名的包,安裝lib對應的-devel包後,對應的lib包就會自動安裝好,例如安裝gd-devel時就會安裝gd。 [x] :這些lib庫不是必須安裝的,但是目前的企業環境下一般都需要安裝。否則,php程式運作時會出現問題,例如驗證碼無法顯示等。

執行下面指令安裝相關的lib軟體包

安裝後的結果如下:

從以上結果看出,僅有libiconv-devel這個包沒有安裝,因為預設的yum源沒有此包,後面會編譯安裝。
推薦使用簡單的線上yum的方式安裝:wget -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo 編譯安裝過程略 [root@localhost yum.repos.d]# yum -y install libmcrypt-devel
[root@localhost yum.repos.d]# yum -y install mhash
[root@localhost yum.repos.d]# yum -y install mcrypt

執行上述指令後,最後的正确輸出提示為下圖

企業級LNMP環境應用實踐

對于上面指令,部分參數說明如下:

[x] :--prefix=/usr/local/php5.2.28

表示指定php的安裝路徑為/usr/local/php5.3.28

[x] :--with-mysql=/usr/local/mysql

表示需要指定mysql的安裝路徑,安裝php需要的mysql相關内容。當然,如果沒有mysql軟體包,也可以不單獨安裝,這樣的情況可使用--with-mysql=mysqlnd替代--with-mysql=/usr/local/mysql,因為php軟體裡已經自帶了連接配接mysql的用戶端工具。

[x] :--with-fpm-user=www

nginx表示指定php-fpm程序管理的使用者為www,此處最好和nginx服務使用者統一

[x] : --with-fpm-group=www

表示指定php-fpm程序管理的組為www,此處最好與nginx服務使用者組統一。

[x] :--enable-fpm

表示激活php-fpm方式服務,即以fastcgif方式運作php服務。

正确執行前文配置php軟體的./configure系列指令後,就可以編譯php軟體了,具體操作過程如下:

<code>[root@localhost php-5.3.28]# make install</code>

(1)設定軟連結以友善通路,指令如下:

(2)檢視php配置預設模版檔案,指令如下:

請注意以上兩檔案的異同之處,可通過diff或vimdiff指令比較,如下圖所示:
企業級LNMP環境應用實踐

從對比結果可以看出,開發環境更多的是開啟日志,調試資訊,而生産環境都是關閉狀态

(3)拷貝php配置檔案到php預設目錄,并更改檔案名稱為php.ini,指令如下:

關于php-fpm.conf,暫時可用預設的配置,先把服務搭好,以後再進行優化。

(1)啟動php服務php-fpm,指令如下:

(2)檢查php服務php-fpm的程序及啟動端口的情況,指令如下:

(1)檢視nginx目前的配置,指令如下:

(2)php解析,這裡以blog為例講解,内容如下:

最終blog虛拟機的完整配置如下:

可通過如下指令檢查nginx配置檔案的文法:

此步在生産環境很關鍵,如不提前檢查文法,重新開機後發現文法錯誤會導緻nginx無法提供服務,,給使用者通路體驗帶來不好的影響。

(1)測試php解析請求是否ok

1)進入指定的預設站點目錄後,編輯index.php,添加如下内容:

以上代碼為顯示php配置資訊的簡單php檔案代碼

注意: 對于初學者來說,以上内容最好手工錄入而不要拷貝,否則可能會導緻意外結果。

2)調整windows下的host解析(192.168.0.121為目前的機器ip),指令如下:

<code>192.168.0.121 www.yunjisuan.com mail.yunjisuan.com yunjisuan.com blog.yunjisuan.com</code>

3)打開浏覽器,輸入http://blog.yunjisuan.com/test_info.php 即可打開如下圖所示界面:

企業級LNMP環境應用實踐

出現上述界面,表示nginx配合php解析已經正常。

(2)針對nginx請求通路php,然後對php連接配接mysql的情況進行測試

編輯test_mysql.php,加入如下内容:

測試結果如下:

企業級LNMP環境應用實踐

至此,lnmp的組合已基本搭建完畢。當然,我們還沒有做相關優化,是以,我們需要将虛拟機儲存好。留待以後之用

wordpress 是一套利用php語言和mysql資料庫開發的開源免費的blog(部落格,網站)程式,使用者可以在支援php環境和mysql資料庫的伺服器上建立blog站點。它的功能非常強大,擁有衆多插件,易于擴充功能。其安裝和使用也都非常友善。目前wordpress已經成為搭建blog平台的主流,很多釋出平台都是根據wordpress二次開發的,如果你也想像他們一樣擁有自己的blog,可購買網上的域名及空間,然後搭建lnmp環境,部署wordpress程式後就可以輕松成就自己的夢想了。
wordpress是單使用者個人部落格,與blog.51cto.com的多使用者部落格是有差別的。

(1)mysql資料庫配置準備

1)登陸mysql資料庫,操作如下:

2)建立一個專用的資料庫wordpress,用于存放blog資料,操作如下:

3)建立一個專用的wordpress blog管理使用者,指令如下:

(2)nginx及php環境配置準備

1)選擇之前配置好的支援lnmp的blog域名對應的虛拟主機,指令如下:

2)擷取wordpress部落格程式,并放置到blog域名對應虛拟主機的站點目錄下,即/var/www/html/blogcom,操作指令如下:

很多開源程式都支援浏覽器傻瓜式的界面安裝,此處也用這種方法。

1)打開浏覽器輸入blog.yunjisuan.com(提前做好hosts或dns解析),回車後,出現下圖:

企業級LNMP環境應用實踐

2)仔細閱讀頁面的文字資訊後,單擊“現在就開始”按鈕繼續,然後在出現的頁面表單上填寫相應的内容,如下圖所示:

企業級LNMP環境應用實踐

3)在頁面表單裡填好内容後,單擊結尾的“送出”按鈕繼續,得到下圖:

企業級LNMP環境應用實踐

4)出現上圖就表示可以安裝了,單擊“進行安裝”按鈕繼續,進入下圖:

企業級LNMP環境應用實踐

5)根據界面提示設定blog站點的資訊後,單擊“安裝wordpress”按鈕繼續。

出現下圖所示的資訊就表明已經成功安裝了wordpress部落格。

企業級LNMP環境應用實踐

(1)背景登入,如下圖:

企業級LNMP環境應用實踐
企業級LNMP環境應用實踐
其他功能同學們自己玩
實作此功能時,首先要在wordpress背景依次單擊設定---&gt;固定連結---&gt;自定義結構,然後輸入下面的代碼,并儲存更改。
企業級LNMP環境應用實踐

接着,在nginx配置檔案的server容器中添加下面的代碼:

最後檢查文法并重新加載nginx服務,操作如下:

現在可以通過浏覽器通路了,如下圖所示:

企業級LNMP環境應用實踐

lnmp的組合中各元件工作排程邏輯關系。

nginx與php通過fastcgi模式通信的原理。

lnmp環境的企業級搭建。

wordpress部落格程式的安裝搭建與url靜态化

繼續閱讀