Nginx服務

Nginx(發音同 engine x)是一款輕量級的Web 服務器/反向代理服務器及電子郵件(IMAP/POP3)代理服務器,並在一個BSD-like 協議下發行。由俄羅斯的程序設計師Igor Sysoev所開發,供俄國大型的入口網站及搜索引擎Rambler(俄文:Рамблер)使用。其特點是佔有內存少,併發能力強,事實上nginx的併發能力確實在同類型的網頁服務器中表現較好,中國大陸使用nginx網站用戶有:新浪網易騰訊等。

101002989.png

Nginx (“engine x”) 是一個高性能的 HTTP 和 反向代理服務器,也是一個 IMAP/POP3/SMTP 代理服


1Apache服務器和nginx的優缺點:
我們之前大量使用Apache來作爲HTTPServerApache具有很優秀的性能,而且通過模塊可以提供各種豐富的功能。
1)首先Apache對客戶端的響應是支持併發的 ,運行httpd這個daemon進程之後,它會同時產生多個子進程/線程,每個子進程/線程分別對客戶端的請求進行響應;


Apache兩種工作模式:prefork模式與worker模式


prefork每個子進程只有一個線程,效率高但消耗內存大,是lunix下默認的模式;worker模式每個子進程有多個線程,內存消耗低,但一個線程崩潰會牽連其它同子進程的線程。
2)另外,Apache可以提供靜態和動態的服務 ,例如對於PHP的解析不是通過性能較差的CGI實現的而是通過支持PHP的模塊來實現的(通常爲mod_php5,或者叫做apxs2)
3)缺點:
因此通常稱爲Apache的這種Serverprocess-based server ,也就是基於多進程的HTTPServer,因爲它需要對每個用戶請求創建一個子進程/線程進行響應;
這樣的缺點是,如果併發的請求非常多(這在大型門戶網站是很常見的)就會需要非常多的線程,從而佔用極多的系統資源CPU和內存。因此對於併發處理不是Apache的強項。
4)解決方法:
目前來說出現了另一種WebServer,在併發方面表現更加優越,叫asynchronous servers異步服務器。最有名的爲NginxLighttpd。所謂的異步服務器是事件驅動程序模式的event-driven,除了用戶的併發請求通常只需要一個單一的或者幾個線程。因此佔用系統資源就非常少。這幾種又被稱爲lightweight web server。舉例,對於10,000的併發連接請求,nginx可能僅僅使用幾M的內存;而Apache可能需要使用幾百M的內存資源。
使用Apache來作爲HTTPServer的情況我這裏不再多做介紹;上面我們介紹到Apache對於PHP等服務器端腳本的支持是通過自己的模塊來實現的,而且性能優越。
我們同樣可以使用nginx或者lighttpd來作爲HTTPServer來使用。
nginxApache類似都通過各種模塊可以對服務器的功能進行豐富的擴展,同樣都是通過conf配置文件對各種選項進行配置。對於PHP等,nginx沒有內置的模塊來對PHP進行支持,而是通過FastCGI來支持的。
nginx則沒有自己提供處理PHP的功能,需要通過第三方的模塊來提供對PHP進行FastCGI方式的集成。


Nginx(發音engine x)專爲性能優化而開發,其最知名的優點是它的穩定性和低系統資源消耗,以及對HTTP併發連接的高處理能力(單臺物理服務器可支持3000050000個併發請求)。正因爲如此,大量提供社交網站、新聞資訊、電子商務以及虛擬主機等服務的企業紛紛選擇Ngnix來提供WEB服務。


2Nginx的安裝及運行控制:


目前Nginx的最新穩定版本爲1.0.8,開發版本爲1.1.6,其安裝文件可以從官方網站http://www.nginx.org下載,下面以穩定版爲例,介紹nginx的安裝和運行控制。

編譯安裝Nginx

1)安裝支持軟件:

Nginx的配置及運行需要pcrezlib等軟件包的支持,因此應預先安裝這些軟件的開發包(devel),以便提供相應的庫和頭文件,確保Nginx的安裝順利完成。

101408576.png

2)創建運行用戶、組:

Nginx服務程序默認以nobody身份運行,建議爲其創建專門的用戶賬號,以便更準確地控制其訪問權限,增加靈活性、降低安全風險。如:創建一個名爲nginx的用戶,不建立宿主目錄,也禁止登錄到shell環境。

101442852.png

3)編譯安裝nginx

釋放nginx源碼包

101931365.png

編譯前配置:

102010297.png注:配置前可以參考:./configure --help給出說明

--prefix:設定Nginx的安裝目錄

--usergroup:指定Nginx運行用戶和組

--with-http_stub_status_module:啓用http_stub_status_module模塊以支持狀態統計

編譯:

102108138.png

安裝:

102132484.png

至此Nginx安裝完成,爲了使Nginx服務器的運行更加方便,可以爲主程序nginx創建鏈接文件,以便管理員直接執行nginx命令就可以調用Nginx的主程序。

102207617.png

Nginx的運行控制:

apache的主程序httpd類似,Nginx的主程序也提供了-t選項用來對配置文件進行檢查,以便找出不當或錯誤的配置。配置文件nginx.conf默認位於安裝目錄下的conf/子目錄中。若要檢查位於其他位置的配置文件,可使用-c選項來指定路徑。

102230803.png

啓動、停止Nginx

直接運行nginx即可啓動Nginx服務器,這種方式將使用默認的配置文件,若要改用其他配置文件,需添加-c 配置文件路徑選項來指定路徑。需要注意的是,若服務器中已安裝有httpd等其他WEB服務軟件,應採取措施避免部突。

102256178.png

通過檢查Nginx程序的監聽狀態,或者在瀏覽器中訪問此WEB服務(默認頁面將顯示“Welcome to nginx!”),可以確認Nginx服務是否正常運行。

102325233.png

或使用elinks瀏覽器(需安裝elinks軟件包。yum -y install elinks

102416751.png

注意:要在防火牆上允許80端口的通信。

停止Nginx服務:

#Killall -9 nginx

Nginx進程運行時,PID號默認存放在logs/目錄下的nginx.pid文件中,因此若改用kill命令,也可以根據nginx.pid文件中的PID號來進行控制。

爲了使Nginx服務的啓動、停止、重載等操作更加方便,可以編寫Nginx服務腳本,並使用chkconfigservice工具來進行管理,也更加符合RHEL系統的管理習慣。

102503224.png

腳本內容如下:

102530242.png

102554499.png

注:通過killkillall命令發送HUP信號表示重載配置, 用新的配置開始新的工作進程
關閉舊的工作進程QUIT信號表示退出進程,KILL信號表示殺死進程。通過-s選項指定信號種類。

添加爲系統服務。

102622610.png

這樣一來,就可以通過nginx腳本來啓動、停止、重啓、重載Nginx服務器了。

3、配置文件nginx.conf

Nginx服務器的主配置文件nginx.conf中,包括全局配置、I/O事件配置、HTTP配置這三大塊內容,配置語句的格式爲關鍵字 值;(末尾以分號表示結束),以#開始的部分表示註釋。

1)全局配置

由各種配置語句組成,不使用特定的界定標記。全局配置部分包括運行用戶、工作進程數、錯誤日誌、PID存放位置等基本設置。

常用配置項:

user nobody;

//運行用戶,Nginx的運行用戶實際是編譯時指定的nginx,若編譯時未指定則默認爲nobody

worker_processes 2;

//指定nginx啓動的工作進程數量,建議按照cpu數目來指定,一般爲它的倍數

worker_cpu_affinity 00000001 00000010;

//爲每個進程分配cpu,上例中將2個進程分配到cpu,當然可以寫多個,或者將一個

進程分配到多個cpu

worker_rlimit_nofile 102400;

//這個指令是指當一個nginx進程打開的最多文件數目,理論值應該是最多打開文件數(ulimit

-n)與nginx進程數相除,但是nginx分配請求並不是那麼均勻,所以最好與ulimit -n的值

保持一致。(通過ulimit n 數值可以修改打開的最多文件數目)

error_log logs/error.log; //全局錯誤日誌文件的位置

pid logs/nginx.pid; //PID文件的位置

2)I/O事件配置:

使用events {}界定標記,用來指定Nginx進程的I/O響應模型,每個進程的連接數等設置

events {

use epool; //使用epool模型,對於2.6以上的內核,建議使用epool模型以提高性能

worker_connections 4096; //每個進程允許的最多連接數(默認爲1024)每個進程的連接數應根據實際需要來定,一般在10000以下,理論上每臺nginx服務器的最大連接數爲worker_processes*worker_connections,具體還要看服務器的硬件、帶寬等。

}

3HTTP配置

使用http{}界定標記,包括訪問日誌、HTTP端口、網頁目錄、默認字符集、連接保持、以

及虛擬主機、PHP解析等一系列設置。其中大部分配置語句包含在子界定標記servier {}內。

http {
#設定mime類型,即conf/目錄下的mime.types文件中的設定。
include mime.types;
default_type application/octet-stream;
#設定日誌格式
log_format main '$remote_addr - $remote_user [$time_local]'
'"$request" $status $bytes_sent '
'"$http_referer" "$http_user_agent" '
'"$gzip_ratio"';
log_format download '$remote_addr - $remote_user [$time_local] '

'"$request" $status $bytes_sent '
'"$http_referer" "$http_user_agent" '
'"$http_range" "$sent_http_content_range"';
#設定access log
access_log logs/access.log main;
sendfile on; //支持文件發送(下載)
keepalive_timeout 65; //連接保持超時
#設定虛擬主機
server { //用來配置虛擬主機
listen 80; //WEB服務的監聽設置,可以採用IP地址:端口形式
server_name www.lnmp.com;//網站名,稱可以寫多個名稱,用空格分隔

location / { //表示如何匹配後面的路徑的

index index.html;//默認首頁

root html; //網頁根目錄位置,默認爲Nginx安裝目錄下的html/子目錄,root語句用來設置特定訪問位置的網頁文檔路徑,根據需要可改爲/var/www/html等其他路徑。

}

charset gb2312; //網頁的默認字符集
#設定本虛擬主機的訪問日誌
access_log logs/www.lnmp.com.access.log main;

error_page 500 502 503 504 /50x.html; //內部錯誤的反饋頁面

location = /50x.html {

root html;

}
}
}

Nginxlocation

基本語法:
location [=|~|~*|^~] /uri/ { … }

=表示做精確匹配
~:爲區分大小寫匹配
~*: 爲不區分大小寫匹配
!~:!~* 分別爲區分大小寫不匹配及不區分大小寫不匹配

正則表達式匹配,其中:
文件及目錄匹配,其中:
-f !-f 用來判斷是否存在文件
-d!-d 用來判斷是否存在目錄
-e!-e 用來判斷是否存在文件或目錄
-x !-x 用來判斷文件是否可執行

示例1:

location = / {
# 只匹配 / 查詢。
}

location / {

#匹配任何查詢,因爲所有請求都已 / 開頭。但是正則表達式規則和長的塊規則將被優先和查詢匹配

}

示例2:

location ^~ /p_w_picpaths/ {
# 匹配任何以 /p_w_picpaths/ 開頭的任何查詢並且停止搜索。任何正則表達式將不會被測試。
}

示例3:

location ~* \.(gif|jpg|jpeg)$ {
# 匹配任何以 gifjpg jpeg 結尾的請求。
}

4、狀態統計及虛擬主機應用:

1) Nginx內置了HTTP_STUB_STATUS狀態統計模塊,用來反饋當前的WEB訪問情況。配置

編譯參數時可添加with-http_stub_stastus_module來啓用此模塊。要使用Nginx的狀態統計功能,除了啓用內建模塊以外,還需要修改nginx.conf文件,指定訪問位置並打開stub_status配置。在http{}配置的server{}子配置內添加如下配置項

103024714.png

注:location /tongji //匹配任何包含/tongji的任何查詢

stub_status on //打開狀態統計功能

Access_log off //關閉此位置的日誌記錄

Nginx 支持爲目錄添加密碼認證,使用apache htpasswd 來創建密碼文件

htpasswd -c/usr/local/nginx/.htpasswd 用戶名

保存修改過的nginx.conf文件並重啓nginx服務使修生效。

新的配置生效後,在瀏覽器中訪問Nginx服務器的/tongji網站位置(http://web服務器

IP/tongji)可以看到狀態統計信息

103048193.png

如上圖所示:

active connections — 發起的活動連接數

server accepts handled requests — nginx 總共處理了 2 個連接, 成功創建 2 次握手 (證明中間沒有失敗的), 總共處理了 4 個請求 (平均每次握手處理了 2個數據請求)

客戶端訪問控制:

103144931.png

注:allow 允許規則,deny拒絕規則;規則的執行是按從上向下執行,匹配某條規則後將不

再檢查其他規則。

2)虛擬主機:

使用Nginx搭建虛擬主機服務器時,每個虛擬WEB站點擁有獨立的server {}配置段,各自

監聽的IP地址、端口號可以單獨指定,當然網站名稱也是不同的。

例如:要創建兩個站點www.benet.comwww.accp.com

爲兩個虛擬WEB主機分別建立根目錄,並準備測試首頁

103211491.png

調整nginx.conf配置文件---域名虛擬主機

配置兩個server {}區域,分別對應兩個WEB站點,指定各自的網站名稱、監聽地址、網站

根目錄、訪問日誌等信息,然後重載配置

103237515.png

測試:使用瀏覽器分別通過www.benet.comwww.accp.com訪問兩個WEB站點(注意域

名解析。

5LEMP架構及應用部署:

就像構建LAMP平臺一樣,構建LEMP平臺也需要LINUX服務器、MYSQL數據庫、PHP解析

環境,區別主要在於NginxPHP的協作配置上

1) 以編譯方式安裝Nginx(過程參照上面相關介紹完成)

2) 安裝MYSQL數據庫----------以編譯方式安裝

釋放MYSQL的源碼包:

103311389.png

編譯前配置:

103337867.png

注:--with-charset:指定默認使用的字符集編碼;--with-collation:指定默認使用的字符集校對規則,utf8_general_ci是適用於UTF-8字符集的通用規則;--with-extra-charsets:指定額外支持的其他字符集編碼。

編譯並安裝MYSQL

103432114.png

優化調整:

103515581.png

103515175.png

初始化數據庫:

103549345.png

103549145.png

啓動MYSQL服務及爲root用戶設置密碼:

103622495.png

1) 安裝PHP解析環境:

較新版本(如5.3)的PHP已經自帶FPM(fastCGI process manager,FastCGI進程管理器)模塊,用來對PHP解析實例進行管理,優化解析效率,因此在配置PHP編譯選項時應添加--enable-fpm以啓用此模塊。

爲了提高PHP解析效率,建議將相應版本的ZendGuardLander也裝上

釋放PHP源碼包:

103652603.png

編譯前配置:

103716916.png

注:在RHEL664系統中按上面的配置項配置可能會報以下錯誤,如果要是報錯的話請按如下方法解決:

103748484.png

解決方法:

根據報錯發現是因爲libpng.solibpng.a找不到,但libpng的相關軟件包我已經安裝了,如下圖查詢結果,發現libpng的包都安裝了。

103835956.png

那爲什麼還報libpng.solibpng.a找不到呢?

要解決問題就是它沒找到,我安裝了的,那我得去找找看它到底是放那裏去了。執行下列命令,可以查找libpng.so在那裏。

103908405.png

104010649.png

通過上面的搜索其實就知道一些原因了,configure一般的搜索編譯路徑爲/usr/lib/,因爲php默認就在/usr/lib/下找相關庫文件,x64機器上是在:/usr/lib64.這時你就可以直接把需要的庫文件從/usr/lib64中拷貝到/usr/lib/中去就可以了

104036643.png

解決完後重新執行./configure進行編譯前的配置

如果報configure: error: libjpeg.(a|so) not found錯誤解決方法和上面的解決方法類似。具體操作如下:

104131142.png

104208752.png

如果報下面錯誤

usr/bin/install: cannot create regular file `/usr/local/man/man1/cjpeg.1': No such file or directory
make: *** [install] Error 1
提示找不到目錄。既然電腦找不到,咱們人腦可以找嘛,自己先創建先
mkdir /usr/local/man
mkdir /usr/local/man1 創建完了再來

類似錯誤很多,方法也很多,我們得靈活應變,具體問題具體分析!

編譯並安裝PHP

104235654.png

注:

安裝後的調整:

104317354.png

安裝ZendGuardLander(注:若RHEL664位系統,該軟件得到其官網下載64位的相應軟件包,若用32位的就會報錯。下載地址:http://www.zend.com/en/products/guard/downloads)

104349882.png

修改php.ini文件:

104411227.png

php.ini中添加如下配置

104440831.png

配置Nginx支持PHP環境:

若要讓Nginx能夠解析PHP網頁,有兩種方法可以選 擇;其一,充當中介,將訪問PHP頁面的WEB請求轉交給其他服務器(LAMP)去處理;其二,通過使用PHPFPM模塊來調用本機的PHP環境

如果選用FPM方式,則需要先啓動php-fpm進程,以便監聽PHP解析請求。參考範例建立php-fpm.conf配置文件,並修改其中的PID文件、運行用戶、服務數(進程數量)等相關設置,然後啓動php-fpm程序即可(默認監聽本機的9000端口)

104530462.png

104530681.png

修改內容如下:

104631878.png

//確認pid文件位置

104702603.png

//運行用戶和運行組

104747784.png

//啓動時開啓的進程數、最少空閒進程數、最多空閒進程數

按以上提示修改php-fpm.conf文件,改完後保存退出。

啓動php-fpm並查看地址監聽。

104840456.png

php-fpm.conf文件中,pid配置行指出了PID信息的存放位置,對應的實際路徑爲/usr/local/php5/var/run/php-fpm.pid,根據上述信息,可以修改Nginx服務腳本,以便在啓動/停止Nginx服務器時將php-fpm進程也自動啓動/停止。

104925485.png

nginx服務腳本中添加如下內容:

104949617.png

這樣一爲,一旦啓動或關閉nginx服務,php-fpm程序也會隨之啓動或關閉,不需要額外再啓動或關閉php-fpm.

1) 配置Nginx支持PHP解析:

無論是將PHP頁面交給LAMP服務器去解析,還是調用本機的php-fpm進程進行解析,都需要在server{}配置段中添加location設置,以便指定當訪問.php面頁時採取何種操作。

對於第一種方法(轉交給其他WEB服務器處理),使用的配置語句如下所示,例如,交給IP地址爲192.168.0.200LAMP服務器處理,從而實現由Nginx負責靜態頁面,LAMP負責動態頁面的分離效果。

server {

…… //省略部分信息

location ~ \.php$ { //訪問.php頁面的配置段

proxy_pass http://192.168.0.200:80; //APACHE服務器的監聽地址

}

上面這種寫法只是發送以.php爲後綴的頁面訪問請求給其他WEB服務器,如果有其格式的文件訪問(如:htmljpg等)就會出問題。訪問不了了。

或者

location / { //訪問.php頁面的配置段

proxy_pass http://192.168.0.200:80; //APACHE服務器的監聽地址

}

}

對於第二種方法(調用本機的php-fpm進程),使用的配置語句如下所示。在conf/目錄下的fastcgi.conf文件中已經包含必需的宏設置,可通過include語句添加進來。

server {

…… //省略部分信息

location ~ \.php$ { //訪問php頁面的配置段

root /var/www/benet; //PHP網頁文檔根目錄

fastcgi_pass 127.0.0.1:9000; //php-fpm的監聽地址

fastcgi_index index.php; //PHP首頁文件

include fastcgi.conf; //包括fastcgi.conf樣本配置

}

}

本文檔中我選擇的是第二種方法,完成修改後重新加載nginx服務即可生效。

105056811.png

PHP頁面訪問測試:

PHP文檔根目錄下創建一個測試網頁,以便測試PHP語名能否正常解析,以及能否訪問MYSQL數據庫。測試頁內容如下 :

105123796.png

105123386.png

然後訪測試頁如:http://www.benet.com/test.php若能看到成功提示信息表示一切正常。

1) LEMP平臺中部署WEB應用:

LEMP平臺與LAMP平臺是非常相似的,區別主要在於所用WEB服務軟件的不同,而這與使用PHP開發的WEB應用程序並無太大關係,因此PHP應用的部署方法也是類似的,

下面以“天空網絡電影系統(簡稱SKYUC)”爲例介紹在LEMP平臺中的部署過程。

釋放並部署程序代碼:

105206971.png

創建數據庫:

105222958.png

安裝WEB應用:

訪問http://www.benet.com/skyuc/install/index.php,將會打開SKYUC的安裝程序,根據頁面提示,只需三步即可完成安裝。要注意適當調整權限,最簡單方法是:

105247161.png

完成安裝後,注意將install/目錄轉移,以避免重複安裝,降低安全風險。

105327577.png

訪問WEB應用系統:

通過訪問http://www.benet.com/skyuc就可以訪問了。

架設Discuz論壇:

建立用於bbs論壇的數據庫及用戶:

105351541.png

解壓下載的軟件包,上傳程序文件:

105442832.png

105442622.png

105442435.png

在瀏覽器中訪問http://www.benet.com/bbs/install根據嚮導頁面的提示進行安裝

注:請將 php.ini 中的 short_open_tag 設置爲 On然後重啓WEB服務,否則程序無法正常運行,修改後要重啓nginx服務。

通過訪問http://www.benet.com/bbs就可以訪問了。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章