一、Nginx網站服務
Nginx (“engine x”) 是一個高性能的 HTTP 和反向代理服務器,也是一個IMAP/POP3/SMTP 代理服
1、Apache服務器和nginx的優缺點:
我們之前大量使用Apache來作爲HTTPServer。Apache具有很優秀的性能,而且通過模塊可以提供各種豐富的功能。
1)首先Apache對客戶端的響應是支持併發的,運行httpd這個daemon進程之後,它會同時產生多個子進程/線程,每個子進程/線程分別對客戶端的請求進行響應;
Apache兩種工作模式:是prefork模式與worker模式
prefork每個子進程只有一個線程,效率高但消耗內存大,是lunix下默認的模式;worker模式每個子進程有多個線程,內存消耗低,但一個線程崩潰會牽連其它同子進程的線程。
2)另外,Apache可以提供靜態和動態的服務,例如對於PHP的解析不是通過性能較差的CGI實現的而是通過支持PHP的模塊來實現的(通常爲mod_php5,或者叫做apxs2)。
3)缺點:
因此通常稱爲Apache的這種Server爲process-based server,也就是基於多進程的HTTPServer,因爲它需要對每個用戶請求創建一個子進程/線程進行響應;
這樣的缺點是,如果併發的請求非常多(這在大型門戶網站是很常見的)就會需要非常多的線程,從而佔用極多的系統資源CPU和內存。因此對於併發處理不是Apache的強項。
4)解決方法:
目前來說出現了另一種WebServer,在併發方面表現更加優越,叫做asynchronousservers異步服務器。最有名的爲Nginx和Lighttpd。所謂的異步服務器是事件驅動程序模式的event-driven,除了用戶的併發請求通常只需要一個單一的或者幾個線程。因此佔用系統資源就非常少。這幾種又被稱爲lightweight web server。舉例,對於10,000的併發連接請求,nginx可能僅僅使用幾M的內存;而Apache可能需要使用幾百M的內存資源。
使用Apache來作爲HTTPServer的情況我這裏不再多做介紹;上面我們介紹到Apache對於PHP等服務器端腳本的支持是通過自己的模塊來實現的,而且性能優越。
我們同樣可以使用nginx或者lighttpd來作爲HTTPServer來使用。
nginx和Apache類似都通過各種模塊可以對服務器的功能進行豐富的擴展,同樣都是通過conf配置文件對各種選項進行配置。對於PHP等,nginx沒有內置的模塊來對PHP進行支持,而是通過FastCGI來支持的。
nginx則沒有自己提供處理PHP的功能,需要通過第三方的模塊來提供對PHP進行FastCGI方式的集成。
Nginx(發音enginex)專爲性能優化而開發,其最知名的優點是它的穩定性和低系統資源消耗,以及對HTTP併發連接的高處理能力(單臺物理服務器可支持30000~50000個併發請求)。正因爲如此,大量提供社交網站、新聞資訊、電子商務以及虛擬主機等服務的企業紛紛選擇Ngnix來提供WEB服務。
2、Nginx的安裝及運行控制:
目前Nginx的最新穩定版本爲1.0.8,開發版本爲1.1.6,其安裝文件可以從官方網站http://www.nginx.org下載,下面以穩定版爲例,介紹nginx的安裝和運行控制。
編譯安裝Nginx
1)安裝支持軟件:
Nginx的配置及運行需要pcre、zlib等軟件包的支持,因此應預先安裝這些軟件的開發包(devel),以便提供相應的庫和頭文件,確保Nginx的安裝順利完成。
2)創建運行用戶、組:
Nginx服務程序默認以nobody身份運行,建議爲其創建專門的用戶賬號,以便更準確地控制其訪問權限,增加靈活性、降低安全風險。如:創建一個名爲nginx的用戶,不建立宿主目錄,也禁止登錄到shell環境。
3)編譯安裝nginx:
釋放nginx源碼包
編譯前配置:
注:配置前可以參考:./configure--help給出說明
--prefix:設定Nginx的安裝目錄
--user和—group:指定Nginx運行用戶和組
--with-http_stub_status_module:啓用http_stub_status_module模塊以支持狀態統計
編譯:
安裝:
至此Nginx安裝完成,爲了使Nginx服務器的運行更加方便,可以爲主程序nginx創建鏈接文件,以便管理員直接執行nginx命令就可以調用Nginx的主程序。
Nginx的運行控制:
與apache的主程序httpd類似,Nginx的主程序也提供了”-t”選項用來對配置文件進行檢查,以便找出不當或錯誤的配置。配置文件nginx.conf默認位於安裝目錄下的conf/子目錄中。若要檢查位於其他位置的配置文件,可使用”-c”選項來指定路徑。
啓動、停止Nginx:
直接運行nginx即可啓動Nginx服務器,這種方式將使用默認的配置文件,若要改用其他配置文件,需添加”-c配置文件路徑”選項來指定路徑。需要注意的是,若服務器中已安裝有httpd等其他WEB服務軟件,應採取措施避免部突。
通過檢查 Nginx程序的監聽狀態,或者在瀏覽器中訪問此WEB服務(默認頁面將顯示“Welcome tonginx!”),可以確認Nginx服務是否正常運行。
或使用elinks瀏覽器(需安裝elinks軟件包。yum-y installelinks)
注意:要在防火牆上允許80端口的通信。
停止Nginx服務:
#Killall-9nginx
當Nginx進程運行時,PID號默認存放在logs/目錄下的nginx.pid文件中,因此若改用kill命令,也可以根據nginx.pid文件中的PID號來進行控制。
爲了使Nginx服務的啓動、停止、重載等操作更加方便,可以編寫Nginx服務腳本,並使用chkconfig和service工具來進行管理,也更加符合RHEL系統的管理習慣。
腳本內容如下:
注:通過kill或killall命令發送HUP信號表示重載配置, 用新的配置開始新的工作進程
關閉舊的工作進程。QUIT信號表示退出進程,KILL信號表示殺死進程。通過”-s”選項指定信號種類。
添加爲系統服務。
這樣一來,就可以通過nginx腳本來啓動、停止、重啓、重載Nginx服務器了。
3、配置文件nginx.conf:
在Nginx服務器的主配置文件nginx.conf中,包括全局配置、I/O事件配置、HTTP配置這三大塊內容,配置語句的格式爲”關鍵字值;”(末尾以分號表示結束),以”#”開始的部分表示註釋。
1)全局配置
由各種配置語句組成,不使用特定的界定標記。全局配置部分包括運行用戶、工作進程數、錯誤日誌、PID存放位置等基本設置。
常用配置項:
usernobody;
//運行用戶,Nginx的運行用戶實際是編譯時指定的nginx,若編譯時未指定則默認爲nobody
worker_processes 2;
//指定nginx啓動的工作進程數量,建議按照cpu數目來指定,一般爲它的倍數
worker_cpu_affinity 0000000100000010;
//爲每個進程分配cpu,上例中將2個進程分配到兩個cpu,當然可以寫多個,或者將一個
進程分配到多個cpu
worker_rlimit_nofile 102400;
//這個指令是指當一個nginx進程打開的最多文件數目,理論值應該是最多打開文件數(ulimit
-n)與nginx進程數相除,但是nginx分配請求並不是那麼均勻,所以最好與ulimit-n的值
保持一致。(通過”ulimit –n 數值”可以修改打開的最多文件數目)
error_loglogs/error.log;//全局錯誤日誌文件的位置
pidlogs/nginx.pid;//PID文件的位置
2)I/O事件配置:
使用”events {}”界定標記,用來指定Nginx進程的I/O響應模型,每個進程的連接數等設置
events {
use epool;//使用epool模型,對於2.6以上的內核,建議使用epool模型以提高性能
worker_connections4096;//每個進程允許的最多連接數(默認爲1024),每個進程的連接數應根據實際需要來定,一般在10000以下,理論上每臺nginx服務器的最大連接數爲worker_processes*worker_connections,具體還要看服務器的硬件、帶寬等。
}
3)HTTP配置
使用”http{}”界定標記,包括訪問日誌、HTTP端口、網頁目錄、默認字符集、連接保持、以
及虛擬主機、PHP解析等一系列設置。其中大部分配置語句包含在子界定標記”servier {}”內。
http {
#設定mime類型,即conf/目錄下的mime.types文件中的設定。
includemime.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;
sendfileon;//支持文件發送(下載)
keepalive_timeout 65;//連接保持超時
#設定虛擬主機
server {//用來配置虛擬主機
listen80; //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.logmain;
error_page 500502 503 504/50x.html; //內部錯誤的反饋頁面
location =/50x.html {
root html;
}
}
}
Nginx的location
基本語法:
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)$ {
# 匹配任何以 gif、jpg 或 jpeg 結尾的請求。
}
4、狀態統計及虛擬主機應用:
1)Nginx內置了HTTP_STUB_STATUS狀態統計模塊,用來反饋當前的WEB訪問情況。配置
編譯參數時可添加—with-http_stub_stastus_module來啓用此模塊。要使用Nginx的狀態統計功能,除了啓用內建模塊以外,還需要修改nginx.conf文件,指定訪問位置並打開stub_status配置。在http{}配置的server{}子配置內添加如下配置項
注:location/tongji//匹配任何包含/tongji的任何查詢
stub_statuson//打開狀態統計功能
Access_logoff//關閉此位置的日誌記錄
Nginx 支持爲目錄添加密碼認證,使用apache 的 htpasswd 來創建密碼文件
htpasswd-c/usr/local/nginx/.htpasswd 用戶名
保存修改過的nginx.conf文件並重啓nginx服務使修生效。
新的配置生效後,在瀏覽器中訪問Nginx服務器的/tongji網站位置(http://web服務器
IP/tongji)可以看到狀態統計信息
如上圖所示:其中”Active connections”表示當前的活動連接數;而”server accepts handled
requests”表示已經處理的連接信息,三個數字依次表示已處理的連接數、成功的TCP握手次
數、已處理的請求數.
客戶端訪問控制:
注:allow 允許規則,deny拒絕規則;規則的執行是按從上向下執行,匹配某條規則後將不
再檢查其他規則。
2)虛擬主機:
使用Nginx搭建虛擬主機服務器時,每個虛擬WEB站點擁有獨立的”server {}”配置段,各自
監聽的IP地址、端口號可以單獨指定,當然網站名稱也是不同的。
例如:要創建兩個站點www.benet.com和www.accp.com
爲兩個虛擬WEB主機分別建立根目錄,並準備測試首頁
調整nginx.conf配置文件---域名虛擬主機
配置兩個”server {}”區域,分別對應兩個WEB站點,指定各自的網站名稱、監聽地址、網站
根目錄、訪問日誌等信息,然後重載配置
測試:使用瀏覽器分別通過www.benet.com和www.accp.com訪問兩個WEB站點(注意域
名解析。
5、LEMP架構及應用部署:
就像構建LAMP平臺一樣,構建LEMP平臺也需要LINUX服務器、MYSQL數據庫、PHP解析
環境,區別主要在於Nginx與PHP的協作配置上
1)以編譯方式安裝Nginx(過程參照上面相關介紹完成)
2)安裝MYSQL數據庫----------以編譯方式安裝
釋放MYSQL的源碼包:
編譯前配置:
注:--with-charset:指定默認使用的字符集編碼;--with-collation:指定默認使用的字符集校對規則,utf8_general_ci是適用於UTF-8字符集的通用規則;--with-extra-charsets:指定額外支持的其他字符集編碼。
編譯並安裝MYSQL:
優化調整:
初始化數據庫:
啓動MYSQL服務及爲root用戶設置密碼:
3)安裝PHP解析環境:
較新版本(如5.3)的PHP已經自帶FPM(fastCGIprocessmanager,FastCGI進程管理器)模塊,用來對PHP解析實例進行管理,優化解析效率,因此在配置PHP編譯選項時應添加”--enable-fpm”以啓用此模塊。
爲了提高PHP解析效率,建議將相應版本的ZendGuardLander也裝上
釋放PHP源碼包:
編譯前配置:
注:在RHEL6的64系統中按上面的配置項配置可能會報以下錯誤,如果要是報錯的話請按如下方法解決:
解決方法:
根據報錯發現是因爲libpng.so和libpng.a找不到,但libpng的相關軟件包我已經安裝了,如下圖查詢結果,發現libpng的包都安裝了。
那爲什麼還報libpng.so和libpng.a找不到呢?
要解決的問題就是它沒找到,我安裝了的,那我得去找找看它到底是放那裏去了。執行下列命令,可以查找libpng.so在那裏。
通過上面的搜索其實就知道一些原因了,configure一般的搜索編譯路徑爲/usr/lib/下,因爲php默認就在/usr/lib/下找相關庫文件,而x64機器上是在:/usr/lib64.這時你就可以直接把需要的庫文件從/usr/lib64中拷貝到/usr/lib/中去就可以了
解決完後重新執行./configure進行編譯前的配置
如果報configure: error: libjpeg.(a|so) not found錯誤解決方法和上面的解決方法類似。具體操作如下:
如果報下面錯誤
usr/bin/install:cannot create regular file `/usr/local/man/man1/cjpeg.1': No such file ordirectory
make: *** [install] Error 1
提示找不到目錄。既然電腦找不到,咱們人腦可以找嘛,自己先創建先
mkdir /usr/local/man
mkdir /usr/local/man1 創建完了再來
類似錯誤很多,方法也很多,我們得靈活應變,具體問題具體分析!
編譯並安裝PHP:
注:
安裝後的調整:
安裝ZendGuardLander(注:若RHEL6是64位系統,該軟件得到其官網下載64位的相應軟件包,若用32位的就會報錯。下載地址:http://www.zend.com/en/products/guard/downloads)
修改php.ini文件:
在php.ini中添加如下配置
配置Nginx支持PHP環境:
若要讓Nginx能夠解析PHP網頁,有兩種方法可以選擇;其一,充當中介,將訪問PHP頁面的WEB請求轉交給其他服務器(LAMP)去處理;其二,通過使用PHP的FPM模塊來調用本機的PHP環境
如果選用FPM方式,則需要先啓動php-fpm進程,以便監聽PHP解析請求。參考範例建立php-fpm.conf配置文件,並修改其中的PID文件、運行用戶、服務數(進程數量)等相關設置,然後啓動php-fpm程序即可(默認監聽本機的9000端口)
修改內容如下:
//確認pid文件位置
//運行用戶和運行組
//啓動時開啓的進程數、最少空閒進程數、最多空閒進程數
按以上提示修改php-fpm.conf文件,改完後保存退出。
啓動php-fpm並查看地址監聽。
在php-fpm.conf文件中,pid配置行指出了PID信息的存放位置,對應的實際路徑爲/usr/local/php5/var/run/php-fpm.pid,根據上述信息,可以修改Nginx服務腳本,以便在啓動/停止Nginx服務器時將php-fpm進程也自動啓動/停止。
在nginx服務腳本中添加如下內容:
這樣一爲,一旦啓動或關閉nginx服務,php-fpm程序也會隨之啓動或關閉,不需要額外再啓動或關閉php-fpm.
4)配置Nginx支持PHP解析:
無論是將PHP頁面交給LAMP服務器去解析,還是調用本機的php-fpm進程進行解析,都需要在”server{}”配置段中添加location設置,以便指定當訪問.php面頁時採取何種操作。
對於第一種方法(轉交給其他WEB服務器處理),使用的配置語句如下所示,例如,交給IP地址爲192.168.0.200的LAMP服務器處理,從而實現由Nginx負責靜態頁面,LAMP負責動態頁面的分離效果。
server{
…… //省略部分信息
location~\.php${//訪問.php頁面的配置段
proxy_passhttp://192.168.0.200:80;//APACHE服務器的監聽地址
}
對於第二種方法(調用本機的php-fpm進程),使用的配置語句如下所示。在conf/目錄下的fastcgi.conf文件中已經包含必需的宏設置,可通過include語句添加進來。
server{
…… //省略部分信息
location~\.php$ {//訪問php頁面的配置段
root/var/www/benet;//PHP網頁文檔根目錄
fastcgi_pass127.0.0.1:9000;//php-fpm的監聽地址
fastcgi_indexindex.php;//PHP首頁文件
includefastcgi.conf;//包括fastcgi.conf樣本配置
}
}
本文檔中我選擇的是第二種方法,完成修改後重新加載nginx服務即可生效。
PHP頁面訪問測試:
在PHP文檔根目錄下創建一個測試網頁,以便測試PHP語名能否正常解析,以及能否訪問MYSQL數據庫。測試頁內容如下:
然後訪測試頁如:http://www.benet.com/test.php若能看到成功提示信息表示一切正常。
5)在LEMP平臺中部署WEB應用:
LEMP平臺與LAMP平臺是非常相似的,區別主要在於所用WEB服務軟件的不同,而這與使用PHP開發的WEB應用程序並無太大關係,因此PHP應用的部署方法也是類似的,
下面以“天空網絡電影系統(簡稱SKYUC)”爲例介紹在LEMP平臺中的部署過程。
釋放並部署程序代碼:
創建數據庫:
安裝WEB應用:
訪問http://www.benet.com/skyuc/install/index.php,將會打開SKYUC的安裝程序,根據頁面提示,只需三步即可完成安裝。要注意適當調整權限,最簡單方法是:
完成安裝後,注意將install/目錄轉移,以避免重複安裝,降低安全風險。
訪問WEB應用系統:
通過訪問http://www.benet.com/skyuc就可以訪問了。
架設Discuz論壇:
建立用於bbs論壇的數據庫及用戶:
解壓下載的軟件包,上傳程序文件:
在瀏覽器中訪問http://www.benet.com/bbs/install根據嚮導頁面的提示進行安裝
注:請將 php.ini 中的short_open_tag 設置爲 On,然後重啓WEB服務,否則程序無法正常運行,修改後要重啓nginx服務。
通過訪問http://www.benet.com/bbs就可以訪問了。