国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

開(kāi)通VIP
nginx

nginx可以使用各平臺(tái)的默認(rèn)包來(lái)安裝,本文是介紹使用源碼編譯安裝,包括具體的編譯參數(shù)信息。

正式開(kāi)始前,編譯環(huán)境gcc g++ 開(kāi)發(fā)庫(kù)之類的需要提前裝好,這里默認(rèn)你已經(jīng)裝好。

ububtu平臺(tái)編譯環(huán)境可以使用以下指令

apt-get install build-essentialapt-get install libtool

centos平臺(tái)編譯環(huán)境使用如下指令

安裝make:

yum -y install gcc automake autoconf libtool make

安裝g++:

yum install gcc gcc-c++

下面正式開(kāi)始
---------------------------------------------------------------------------
一般我們都需要先裝pcre, zlib,前者為了重寫(xiě)rewrite,后者為了gzip壓縮。
1.選定源碼目錄
可以是任何目錄,本文選定的是/usr/local/src

cd /usr/local/src

2.安裝PCRE庫(kù)
ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/ 下載最新的 PCRE 源碼包,使用下面命令下載編譯和安裝 PCRE 包:

cd /usr/local/srcwget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.34.tar.gz tar -zxvf pcre-8.34.tar.gzcd pcre-8.34./configuremakemake install

3.安裝zlib庫(kù)
http://zlib.net/zlib-1.2.8.tar.gz 下載最新的 zlib 源碼包,使用下面命令下載編譯和安裝 zlib包:

cd /usr/local/srcwget http://zlib.net/zlib-1.2.8.tar.gztar -zxvf zlib-1.2.8.tar.gzcd zlib-1.2.8./configuremakemake install

4.安裝ssl(某些vps默認(rèn)沒(méi)裝ssl)

cd /usr/local/srcwget http://www.openssl.org/source/openssl-1.0.1c.tar.gztar -zxvf openssl-1.0.1c.tar.gz

5.安裝nginx

Nginx 一般有兩個(gè)版本,分別是穩(wěn)定版和開(kāi)發(fā)版,您可以根據(jù)您的目的來(lái)選擇這兩個(gè)版本的其中一個(gè),下面是把 Nginx 安裝到 /usr/local/nginx 目錄下的詳細(xì)步驟:

cd /usr/local/srcwget http://nginx.org/download/nginx-1.4.2.tar.gztar -zxvf nginx-1.4.2.tar.gzcd nginx-1.4.2./configure --sbin-path=/usr/local/nginx/nginx --conf-path=/usr/local/nginx/nginx.conf --pid-path=/usr/local/nginx/nginx.pid --with-http_ssl_module --with-pcre=/usr/local/src/pcre-8.34 --with-zlib=/usr/local/src/zlib-1.2.8 --with-openssl=/usr/local/src/openssl-1.0.1cmakemake install

--with-pcre=/usr/src/pcre-8.34 指的是pcre-8.34 的源碼路徑。
--with-zlib=/usr/src/zlib-1.2.7 指的是zlib-1.2.7 的源碼路徑。

安裝成功后 /usr/local/nginx 目錄下如下

fastcgi.conf            koi-win             nginx.conf.defaultfastcgi.conf.default    logs                scgi_paramsfastcgi_params          mime.types          scgi_params.defaultfastcgi_params.default  mime.types.default  uwsgi_paramshtml                    nginx               uwsgi_params.defaultkoi-utf                 nginx.conf          win-utf

6.啟動(dòng)
確保系統(tǒng)的 80 端口沒(méi)被其他程序占用,運(yùn)行/usr/local/nginx/nginx 命令來(lái)啟動(dòng) Nginx,

netstat -ano|grep 80

如果查不到結(jié)果后執(zhí)行,有結(jié)果則忽略此步驟(ubuntu下必須用sudo啟動(dòng),不然只能在前臺(tái)運(yùn)行)

sudo /usr/local/nginx/nginx

打開(kāi)瀏覽器訪問(wèn)此機(jī)器的 IP,如果瀏覽器出現(xiàn) Welcome to nginx! 則表示 Nginx 已經(jīng)安裝并運(yùn)行成功。

-----------------------------------------------------
到這里nginx就安裝完成了,如果只是處理靜態(tài)html就不用繼續(xù)安裝了

如果你需要處理php腳本的話,還需要安裝php-fpm。

下面安裝排錯(cuò)

附:可能遇到的錯(cuò)誤和一些幫助信息

1.1編譯pcre錯(cuò)誤

libtool: compile: unrecognized option `-DHAVE_CONFIG_H'libtool: compile: Try `libtool --help' for more information.make[1]: *** [pcrecpp.lo] Error 1make[1]: Leaving directory `/usr/local/src/pcre-8.34'make: *** [all] Error 2

解決辦法:安裝g++,別忘了重新configure

apt-get install g++apt-get install build-essentialmake clean./configuremake

1.2 make出錯(cuò)

make: *** No rule to make target `build', needed by `default'.  Stop../configure: error: SSL modules require the OpenSSL library.You can either do not enable the modules, or install the OpenSSL libraryinto the system, or build the OpenSSL library statically from the sourcewith nginx by using --with-openssl= option.

按照第4步的安裝方法或
ubuntu下

apt-get install opensslapt-get install libssl-dev

centos下

yum -y install openssl openssl-devel

2.nginx編譯選項(xiàng)

make是用來(lái)編譯的,它從Makefile中讀取指令,然后編譯。

make install是用來(lái)安裝的,它也從Makefile中讀取指令,安裝到指定的位置。

configure命令是用來(lái)檢測(cè)你的安裝平臺(tái)的目標(biāo)特征的。它定義了系統(tǒng)的各個(gè)方面,包括nginx的被允許使用的連接處理的方法,比如它會(huì)檢測(cè)你是不是有CC或GCC,并不是需要CC或GCC,它是個(gè)shell腳本,執(zhí)行結(jié)束時(shí),它會(huì)創(chuàng)建一個(gè)Makefile文件。nginx的configure命令支持以下參數(shù):

  • --prefix=path    定義一個(gè)目錄,存放服務(wù)器上的文件 ,也就是nginx的安裝目錄。默認(rèn)使用 /usr/local/nginx。
  • --sbin-path=path 設(shè)置nginx的可執(zhí)行文件的路徑,默認(rèn)為  prefix/sbin/nginx.
  • --conf-path=path  設(shè)置在nginx.conf配置文件的路徑。nginx允許使用不同的配置文件啟動(dòng),通過(guò)命令行中的-c選項(xiàng)。默認(rèn)為prefix/conf/nginx.conf.
  • --pid-path=path  設(shè)置nginx.pid文件,將存儲(chǔ)的主進(jìn)程的進(jìn)程號(hào)。安裝完成后,可以隨時(shí)改變的文件名 , 在nginx.conf配置文件中使用 PID指令。默認(rèn)情況下,文件名 為prefix/logs/nginx.pid.
  • --error-log-path=path 設(shè)置主錯(cuò)誤,警告,和診斷文件的名稱。安裝完成后,可以隨時(shí)改變的文件名 ,在nginx.conf配置文件中 使用 的error_log指令。默認(rèn)情況下,文件名 為prefix/logs/error.log.
  • --http-log-path=path  設(shè)置主請(qǐng)求的HTTP服務(wù)器的日志文件的名稱。安裝完成后,可以隨時(shí)改變的文件名 ,在nginx.conf配置文件中 使用 的access_log指令。默認(rèn)情況下,文件名 為prefix/logs/access.log.
  • --user=name  設(shè)置nginx工作進(jìn)程的用戶。安裝完成后,可以隨時(shí)更改的名稱在nginx.conf配置文件中 使用的 user指令。默認(rèn)的用戶名是nobody。
  • --group=name  設(shè)置nginx工作進(jìn)程的用戶組。安裝完成后,可以隨時(shí)更改的名稱在nginx.conf配置文件中 使用的 user指令。默認(rèn)的為非特權(quán)用戶。
  • --with-select_module --without-select_module 啟用或禁用構(gòu)建一個(gè)模塊來(lái)允許服務(wù)器使用select()方法。該模塊將自動(dòng)建立,如果平臺(tái)不支持的kqueue,epoll,rtsig或/dev/poll。
  • --with-poll_module --without-poll_module 啟用或禁用構(gòu)建一個(gè)模塊來(lái)允許服務(wù)器使用poll()方法。該模塊將自動(dòng)建立,如果平臺(tái)不支持的kqueue,epoll,rtsig或/dev/poll。
  • --without-http_gzip_module — 不編譯壓縮的HTTP服務(wù)器的響應(yīng)模塊。編譯并運(yùn)行此模塊需要zlib庫(kù)。
  • --without-http_rewrite_module  不編譯重寫(xiě)模塊。編譯并運(yùn)行此模塊需要PCRE庫(kù)支持。
  • --without-http_proxy_module — 不編譯http_proxy模塊。
  • --with-http_ssl_module — 使用https協(xié)議模塊。默認(rèn)情況下,該模塊沒(méi)有被構(gòu)建。建立并運(yùn)行此模塊的OpenSSL庫(kù)是必需的。
  • --with-pcre=path — 設(shè)置PCRE庫(kù)的源碼路徑。PCRE庫(kù)的源碼(版本4.4 - 8.30)需要從PCRE網(wǎng)站下載并解壓。其余的工作是Nginx的./ configure和make來(lái)完成。正則表達(dá)式使用在location指令和 ngx_http_rewrite_module 模塊中。
  • --with-pcre-jit —編譯PCRE包含“just-in-time compilation”(1.1.12中, pcre_jit指令)。
  • --with-zlib=path —設(shè)置的zlib庫(kù)的源碼路徑。要下載從 zlib(版本1.1.3 - 1.2.5)的并解壓。其余的工作是Nginx的./ configure和make完成。ngx_http_gzip_module模塊需要使用zlib 。
  • --with-cc-opt=parameters — 設(shè)置額外的參數(shù)將被添加到CFLAGS變量。例如,當(dāng)你在FreeBSD上使用PCRE庫(kù)時(shí)需要使用:--with-cc-opt="-I /usr/local/include。.如需要需要增加 select()支持的文件數(shù)量:--with-cc-opt="-D FD_SETSIZE=2048".
  • --with-ld-opt=parameters —設(shè)置附加的參數(shù),將用于在鏈接期間。例如,當(dāng)在FreeBSD下使用該系統(tǒng)的PCRE庫(kù),應(yīng)指定:--with-ld-opt="-L /usr/local/lib".

典型實(shí)例(下面為了展示需要寫(xiě)在多行,執(zhí)行時(shí)內(nèi)容需要在同一行)

./configure    --sbin-path=/usr/local/nginx/nginx    --conf-path=/usr/local/nginx/nginx.conf    --pid-path=/usr/local/nginx/nginx.pid    --with-http_ssl_module    --with-pcre=../pcre-4.4    --with-zlib=../zlib-1.1.3

一、什么是Nginx 
相信很多讀者都對(duì)Apache非常熟悉,與Apache類似,Nginx是一款高性能的HTTP和反向代理服務(wù)器軟件,也是一個(gè) IMAP/POP3/SMTP 代理服務(wù)器。Nginx(發(fā)音是“engine x”)由俄羅斯的程序設(shè)計(jì)師Igor Sysoev所開(kāi)發(fā)(Igor將源代碼以類BSD許可證的形式發(fā)布),可以運(yùn)行在UNIX,GNU/Linux,BSD,Mac OS X, Solaris, 以及 Microsoft Windows等操作系統(tǒng)中。隨著Nginx在很多大型網(wǎng)站的穩(wěn)定運(yùn)行,其穩(wěn)定、高效的特性逐漸被越來(lái)越多的用戶認(rèn)可。
二、為什么要選擇Nginx
1、Nginx與Apache的異同
Nginx和Apache一樣,都是一個(gè)HTTP服務(wù)器軟件,功能實(shí)現(xiàn)上都采用模塊化結(jié)構(gòu)設(shè)計(jì),都支持通用的語(yǔ)言接口,如PHP、Perl、Python等,同時(shí)還支持正、反向代理,虛擬主機(jī),URL重寫(xiě),壓縮傳輸,SSL加密傳輸?shù)?。它們之間最大的差別是Apache處理速度很慢,且占用很多內(nèi)存資源,而Nginx卻恰恰相反;在功能實(shí)現(xiàn)上,Apache的所有模塊都支持動(dòng)、靜態(tài)編譯,而Nginx模塊都是靜態(tài)編譯的,同時(shí),Apache對(duì)Fcgi支持不好,而Nginx對(duì)Fcgi的支持非常的好;最重要的是,在處理連接方式上,Nginx支持epoll,而Apache卻不支持;在大小上,Nginx安裝包僅僅有幾百K,和Nginx比起來(lái)Apache絕對(duì)是龐然大物。在了解了Nginx和Apache之間的異同點(diǎn)后基本知道了Nginx作為HTTP服務(wù)器的優(yōu)勢(shì)所在。
2、 選擇Nginx的優(yōu)勢(shì)所在
通過(guò)上面的簡(jiǎn)單介紹,Nginx作為HTTP服務(wù)器的優(yōu)勢(shì)是顯而易見(jiàn)的,它有很多其它Web服務(wù)器無(wú)法比擬的性能和優(yōu)勢(shì):
作為Web服務(wù)器,nginx處理靜態(tài)文件、索引文件以及自動(dòng)索引效率非常高。
作為代理服務(wù)器,Nginx可以實(shí)現(xiàn)無(wú)緩存的反向代理加速,提高網(wǎng)站運(yùn)行速度。
作為負(fù)載均衡服務(wù)器,Nginx既可以在內(nèi)部直接支持Rails和PHP,也可以支持HTTP代理服務(wù)器,對(duì)外進(jìn)行服務(wù)。同時(shí)支持簡(jiǎn)單的容錯(cuò)和利用算法進(jìn)行負(fù)載均衡。
在性能方面,Nginx是專門(mén)為性能優(yōu)化而開(kāi)發(fā)的,在實(shí)現(xiàn)上非常注重效率。它采用內(nèi)核Poll模型,可以支持更多的并發(fā)連接,最大可以支持對(duì)50 000個(gè)并發(fā)連接數(shù)的響應(yīng),而且占用很低的內(nèi)存資源。
在穩(wěn)定性方面,Nginx采取了分階段資源分配技術(shù),使得對(duì)CPU與內(nèi)存的占用率非常低。Nginx官方表示Nginx保持10 000個(gè)沒(méi)有活動(dòng)的連接,這些連接只占2.5M內(nèi)存,因此,類似DOS這樣的攻擊對(duì)Nginx來(lái)說(shuō)基本上是沒(méi)有任何作用的。
在高可用性方面,Nginx支持熱部署,啟動(dòng)速度特別迅速,因此可以在不間斷服務(wù)的情況下,對(duì)軟件版本或者配置進(jìn)行升級(jí),即使運(yùn)行數(shù)月也無(wú)需重新啟動(dòng),幾乎可以做到7×24小時(shí)的不間斷運(yùn)行。
3、Nginx的模塊與工作原理
Nginx由內(nèi)核和模塊組成,其中,內(nèi)核的設(shè)計(jì)非常微小和簡(jiǎn)潔,完成的工作也非常簡(jiǎn)單,僅僅通過(guò)查找配置文件將客戶端請(qǐng)求映射到一個(gè)location block(location是Nginx配置中的一個(gè)指令,用于URL匹配),而在這個(gè)location中所配置的每個(gè)指令將會(huì)啟動(dòng)不同的模塊去完成相應(yīng)的工作。
Nginx的模塊從結(jié)構(gòu)上分為核心模塊、基礎(chǔ)模塊和第三方模塊, HTTP模塊、EVENT模塊和MAIL模塊等屬于核心模塊,HTTP Access模塊、HTTP FastCGI模塊、HTTP Proxy模塊和HTTP Rewrite模塊屬于基本模塊,而HTTP Upstream Request Hash模塊、Notice模塊和HTTP Access Key模塊屬于第三方模塊,用戶根據(jù)自己的需要開(kāi)發(fā)的模塊都屬于第三方模塊。正是有了這么多模塊的支撐,Nginx的功能才會(huì)如此強(qiáng)大。
Nginx的模塊從功能上分為三類,分別是:
(1) Handlers(處理器模塊)。此類模塊直接處理請(qǐng)求,并進(jìn)行輸出內(nèi)容和修改headers信息等操作。handlers處理器模塊一般只能有一個(gè)。
(2) Filters (過(guò)濾器模塊)。此類模塊主要對(duì)其他處理器模塊輸出的內(nèi)容進(jìn)行修改操作,最后由Nginx輸出。
(3) Proxies (代理類模塊)。就是Nginx的HTTP Upstream之類的模塊,這些模塊主要與后端一些服務(wù)比如fastcgi等操作交互,實(shí)現(xiàn)服務(wù)代理和負(fù)載均衡等功能。
下圖展示了Nginx的模塊下一次常規(guī)的HTTP請(qǐng)求和響應(yīng)的過(guò)程。


在工作方式上,Nginx分為單工作進(jìn)程和多工作進(jìn)程兩種模式。在單工作進(jìn)程模式下,除主進(jìn)程外,還有一個(gè)工作進(jìn)程,工作進(jìn)程是單線程的;在多工作進(jìn)程模式下,每個(gè)工作進(jìn)程包含多個(gè)線程。Nginx默認(rèn)為單工作進(jìn)程模式。
Nginx的模塊直接被編譯進(jìn)Nginx,因此屬于靜態(tài)編譯方式。啟動(dòng)Nginx后,Nginx的模塊被自動(dòng)加載,不像在Apache一樣,首先將模塊編譯為一個(gè)so文件,然后在配置文件中指定是否進(jìn)行加載。在解析配置文件時(shí),Nginx的每個(gè)模塊都有可能去處理某個(gè)請(qǐng)求,但是同一個(gè)處理請(qǐng)求只能由一個(gè)模塊來(lái)完成。

一、下載與安裝Nginx
      Nginx的官方網(wǎng)站是http://sysoev.ru/nginx/,英文主頁(yè)為http://nginx.net,從這里可以獲得Nginx的最新版本信息。Nginx有三個(gè)版本:穩(wěn)定版、開(kāi)發(fā)版和歷史穩(wěn)定版。開(kāi)發(fā)版更新較快,包含最新的功能和bug的修復(fù),但同時(shí)也可能會(huì)遇到新的bug,開(kāi)發(fā)版一旦更新穩(wěn)定下來(lái),就會(huì)被加入穩(wěn)定版分支中。然而有些新功能不一定會(huì)被加到舊的穩(wěn)定版中去。穩(wěn)定版本更新較慢,但是bug較少,可以作為生產(chǎn)環(huán)境的首選,因此通常建議使用穩(wěn)定版。歷史穩(wěn)定版本為以往穩(wěn)定版本的匯總,不包含最新的功能。
這里選擇當(dāng)前的穩(wěn)定版本nginx-0.7.65作為介紹對(duì)象,開(kāi)始介紹編譯安裝。在安裝Nginx之前,確保系統(tǒng)已經(jīng)安裝了gcc、 openssl-devel、 pcre-devel和zlib-devel軟件庫(kù)。
Linux開(kāi)發(fā)庫(kù)是在安裝系統(tǒng)時(shí)通過(guò)手動(dòng)選擇安裝的,gcc、 openssl-devel、zlib-devel三個(gè)軟件庫(kù)可以通過(guò)安裝光盤(pán)直接選擇安裝得到,而pcre-devel庫(kù)默認(rèn)不在系統(tǒng)光盤(pán)中,所以這里重點(diǎn)介紹pcre-devel庫(kù)。
二、安裝Nginx所需的pcre-devel庫(kù)
安裝pcre庫(kù)是為了使Nginx支持HTTP Rewrite 模塊。下面進(jìn)行安裝,過(guò)程如下。

  1. [root@localhost home]# tar zxvf pcre-8.02.tar.gz  
  2. [root@localhost home]# cd pcre-8.02  
  3. [root@localhost pcre-8.02]#./configure  
  4. [root@localhost pcre-8.02]#make  
  5. [root@localhost pcre-8.02]#make install  

三、開(kāi)始安裝Nginx
 Nginx的安裝非常簡(jiǎn)單。在默認(rèn)情況下,經(jīng)過(guò)編譯安裝的Nginx包含了大部分可用模塊??梢酝ㄟ^(guò)“./configure  --help”選項(xiàng)設(shè)置各個(gè)模塊的使用情況,例如對(duì)不需要的http_ssi模塊,可通過(guò)“--without-http_ssi_module”方式關(guān)閉此模塊;同理,如果需要“http_perl”模塊,那么可以通過(guò)“--with-http_perl_module”方式安裝此模塊。下面是安裝過(guò)程: 

  1. [root@localhost home]# tar zxvf nginx-0.7.65.tar.gz  
  2. [root@localhost home]#cd nginx-0.7.65  
  3. [root@localhostnginx-0.7.65]#./configure \  
  4. --with-http_stub_status_module  --prefix=/opt/nginx  
  5. [root@localhost nginx-0.7.65]#make  
  6. [root@localhost nginx-0.7.65]#make install  

在上面的configure選項(xiàng)中“--with-http_stub_status_module”可以用來(lái)啟用 Nginx 的 NginxStatus 功能,以監(jiān)控 Nginx 的當(dāng)前狀態(tài)。
至此,Nginx已經(jīng)安裝完成了。
四、 Nginx配置文件結(jié)構(gòu)
Nginx的配置文件是一個(gè)純文本文件,它一般位于Nginx安裝目錄的conf目錄下,整個(gè)配置文件是以block的形式組織的。每個(gè)block一般以一個(gè)大括號(hào)“{}”來(lái)表示,block可以分為幾個(gè)層次,整個(gè)配置文件中Main指令位于最高層,在Main層下面可以有Events、HTTP等層級(jí),而在HTTP層中又包含有Server層,即server block,server block中又可分為location層,并且一個(gè)server block中可以包含多個(gè)location block。
一個(gè)完整的配置文件結(jié)構(gòu)如下圖所示。


在了解完配置文件結(jié)構(gòu)之后,就可以開(kāi)始配置和調(diào)試Nginx了。

  Nginx安裝完畢后,會(huì)產(chǎn)生相應(yīng)的安裝目錄,根據(jù)前面的安裝路徑,Nginx的配置文件路徑為/opt/nginx/conf,其中nginx.conf為Nginx的主配置文件。這里重點(diǎn)介紹下nginx.conf這個(gè)配置文件。
         Nginx配置文件主要分成四部分:main(全局設(shè)置)、server(主機(jī)設(shè)置)、upstream(負(fù)載均衡服務(wù)器設(shè)置)和 location(URL匹配特定位置的設(shè)置)。main部分設(shè)置的指令將影響其他所有設(shè)置;server部分的指令主要用于指定主機(jī)和端口;upstream指令主要用于負(fù)載均衡,設(shè)置一系列的后端服務(wù)器;location部分用于匹配網(wǎng)頁(yè)位置。這四者之間的關(guān)系式:server繼承main,location繼承server,upstream既不會(huì)繼承其他設(shè)置也不會(huì)被繼承。
         在這四個(gè)部分當(dāng)中,每個(gè)部分都包含若干指令,這些指令主要包含Nginx的主模塊指令、事件模塊指令、HTTP核心模塊指令,同時(shí)每個(gè)部分還可以使用其他HTTP模塊指令,例如Http SSL模塊、HttpGzip Static模塊和Http Addition模塊等。
下面通過(guò)一個(gè)Nginx配置實(shí)例,詳細(xì)介紹下nginx.conf每個(gè)指令的含義。為了能更清楚地了解Nginx的結(jié)構(gòu)和每個(gè)配置選項(xiàng)的含義,這里按照功能點(diǎn)將Nginx配置文件分為7個(gè)部分逐次講解,下面就圍繞這7個(gè)部分進(jìn)行介紹。

1.Nginx的全局配置
下面這段內(nèi)容是對(duì)Nginx的全局屬性配置,代碼如下:
 user  nobody nobody;
 worker_processes  4;
 error_log  logs/error.log  notice;
 pid        logs/nginx.pid;
 worker_rlimit_nofile 65535; 
 events{
  use epoll;
  worker_connections      65536;
       }
對(duì)上面這段代碼中每個(gè)配置選項(xiàng)的含義解釋如下:
user是個(gè)主模塊指令,指定Nginx Worker進(jìn)程運(yùn)行用戶以及用戶組,默認(rèn)由nobody賬號(hào)運(yùn)行。
worker_processes是個(gè)主模塊指令,指定了Nginx要開(kāi)啟的進(jìn)程數(shù)。每個(gè)Nginx進(jìn)程平均耗費(fèi)10M~12M內(nèi)存。根據(jù)經(jīng)驗(yàn),一般指定一個(gè)進(jìn)程足夠了,如果是多核CPU,建議指定和CPU的數(shù)量一樣的進(jìn)程數(shù)即可。
error_log是個(gè)主模塊指令,用來(lái)定義全局錯(cuò)誤日志文件。日志輸出級(jí)別有debug、info、notice、warn、error、crit可供選擇,其中,debug輸出日志最為最詳細(xì),而crit輸出日志最少。 
pid是個(gè)主模塊指令,用來(lái)指定進(jìn)程id的存儲(chǔ)文件位置。
worker_rlimit_nofile用于指定一個(gè)nginx進(jìn)程可以打開(kāi)的最多文件描述符數(shù)目,這里是65535,需要使用命令“ulimit -n 65535”來(lái)設(shè)置。
events指令是設(shè)定Nginx的工作模式及連接數(shù)上限。
events{
use epoll;
worker_connections      65536;
}
use是個(gè)事件模塊指令,用來(lái)指定Nginx的工作模式。Nginx支持的工作模式有select、poll、kqueue、epoll、rtsig和/dev/poll。其中select和poll都是標(biāo)準(zhǔn)的工作模式,kqueue和epoll是高效的工作模式,不同的是epoll用在Linux平臺(tái)上,而kqueue用在BSD系統(tǒng)中。對(duì)于Linux系統(tǒng),epoll工作模式是首選。
worker_connections也是個(gè)事件模塊指令,用于定義Nginx每個(gè)進(jìn)程的最大連接數(shù),默認(rèn)是1024.最大客戶端連接數(shù)由worker_processes和worker_connections決定,即Max_client=worker_processes*worker_connections,在作為反向代理時(shí),max_clients變?yōu)椋簃ax_clients = worker_processes * worker_connections/4。
進(jìn)程的最大連接數(shù)受Linux系統(tǒng)進(jìn)程的最大打開(kāi)文件數(shù)限制,在執(zhí)行操作系統(tǒng)命令“ulimit -n 65536”后worker_connections的設(shè)置才能生效。

2.HTTP服務(wù)器配置
接下來(lái)開(kāi)始進(jìn)行HTTP服務(wù)器設(shè)置。
下面這段內(nèi)容是Nginx對(duì)HTTP服務(wù)器相關(guān)屬性的配置,代碼如下:
http{
include      conf/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"';
client_max_body_size  20m; 
client_header_buffer_size    32K;
large_client_header_buffers  4 32k;
Sendfile  on;
tcp_nopush     on;
tcp_nodelay    on;
keepalive_timeout 60;
client_header_timeout  10;
client_body_timeout    10;
send_timeout          10;

下面詳細(xì)介紹下這段代碼中每個(gè)配置選項(xiàng)的含義。
include是個(gè)主模塊指令,實(shí)現(xiàn)對(duì)配置文件所包含的文件的設(shè)定,可以減少主配置文件的復(fù)雜度。類似于Apache中的include方法。
default_type屬于HTTP核心模塊指令,這里設(shè)定默認(rèn)類型為二進(jìn)制流,也就是當(dāng)文件類型未定義時(shí)使用這種方式,例如在沒(méi)有配置PHP環(huán)境時(shí),Nginx是不予解析的,此時(shí),用瀏覽器訪問(wèn)PHP文件就會(huì)出現(xiàn)下載窗口。
下面的代碼實(shí)現(xiàn)對(duì)日志格式的設(shè)定。
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"';
log_format是Nginx的HttpLog模塊指令,用于指定Nginx日志的輸出格式。main為此日志輸出格式的名稱,可以在下面的access_log指令中引用。
client_max_body_size用來(lái)設(shè)置允許客戶端請(qǐng)求的最大的單個(gè)文件字節(jié)數(shù)。
client_header_buffer_size用于指定來(lái)自客戶端請(qǐng)求頭的headerbuffer大小。對(duì)于大多數(shù)請(qǐng)求,1K的緩沖區(qū)大小已經(jīng)足夠,如果自定義了消息頭或有更大的Cookie,可以增加緩沖區(qū)大小。這里設(shè)置為32K。
large_client_header_buffers用來(lái)指定客戶端請(qǐng)求中較大的消息頭的緩存最大數(shù)量和大小, “4”為個(gè)數(shù),“128K”為大小,最大緩存量為4個(gè)128K。
sendfile參數(shù)用于開(kāi)啟高效文件傳輸模式。將tcp_nopush和tcp_nodelay兩個(gè)指令設(shè)置為on用于防止網(wǎng)絡(luò)阻塞。
keepalive_timeout設(shè)置客戶端連接保持活動(dòng)的超時(shí)時(shí)間。在超過(guò)這個(gè)時(shí)間之后,服務(wù)器會(huì)關(guān)閉該連接。
client_header_timeout設(shè)置客戶端請(qǐng)求頭讀取超時(shí)時(shí)間。如果超過(guò)這個(gè)時(shí)間,客戶端還沒(méi)有發(fā)送任何數(shù)據(jù),Nginx將返回“Request time out(408)”錯(cuò)誤。
client_body_timeout設(shè)置客戶端請(qǐng)求主體讀取超時(shí)時(shí)間。如果超過(guò)這個(gè)時(shí)間,客戶端還沒(méi)有發(fā)送任何數(shù)據(jù),Nginx將返回“Request time out(408)”錯(cuò)誤,默認(rèn)值是60。
send_timeout指定響應(yīng)客戶端的超時(shí)時(shí)間。這個(gè)超時(shí)僅限于兩個(gè)連接活動(dòng)之間的時(shí)間,如果超過(guò)這個(gè)時(shí)間,客戶端沒(méi)有任何活動(dòng),Nginx將會(huì)關(guān)閉連接。

3.HttpGzip模塊配置
下面配置Nginx的HttpGzip模塊。這個(gè)模塊支持在線實(shí)時(shí)壓縮輸出數(shù)據(jù)流。要查看是否安裝了此模塊,需要使用下面的命令:
[root@localhost conf]# /opt/nginx/sbin/nginx  -V
nginx version: nginx/0.7.65
configure arguments: --with-http_stub_status_module --with-http_gzip_static_module --prefix=/opt/nginx
通過(guò)/opt/nginx/sbin/nginx  -V命令可以查看安裝Nginx時(shí)的編譯選項(xiàng),由輸出可知,我們已經(jīng)安裝了HttpGzip模塊。
下面是HttpGzip模塊在Nginx配置中的相關(guān)屬性設(shè)置:
gzip  on;
gzip_min_length  1k;
gzip_buffers     4  16k;
gzip_http_version  1.1;
gzip_comp_level  2;
gzip_types  text/plain application/x-javascript text/css application/xml;
gzip_vary  on;
gzip用于設(shè)置開(kāi)啟或者關(guān)閉gzip模塊,“gzip on”表示開(kāi)啟GZIP壓縮,實(shí)時(shí)壓縮輸出數(shù)據(jù)流。
gzip_min_length設(shè)置允許壓縮的頁(yè)面最小字節(jié)數(shù),頁(yè)面字節(jié)數(shù)從header頭的Content-Length中獲取。默認(rèn)值是0,不管頁(yè)面多大都進(jìn)行壓縮。建議設(shè)置成大于1K的字節(jié)數(shù),小于1K可能會(huì)越壓越大。
gzip_buffers表示申請(qǐng)4個(gè)單位為16K的內(nèi)存作為壓縮結(jié)果流緩存,默認(rèn)值是申請(qǐng)與原始數(shù)據(jù)大小相同的內(nèi)存空間來(lái)存儲(chǔ)gzip壓縮結(jié)果。
gzip_http_version用于設(shè)置識(shí)別HTTP協(xié)議版本,默認(rèn)是1.1,目前大部分瀏覽器已經(jīng)支持GZIP解壓,使用默認(rèn)即可。
gzip_comp_level用來(lái)指定GZIP壓縮比,1 壓縮比最小,處理速度最快;9 壓縮比最大,傳輸速度快,但處理最慢,也比較消耗cpu資源。
gzip_types用來(lái)指定壓縮的類型,無(wú)論是否指定,“text/html”類型總是會(huì)被壓縮的。
gzip_vary選項(xiàng)可以讓前端的緩存服務(wù)器緩存經(jīng)過(guò)GZIP壓縮的頁(yè)面,例如用Squid緩存經(jīng)過(guò)Nginx壓縮的數(shù)據(jù)。

4.負(fù)載均衡配置
下面設(shè)定負(fù)載均衡的服務(wù)器列表。
upstream ixdba.net{
ip_hash;
server 192.168.12.133:80;
server 192.168.12.134:80  down;
server 192.168.12.135:8009  max_fails=3  fail_timeout=20s;
server 192.168.12.136:8080;
}
upstream是Nginx的HTTP Upstream模塊,這個(gè)模塊通過(guò)一個(gè)簡(jiǎn)單的調(diào)度算法來(lái)實(shí)現(xiàn)客戶端IP到后端服務(wù)器的負(fù)載均衡。在上面的設(shè)定中,通過(guò)upstream指令指定了一個(gè)負(fù)載均衡器的名稱ixdba.net。這個(gè)名稱可以任意指定,在后面需要的地方直接調(diào)用即可。
Nginx的負(fù)載均衡模塊目前支持4種調(diào)度算法,下面進(jìn)行分別介紹,其中后兩項(xiàng)屬于第三方的調(diào)度方法。
 輪詢(默認(rèn))。每個(gè)請(qǐng)求按時(shí)間順序逐一分配到不同的后端服務(wù)器,如果后端某臺(tái)服務(wù)器宕機(jī),故障系統(tǒng)被自動(dòng)剔除,使用戶訪問(wèn)不受影響。
 Weight。指定輪詢權(quán)值,Weight值越大,分配到的訪問(wèn)機(jī)率越高,主要用于后端每個(gè)服務(wù)器性能不均的情況下。
 ip_hash。每個(gè)請(qǐng)求按訪問(wèn)IP的hash結(jié)果分配,這樣來(lái)自同一個(gè)IP的訪客固定訪問(wèn)一個(gè)后端服務(wù)器,有效解決了動(dòng)態(tài)網(wǎng)頁(yè)存在的session共享問(wèn)題。
 fair。比上面兩個(gè)更加智能的負(fù)載均衡算法。此種算法可以依據(jù)頁(yè)面大小和加載時(shí)間長(zhǎng)短智能地進(jìn)行負(fù)載均衡,也就是根據(jù)后端服務(wù)器的響應(yīng)時(shí)間來(lái)分配請(qǐng)求,響應(yīng)時(shí)間短的優(yōu)先分配。Nginx本身是不支持fair的,如果需要使用這種調(diào)度算法,必須下載Nginx的upstream_fair模塊。
 url_hash。按訪問(wèn)url的hash結(jié)果來(lái)分配請(qǐng)求,使每個(gè)url定向到同一個(gè)后端服務(wù)器,可以進(jìn)一步提高后端緩存服務(wù)器的效率。Nginx本身是不支持url_hash的,如果需要使用這種調(diào)度算法,必須安裝Nginx 的hash軟件包。
在HTTP Upstream模塊中,可以通過(guò)server指令指定后端服務(wù)器的IP地址和端口,同時(shí)還可以設(shè)定每個(gè)后端服務(wù)器在負(fù)載均衡調(diào)度中的狀態(tài)。常用的狀態(tài)有:
 down,表示當(dāng)前的server暫時(shí)不參與負(fù)載均衡。
 backup,預(yù)留的備份機(jī)器。當(dāng)其他所有的非backup機(jī)器出現(xiàn)故障或者忙的時(shí)候,才會(huì)請(qǐng)求backup機(jī)器,因此這臺(tái)機(jī)器的壓力最輕。
 max_fails,允許請(qǐng)求失敗的次數(shù),默認(rèn)為1。當(dāng)超過(guò)最大次數(shù)時(shí),返回proxy_next_upstream 模塊定義的錯(cuò)誤。
 fail_timeout,在經(jīng)歷了max_fails次失敗后,暫停服務(wù)的時(shí)間。max_fails可以和fail_timeout一起使用。
注意 當(dāng)負(fù)載調(diào)度算法為ip_hash時(shí),后端服務(wù)器在負(fù)載均衡調(diào)度中的狀態(tài)不能是weight和backup。

5.server虛擬主機(jī)配置
下面介紹對(duì)虛擬主機(jī)的配置。建議將對(duì)虛擬主機(jī)進(jìn)行配置的內(nèi)容寫(xiě)進(jìn)另外一個(gè)文件,然后通過(guò)include指令包含進(jìn)來(lái),這樣更便于維護(hù)和管理。
server{
listen          80;
server_name    192.168.12.188  www.ixdba.net;
index index.html index.htm index.jsp;
root  /web/wwwroot/www.ixdba.net
charset gb2312;
server標(biāo)志定義虛擬主機(jī)開(kāi)始,listen用于指定虛擬主機(jī)的服務(wù)端口,server_name用來(lái)指定IP地址或者域名,多個(gè)域名之間用空格分開(kāi)。Index用于設(shè)定訪問(wèn)的默認(rèn)首頁(yè)地址,root指令用于指定虛擬主機(jī)的網(wǎng)頁(yè)根目錄,這個(gè)目錄可以是相對(duì)路徑,也可以是絕對(duì)路徑。Charset用于設(shè)置網(wǎng)頁(yè)的默認(rèn)編碼格式。
access_log  logs/www.ixdba.net.access.log  main;
access_log用來(lái)指定此虛擬主機(jī)的訪問(wèn)日志存放路徑,最后的main用于指定訪問(wèn)日志的輸出格式。

6.URL匹配配置
 URL地址匹配是進(jìn)行Nginx配置中最靈活的部分。 location支持正則表達(dá)式匹配,也支持條件判斷匹配,用戶可以通過(guò)location指令實(shí)現(xiàn)Nginx對(duì)動(dòng)、靜態(tài)網(wǎng)頁(yè)進(jìn)行過(guò)濾處理。
以下這段設(shè)置是通過(guò)location指令來(lái)對(duì)網(wǎng)頁(yè)URL進(jìn)行分析處理,所有擴(kuò)展名以.gif、.jpg、.jpeg、.png、.bmp、.swf結(jié)尾的靜態(tài)文件都交給nginx處理,而expires用來(lái)指定靜態(tài)文件的過(guò)期時(shí)間,這里是30天。
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$  {
                root    /web/wwwroot/www.ixdba.net;
               expires 30d;
        }

以下這段設(shè)置是將upload和html下的所有文件都交給nginx來(lái)處理,當(dāng)然,upload和html目錄包含在/web/wwwroot/www.ixdba.net目錄中。
        location ~ ^/(upload|html)/  {
                root    /web/wwwroot/www.ixdba.net;
                expires 30d;
        }

在最后這段設(shè)置中,location是對(duì)此虛擬主機(jī)下動(dòng)態(tài)網(wǎng)頁(yè)的過(guò)濾處理,也就是將所有以.jsp為后綴的文件都交給本機(jī)的8080端口處理。
location ~ .*.jsp$ { 
    index index.jsp;       
    proxy_pass http://localhost:8080;
}


7.StubStatus模塊配置
StubStatus模塊能夠獲取Nginx自上次啟動(dòng)以來(lái)的工作狀態(tài),此模塊非核心模塊,需要在Nginx編譯安裝時(shí)手工指定才能使用此功能。
以下指令實(shí)指定啟用獲取Nginx工作狀態(tài)的功能。
        location /NginxStatus {
                        stub_status      on;
access_log              logs/NginxStatus.log;
                        auth_basic              "NginxStatus";
      auth_basic_user_file    ../htpasswd;
        }
 

stub_status設(shè)置為“on”表示啟用StubStatus的工作狀態(tài)統(tǒng)計(jì)功能。access_log 用來(lái)指定StubStatus模塊的訪問(wèn)日志文件。auth_basic是Nginx的一種認(rèn)證機(jī)制。auth_basic_user_file用來(lái)指定認(rèn)證的密碼文件,由于Nginx的auth_basic認(rèn)證采用的是與Apache兼容的密碼文件,因此需要用Apache的htpasswd命令來(lái)生成密碼文件,例如要添加一個(gè)webadmin用戶,可以使用下面方式生成密碼文件:
/usr/local/apache/bin/htpasswd -c  /opt/nginx/conf/htpasswd webadmin
會(huì)得到以下提示信息:
New password:
輸入密碼之后,系統(tǒng)會(huì)要求再次輸入密碼。確認(rèn)之后添加用戶成功。
 

要查看Nginx的運(yùn)行狀態(tài),可以輸入http://ip/ NginxStatus,然后輸入剛剛創(chuàng)建的用戶名和密碼就可以看到如下信息:
Active connections: 1 
server accepts handled requests
 393411 393411 393799
Reading: 0 Writing: 1 Waiting: 0 
 

Active connections表示當(dāng)前活躍的連接數(shù),第三行的三個(gè)數(shù)字表示 Nginx當(dāng)前總共處理了393411個(gè)連接, 成功創(chuàng)建393411次握手, 總共處理了393799個(gè)請(qǐng)求。最后一行的Reading表示Nginx讀取到客戶端Header信息數(shù), Writing表示Nginx返回給客戶端的Header信息數(shù),“Waiting”表示Nginx已經(jīng)處理完,正在等候下一次請(qǐng)求指令時(shí)的駐留連接數(shù)。
 

在最后這段設(shè)置中,設(shè)置了虛擬主機(jī)的錯(cuò)誤信息返回頁(yè)面,通過(guò)error_page指令可以定制各種錯(cuò)誤信息的返回頁(yè)面。在默認(rèn)情況下,Nginx會(huì)在主目錄的html目錄中查找指定的返回頁(yè)面,特別需要注意的是,這些錯(cuò)誤信息的返回頁(yè)面大小一定要超過(guò)512K,否者會(huì)被ie瀏覽器替換為ie默認(rèn)的錯(cuò)誤頁(yè)面。
        error_page  404              /404.html;
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
}
}

  在完成對(duì)nginx.conf文件的配置后,就可以啟動(dòng)服務(wù)了,Nginx自身提供了一些用于日常維護(hù)的命令,下面進(jìn)行詳細(xì)的介紹。
 

1.Nginx基本信息檢查

(1)檢查Nginx配置文件的正確性
 

Nginx提供的配置文件調(diào)試功能非常有用,可以快速定位配置文件存在的問(wèn)題。執(zhí)行如下命令檢測(cè)配置文件的正確性:

  1. /opt/nginx/sbin/nginx –t 或者  
  2. /opt/nginx/sbin/nginx -t -c /opt/nginx/conf/nginx.conf  

其中,“-t”參數(shù)用于檢查配置文件是否正確,但并不執(zhí)行?!?c”參數(shù)用于指定配置文件路徑,如果不指定配置文件路徑,Nginx默認(rèn)會(huì)在安裝時(shí)指定的安裝目錄下查找conf/nginx.conf文件。
如果檢測(cè)結(jié)果顯示如下信息,說(shuō)明配置文件正確。

  1. the configuration file /opt/nginx/conf/nginx.conf syntax is ok  
  2. configuration file /opt/nginx/conf/nginx.conf test is successful  

(2)顯示Nginx的版本以及相關(guān)編譯信息
 在命令行執(zhí)行以下命令可以顯示安裝Nginx的版本信息。

  1. /opt/nginx/sbin/nginx -v  

執(zhí)行以下命令顯示安裝的Nginx版本和相關(guān)編譯信息:
 

  1. /opt/nginx/sbin/nginx -V  

 不但顯示Nginx的版本信息,同時(shí)顯示nginx在編譯時(shí)指定的相關(guān)模塊信息。


2.Nginx的啟動(dòng)、關(guān)閉與重啟


Nginx對(duì)進(jìn)程的控制能力非常強(qiáng)大,可以通過(guò)信號(hào)指令控制進(jìn)程。常用的信號(hào)有:
 QUIT,表處理完當(dāng)前請(qǐng)求后,關(guān)閉進(jìn)程。
 HUP,表示重新加載配置,也就是關(guān)閉原有的進(jìn)程,并開(kāi)啟新的工作進(jìn)程。此操作不會(huì)中斷用戶的訪問(wèn)請(qǐng)求,因此可以通過(guò)此信號(hào)平滑的重啟Nginx。
 USR1,用于Nginx的日志切換,也就是重新打開(kāi)一個(gè)日志文件,例如每天要生成一個(gè)新的日志文件時(shí),可以使用這個(gè)信號(hào)來(lái)控制。 
 USR2,用于平滑升級(jí)可執(zhí)行程序。
 WINCH ,從容關(guān)閉工作進(jìn)程。
 

(1)Nginx的啟動(dòng)
Nginx的啟動(dòng)非常簡(jiǎn)單,只需輸入:
 

  1. /opt/nginx/sbin/nginx  

即可完成nginx的啟動(dòng)。nginx啟動(dòng)后,可以通過(guò)如下命令查看Nginx的啟動(dòng)進(jìn)程:
 

  1. [root@localhost logs]# ps -ef|grep nginx  
  2. root     16572     1  0 11:14 ?        00:00:00 nginx: master process /opt/nginx/sbin/nginx  
  3. nobody   16591 16572  0 11:15 ?        00:00:00 nginx: worker process  
  4. nobody   16592 16572  0 11:15 ?        00:00:00 nginx: worker process  
  5. nobody   16593 16572  0 11:15 ?        00:00:00 nginx: worker process  
  6. nobody   16594 16572  0 11:15 ?        00:00:00 nginx: worker process  

(2)Nginx的關(guān)閉
如果要關(guān)閉Nginx進(jìn)程,可以使用如下命令:
kill -XXX pid
其中,XXX就是信號(hào)名,pid是Nginx的進(jìn)程號(hào),可以通過(guò)如下兩個(gè)命令獲?。?br style="padding: 0px; margin: 0px;"> 

  1. ps -ef | grep "nginx: master process" | grep -v "grep" | awk -F ' ' '{print $2}'  
  2. cat /opt/nginx/logs/nginx.pid  

(3)Nginx的平滑重啟
要不間斷服務(wù)地重新啟動(dòng)Nginx,可以使用如下命令:
 

  1. kill -HUP ‘cat /opt/nginx/logs/nginx.pid‘ 


Nginx作為一個(gè)HTTP服務(wù)器,在功能實(shí)現(xiàn)方面和性能方面都表現(xiàn)得非常卓越,完全可以與Apache相媲美,幾乎可以實(shí)現(xiàn)Apache的所有功能,下面就介紹一些Nginx常用的配置實(shí)例,具體包含虛擬主機(jī)配置、負(fù)載均衡配置、防盜鏈配置以及日志管理等。
 

一、 虛擬主機(jī)配置實(shí)例
下面在Nginx中創(chuàng)建三個(gè)虛擬主機(jī),需要說(shuō)明的是,這里僅僅列出了虛擬主機(jī)配置部分。 
 

  1. http {  
  2.  server {  
  3.  listen          80;  
  4.  server_name     www.domain1.com;  
  5.  access_log      logs/domain1.access.log main;  
  6.  location / {  
  7.  index index.html;  
  8.  root  /web/www/domain1.com/htdocs;  
  9.  }  
  10.   }  
  11.  server {  
  12.  listen          80;  
  13.  server_name     www.domain2.com;  
  14.  access_log      logs/domain2.access.log main;  
  15.  location / {  
  16.  index index.html;  
  17.  root  /web/www/domain2.com/htdocs;  
  18.  }  
  19.   }  
  20.   include    /opt/nginx/conf/vhosts/www.domain2.com.conf;  
  21. }  

這里用到了include指令,其中/opt/nginx/conf/vhosts/www.domain2.com.conf的內(nèi)容為:
 

  1. server {  
  2.  listen          80;  
  3.  server_name     www.domain3.com;  
  4.  access_log      logs/domain3.access.log main;  
  5.  location / {  
  6.  index index.html;  
  7.  root  /web/www/domain3.com/htdocs;  
  8.  }  
  9.   }  

二、 負(fù)載均衡配置實(shí)例
下面通過(guò)Nginx的反向代理功能配置一個(gè)Nginx負(fù)載均衡服務(wù)器。后端有三個(gè)服務(wù)節(jié)點(diǎn),用于提供Web服務(wù),通過(guò)Nginx的調(diào)度實(shí)現(xiàn)三個(gè)節(jié)點(diǎn)的負(fù)載均衡。
 

  1. http   
  2. {  
  3.   upstream  myserver {  
  4.     server   192.168.12.181:80 weight=3 max_fails=3 fail_timeout=20s;  
  5.     server   192.168.12.182:80 weight=1 max_fails=3 fail_timeout=20s;  
  6.     server   192.168.12.183:80 weight=4 max_fails=3 fail_timeout=20s;  
  7.   }  
  8.  
  9.   server  
  10.   {  
  11.     listen       80;  
  12.     server_name  www.domain.com 192.168.12.189;  
  13.     index index.htm index.html;  
  14.     root  /ixdba/web/wwwroot;    
  15.  
  16. location / {  
  17.  proxy_pass http://myserver;  
  18.  proxy_next_upstream http_500 http_502 http_503 error timeout invalid_header;  
  19.  include    /opt/nginx/conf/proxy.conf;  
  20.  }  
  21.   }  
  22. }  
  23.  

在上面這個(gè)配置實(shí)例中,首先定義了一個(gè)負(fù)載均衡組myserver,然后在location部分通過(guò)“proxy_pass http://myserver”實(shí)現(xiàn)負(fù)載調(diào)度功能,其中proxy_pass指令用來(lái)指定代理的后端服務(wù)器地址和端口,地址可以是主機(jī)名或者IP地址,也可以是通過(guò)upstream指令設(shè)定的負(fù)載均衡組名稱。
proxy_next_upstream用來(lái)定義故障轉(zhuǎn)移策略,當(dāng)后端服務(wù)節(jié)點(diǎn)返回500、502、503、504和執(zhí)行超時(shí)等錯(cuò)誤時(shí),自動(dòng)將請(qǐng)求轉(zhuǎn)發(fā)到upstream負(fù)載均衡組中的另一臺(tái)服務(wù)器,實(shí)現(xiàn)故障轉(zhuǎn)移。最后通過(guò)include指令包含進(jìn)來(lái)一個(gè) proxy.conf文件。
其中/opt/nginx/conf/proxy.conf的內(nèi)容為:
 

  1. proxy_redirect off;  
  2. proxy_set_header Host $host;  
  3. proxy_set_header X-Real-IP $remote_addr;  
  4. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  
  5. proxy_connect_timeout 90;  
  6. proxy_send_timeout 90;  
  7. proxy_read_timeout 90;  
  8. proxy_buffer_size  4k;  
  9. proxy_buffers 4 32k;  
  10. proxy_busy_buffers_size 64k;  
  11. proxy_temp_file_write_size 64k;  

Nginx的代理功能是通過(guò)http proxy模塊來(lái)實(shí)現(xiàn)的。默認(rèn)在安裝Nginx時(shí)已經(jīng)安裝了http proxy模塊因此可直接使用http proxy模塊。下面詳細(xì)解釋proxy.conf文件中每個(gè)選項(xiàng)代表的含義。
 proxy_set_header:設(shè)置由后端的服務(wù)器獲取用戶的主機(jī)名或者真實(shí)IP地址,以及代理者的真實(shí)IP地址。
 client_body_buffer_size:用于指定客戶端請(qǐng)求主體緩沖區(qū)大小,可以理解為先保存到本地再傳給用戶。
 proxy_connect_timeout:表示與后端服務(wù)器連接的超時(shí)時(shí)間,即發(fā)起握手等候響應(yīng)的超時(shí)時(shí)間。
 proxy_send_timeout:表示后端服務(wù)器的數(shù)據(jù)回傳時(shí)間,即在規(guī)定時(shí)間之內(nèi)后端服務(wù)器必須傳完所有的數(shù)據(jù),否則,Nginx將斷開(kāi)這個(gè)連接。
 proxy_read_timeout:設(shè)置Nginx從代理的后端服務(wù)器獲取信息的時(shí)間,表示連接建立成功后,Nginx等待后端服務(wù)器的響應(yīng)時(shí)間,其實(shí)是Nginx已經(jīng)進(jìn)入后端的排隊(duì)之中等候處理的時(shí)間。
 proxy_buffer_size:設(shè)置緩沖區(qū)大小, 默認(rèn),該緩沖區(qū)大小等于指令proxy_buffers設(shè)置的大小。 
 proxy_buffers:設(shè)置緩沖區(qū)的數(shù)量和大小。nginx從代理的后端服務(wù)器獲取的響應(yīng)信息,會(huì)放置到緩沖區(qū)。
 proxy_busy_buffers_size:用于設(shè)置系統(tǒng)很忙時(shí)可以使用的proxy_buffers大小,官方推薦的大小為proxy_buffers*2。
 proxy_temp_file_write_size:指定proxy緩存臨時(shí)文件的大小。
 

三、 防盜鏈配置實(shí)例
 Nginx的防盜鏈功能也非常強(qiáng)大。在默認(rèn)情況下,只需要進(jìn)行簡(jiǎn)單的配置,即可實(shí)現(xiàn)防盜鏈處理。請(qǐng)看下面的這個(gè)實(shí)例:
 

  1. location ~* \.(jpg|gif|png|swf|flv|wma|wmv|asf|mp3|mmf|zip|rar)$ {  
  2.         valid_referers none blocked *.ixdba1.net ixdba1.net;  
  3.         if ($invalid_referer) {  
  4.         rewrite ^/ http://www.ixdba.net/img/error.gif;  
  5.         #return 403;  
  6.        }  
  7.         }  
  8.         location /images {  
  9.         root /opt/nginx/html;  
  10.         valid_referers none blocked *.ixdba1.net ixdba1.net;  
  11.         if ($invalid_referer) {  
  12.                    return   403;  
  13.                                 }  
  14.                         }  

在上面這段防盜鏈設(shè)置中,分別針對(duì)不同文件類型和不同的目錄進(jìn)行了設(shè)置,讀者可以根據(jù)自己的需求進(jìn)行類似的設(shè)定。
“jpg|gif|png|swf|flv|wma|wmv|asf|mp3|mmf|zip|rar”表示對(duì)以jpg、gif、png、swf、flv、wma、wmv、asf、mp3、mmf、zip和rar為后綴的文件實(shí)行防盜鏈處理。
“*.ixdba1.net ixdba1.net”表示這個(gè)請(qǐng)求可以正常訪問(wèn)上面指定的文件資源。
if{}中的內(nèi)容的意思是:如果地址不是上面指定的地址就跳轉(zhuǎn)到通過(guò)rewrite指定的地址,也可以直接通過(guò)return返回403錯(cuò)誤。
要做更加復(fù)雜的防盜鏈處理,可以使用Nginx的HttpAccessKeyModule,通過(guò)這個(gè)模塊可以實(shí)現(xiàn)功能更強(qiáng)大的防盜鏈處理,更詳細(xì)的參考官方文檔。
 

四、 日志分割配置實(shí)例
Nginx沒(méi)有類似Apache的cronolog日志分割處理的功能,但是,可以通過(guò)nginxNginx的信號(hào)控制功能利用腳本來(lái)實(shí)現(xiàn)日志的自動(dòng)切割。請(qǐng)看下面的一個(gè)實(shí)例。
Nginx對(duì)日志進(jìn)行處理的腳本:
 

  1. #/bin/bash  
  2. savepath_log='/home/nginx/logs' 
  3. nglogs='/opt/nginx/logs' 
  4.  
  5. mkdir -p  $savepath_log/$(date +%Y)/$(date +%m)  
  6. mv $nglogs/access.log  $savepath_log/$(date +%Y)/$(date +%m)/access.$(date +%Y%m%d).log  
  7. mv  $nglogs/error.log  $savepath_log/$(date +%Y)/$(date +%m)/error.$(date +%Y%m%d).log  
  8. kill -USR1 `cat /opt/nginx/logs/nginx.pid`  
  9.  

將這段腳本保存后加入到Linux的crontab守護(hù)進(jìn)程,讓此腳本在每天凌晨0點(diǎn)執(zhí)行,就可以實(shí)現(xiàn)日志的每天分割功能了。
其中,變量savepath_log指定分割后的日志存放的路徑,而變量nglogs指定Nginx日志文件的存放路徑。最后一行,通過(guò)Nginx的信號(hào)“USR1”實(shí)現(xiàn)了日志的自動(dòng)切換功能。

一、編譯安裝過(guò)程優(yōu)化

1.減小Nginx編譯后的文件大小
在編譯Nginx時(shí),默認(rèn)以debug模式進(jìn)行,而在debug模式下會(huì)插入很多跟蹤和ASSERT之類的信息,編譯完成后,一個(gè)Nginx要有好幾兆字節(jié)。在編譯前取消Nginx的debug模式,編譯完成后Nginx只有幾百千字節(jié),因此可以在編譯之前,修改相關(guān)源碼,取消debug模式,具體方法如下:
在Nginx源碼文件被解壓后,找到源碼目錄下的auto/cc/gcc文件,在其中找到如下幾行:

  1. # debug  
  2. CFLAGS=”$CFLAGS -g”  

注釋掉或刪掉這兩行,即可取消debug模式。

2.為特定的CPU指定CPU類型編譯優(yōu)化
在編譯Nginx時(shí),默認(rèn)的GCC編譯參數(shù)是“-O”,要優(yōu)化GCC編譯,可以使用以下兩個(gè)參數(shù):
--with-cc-opt='-O3'
--with-cpu-opt=CPU  #為特定的 CPU 編譯,有效的值包括:pentium, pentiumpro, pentium3, pentium4, athlon, opteron, amd64, sparc32, sparc64, ppc64
要確定CPU類型,可以通過(guò)如下命令: 
[root@localhost home]#cat /proc/cpuinfo | grep "model name"

二、利用TCMalloc優(yōu)化Nginx的性能
TCMalloc的全稱為T(mén)hread-Caching Malloc,是谷歌開(kāi)發(fā)的開(kāi)源工具“google-perftools”中的一個(gè)成員。與標(biāo)準(zhǔn)的glibc庫(kù)的malloc相比,TCMalloc庫(kù)在內(nèi)存分配效率和速度上要高很多,這在很大程度上提高了服務(wù)器在高并發(fā)情況下的性能,從而降低系統(tǒng)負(fù)載。下面簡(jiǎn)單介紹如何為Nginx添加TCMalloc庫(kù)支持。
要安裝TCMalloc庫(kù),需要安裝libunwind(32位操作系統(tǒng)不需要安裝)和google-perftools兩個(gè)軟件包,libunwind庫(kù)為基于64位CPU和操作系統(tǒng)的程序提供了基本函數(shù)調(diào)用鏈和函數(shù)調(diào)用寄存器功能。下面介紹利用TCMalloc優(yōu)化Nginx的具體操作過(guò)程:

1.安裝libunwind庫(kù)
可以從http://download.savannah.gnu.org/releases/libunwind下載相應(yīng)的libunwind版本,這里下載的是libunwind-0.99-alpha.tar.gz,安裝過(guò)程如下:
 

  1. [root@localhost home]#tar zxvf libunwind-0.99-alpha.tar.gz  
  2. [root@localhost home]# cd libunwind-0.99-alpha/  
  3. [root@localhost libunwind-0.99-alpha]#CFLAGS=-fPIC ./configure  
  4. [root@localhost libunwind-0.99-alpha]#make CFLAGS=-fPIC  
  5. [root@localhost libunwind-0.99-alpha]#make CFLAGS=-fPIC install  

2.安裝google-perftools
可以從http://google-perftools.googlecode.com下載相應(yīng)的google-perftools版本,這里下載的是google-perftools-1.8.tar.gz,安裝過(guò)程如下:
 

  1. [root@localhost home]#tar zxvf google-perftools-1.8.tar.gz  
  2. [root@localhost home]#cd google-perftools-1.8/  
  3. [root@localhost google-perftools-1.8]# ./configure  
  4. [root@localhost google-perftools-1.8]#make && make install  
  5. [root@localhost google-perftools-1.8]#echo "/usr/local/lib" > /etc/ld.so.conf.d/usr_local_lib.conf  
  6. [root@localhost google-perftools-1.8]# ldconfig  

至此,google-perftools安裝完成。

3.重新編譯Nginx
為了使Nginx支持google-perftools,需要在安裝過(guò)程中添加“–with-google_perftools_module”選項(xiàng)重新編譯Nginx,安裝代碼如下:
 

  1. [root@localhostnginx-0.7.65]#./configure \  
  2. >--with-google_perftools_module --with-http_stub_status_module  --prefix=/opt/nginx  
  3. [root@localhost nginx-0.7.65]#make  
  4. [root@localhost nginx-0.7.65]#make install  

到這里Nginx安裝完成。

4.為google-perftools添加線程目錄
創(chuàng)建一個(gè)線程目錄,這里將文件放在/tmp/tcmalloc下,操作如下:
 

  1. [root@localhost home]#mkdir /tmp/tcmalloc  
  2. [root@localhost home]#chmod 0777 /tmp/tcmalloc  

5.修改Nginx主配置文件
修改nginx.conf文件,在pid這行的下面添加如下代碼:
 

  1. #pid        logs/nginx.pid;  
  2. google_perftools_profiles /tmp/tcmalloc;  

接著,重啟Nginx,完成google-perftools的加載。

6.驗(yàn)證運(yùn)行狀態(tài)
為了驗(yàn)證google-perftools已經(jīng)正常加載,通過(guò)如下命令查看:
 

  1. [root@ localhost home]# lsof -n | grep tcmalloc  
  2. nginx      2395 nobody   9w  REG    8,8       0    1599440 /tmp/tcmalloc.2395  
  3. nginx      2396 nobody   11w REG   8,8       0    1599443 /tmp/tcmalloc.2396  
  4. nginx      2397 nobody   13w REG  8,8        0    1599441  /tmp/tcmalloc.2397  
  5. nginx     2398 nobody    15w REG  8,8     0    1599442 /tmp/tcmalloc.2398  

由于在Nginx配置文件中,設(shè)置worker_processes的值為4,因此開(kāi)啟了4個(gè)Nginx線程,每個(gè)線程會(huì)有一行記錄。每個(gè)線程文件后面的數(shù)字值就是啟動(dòng)的Nginx的PID值。
至此,利用TCMalloc優(yōu)化Nginx的操作完成。

三、Nginx內(nèi)核參數(shù)優(yōu)化
內(nèi)核參數(shù)的優(yōu)化,主要是在Linux系統(tǒng)中針對(duì)Nginx應(yīng)用而進(jìn)行的系統(tǒng)內(nèi)核參數(shù)優(yōu)化,常見(jiàn)的優(yōu)化參數(shù)值如下。
下面給出一個(gè)優(yōu)化實(shí)例以供參考:

  1. net.ipv4.tcp_max_tw_buckets = 6000 
  2. net.ipv4.ip_local_port_range = 1024 65000  
  3. net.ipv4.tcp_tw_recycle = 1 
  4. net.ipv4.tcp_tw_reuse = 1 
  5. net.ipv4.tcp_syncookies = 1 
  6. net.core.somaxconn = 262144 
  7. net.core.netdev_max_backlog = 262144 
  8. net.ipv4.tcp_max_orphans = 262144 
  9. net.ipv4.tcp_max_syn_backlog = 262144 
  10. net.ipv4.tcp_synack_retries = 1 
  11. net.ipv4.tcp_syn_retries = 1 
  12. net.ipv4.tcp_fin_timeout = 1 
  13. net.ipv4.tcp_keepalive_time = 30 

將上面的內(nèi)核參數(shù)值加入/etc/sysctl.conf文件中,然后執(zhí)行如下命令使之生效:
[root@ localhost home]#/sbin/sysctl -p
下面是對(duì)實(shí)例中選項(xiàng)的含義進(jìn)行介紹:
 net.ipv4.tcp_max_tw_buckets參數(shù)用來(lái)設(shè)定timewait的數(shù)量,默認(rèn)是180000,這里設(shè)為6000。
 net.ipv4.ip_local_port_range選項(xiàng)用來(lái)設(shè)定允許系統(tǒng)打開(kāi)的端口范圍。
 net.ipv4.tcp_tw_recycle選項(xiàng)用于設(shè)置啟用timewait快速回收。
 net.ipv4.tcp_tw_reuse選項(xiàng)用于設(shè)置開(kāi)啟重用,允許將TIME-WAIT sockets重新用于新的TCP連接。
 net.ipv4.tcp_syncookies選項(xiàng)用于設(shè)置開(kāi)啟SYN Cookies,當(dāng)出現(xiàn)SYN等待隊(duì)列溢出時(shí),啟用cookies進(jìn)行處理。
 net.core.somaxconn選項(xiàng)默認(rèn)值是128, 這個(gè)參數(shù)用于調(diào)節(jié)系統(tǒng)同時(shí)發(fā)起的tcp連接數(shù),在高并發(fā)的請(qǐng)求中,默認(rèn)的值可能會(huì)導(dǎo)致鏈接超時(shí)或者重傳,因此,需要結(jié)合并發(fā)請(qǐng)求數(shù)來(lái)調(diào)節(jié)此值。
 net.core.netdev_max_backlog選項(xiàng)表示當(dāng)每個(gè)網(wǎng)絡(luò)接口接收數(shù)據(jù)包的速率比內(nèi)核處理這些包的速率快時(shí),允許發(fā)送到隊(duì)列的數(shù)據(jù)包的最大數(shù)目。
 net.ipv4.tcp_max_orphans選項(xiàng)用于設(shè)定系統(tǒng)中最多有多少個(gè)TCP套接字不被關(guān)聯(lián)到任何一個(gè)用戶文件句柄上。如果超過(guò)這個(gè)數(shù)字,孤立連接將立即被復(fù)位并打印出警告信息。這個(gè)限制只是為了防止簡(jiǎn)單的DoS攻擊。不能過(guò)分依靠這個(gè)限制甚至人為減小這個(gè)值,更多的情況是增加這個(gè)值。
 net.ipv4.tcp_max_syn_backlog選項(xiàng)用于記錄那些尚未收到客戶端確認(rèn)信息的連接請(qǐng)求的最大值。對(duì)于有128MB內(nèi)存的系統(tǒng)而言,此參數(shù)的默認(rèn)值是1024,對(duì)小內(nèi)存的系統(tǒng)則是128。
 net.ipv4.tcp_synack_retries參數(shù)的值決定了內(nèi)核放棄連接之前發(fā)送SYN+ACK包的數(shù)量。
 net.ipv4.tcp_syn_retries選項(xiàng)表示在內(nèi)核放棄建立連接之前發(fā)送SYN包的數(shù)量。
 net.ipv4.tcp_fin_timeout選項(xiàng)決定了套接字保持在FIN-WAIT-2狀態(tài)的時(shí)間。默認(rèn)值是60秒。正確設(shè)置這個(gè)值非常重要,有時(shí)候即使一個(gè)負(fù)載很小的Web服務(wù)器,也會(huì)出現(xiàn)因?yàn)榇罅康乃捞捉幼侄a(chǎn)生內(nèi)存溢出的風(fēng)險(xiǎn)。
 net.ipv4.tcp_keepalive_time選項(xiàng)表示當(dāng)keepalive啟用的時(shí)候,TCP發(fā)送keepalive消息的頻度。默認(rèn)值是2(單位是小時(shí))。

一、什么是 FastCGI
FastCGI是一個(gè)可伸縮地、高速地在HTTP server和動(dòng)態(tài)腳本語(yǔ)言間通信的接口。多數(shù)流行的HTTP server都支持FastCGI,包括Apache、Nginx和lighttpd等,同時(shí),F(xiàn)astCGI也被許多腳本語(yǔ)言所支持,其中就有PHP。
FastCGI是從CGI發(fā)展改進(jìn)而來(lái)的。傳統(tǒng)CGI接口方式的主要缺點(diǎn)是性能很差,因?yàn)槊看蜨TTP服務(wù)器遇到動(dòng)態(tài)程序時(shí)都需要重新啟動(dòng)腳本解析器來(lái)執(zhí)行解析,然后結(jié)果被返回給HTTP服務(wù)器。這在處理高并發(fā)訪問(wèn)時(shí),幾乎是不可用的。另外傳統(tǒng)的CGI接口方式安全性也很差,現(xiàn)在已經(jīng)很少被使用了。
FastCGI接口方式采用C/S結(jié)構(gòu),可以將HTTP服務(wù)器和腳本解析服務(wù)器分開(kāi),同時(shí)在腳本解析服務(wù)器上啟動(dòng)一個(gè)或者多個(gè)腳本解析守護(hù)進(jìn)程。當(dāng)HTTP服務(wù)器每次遇到動(dòng)態(tài)程序時(shí),可以將其直接交付給FastCGI進(jìn)程來(lái)執(zhí)行,然后將得到的結(jié)果返回給瀏覽器。這種方式可以讓HTTP服務(wù)器專一地處理靜態(tài)請(qǐng)求或者將動(dòng)態(tài)腳本服務(wù)器的結(jié)果返回給客戶端,這在很大程度上提高了整個(gè)應(yīng)用系統(tǒng)的性能。

二、Nginx+FastCGI運(yùn)行原理
Nginx不支持對(duì)外部程序的直接調(diào)用或者解析,所有的外部程序(包括PHP)必須通過(guò)FastCGI接口來(lái)調(diào)用。FastCGI接口在Linux下是socket,(這個(gè)socket可以是文件socket,也可以是ip socket)。為了調(diào)用CGI程序,還需要一個(gè)FastCGI的wrapper(wrapper可以理解為用于啟動(dòng)另一個(gè)程序的程序),這個(gè)wrapper綁定在某個(gè)固定socket上,如端口或者文件socket。當(dāng)Nginx將CGI請(qǐng)求發(fā)送給這個(gè)socket的時(shí)候,通過(guò)FastCGI接口,wrapper接納到請(qǐng)求,然后派生出一個(gè)新的線程,這個(gè)線程調(diào)用解釋器或者外部程序處理腳本并讀取返回?cái)?shù)據(jù);接著,wrapper再將返回的數(shù)據(jù)通過(guò)FastCGI接口,沿著固定的socket傳遞給Nginx;最后,Nginx將返回的數(shù)據(jù)發(fā)送給客戶端,這就是Nginx+FastCGI的整個(gè)運(yùn)作過(guò)程。詳細(xì)的過(guò)程,如圖1所示。
 
 

 

圖1 Nginx+FastCGI運(yùn)行原理

三、spawn-fcgi與PHP-FPM

前面介紹過(guò),F(xiàn)astCGI接口方式在腳本解析服務(wù)器上啟動(dòng)一個(gè)或者多個(gè)守護(hù)進(jìn)程對(duì)動(dòng)態(tài)腳本進(jìn)行解析,這些進(jìn)程就是FastCGI進(jìn)程管理器,或者稱之為FastCGI引擎, spawn-fcgi與PHP-FPM就是支持PHP的兩個(gè)FastCGI進(jìn)程管理器。
下面簡(jiǎn)單介紹spawn-fcgi與PHP-FPM的異同。
 

spawn-fcgi是HTTP服務(wù)器lighttpd的一部分,目前已經(jīng)獨(dú)立成為一個(gè)項(xiàng)目,一般與lighttpd配合使用來(lái)支持PHP,但是ligttpd的spwan-fcgi在高并發(fā)訪問(wèn)的時(shí)候,會(huì)出現(xiàn)內(nèi)存泄漏甚至自動(dòng)重啟FastCGI的問(wèn)題。
 

Nginx是個(gè)輕量級(jí)的HTTP server,必須借助第三方的FastCGI處理器才可以對(duì)PHP進(jìn)行解析,因此Nginx+spawn-fcgi的組合也可以實(shí)現(xiàn)對(duì)PHP的解析,這里不過(guò)多講述。
 

PHP-FPM也是一個(gè)第三方的FastCGI進(jìn)程管理器,它是作為PHP的一個(gè)補(bǔ)丁來(lái)開(kāi)發(fā)的,在安裝的時(shí)候也需要和PHP源碼一起編譯,也就是說(shuō)PHP-FPM被編譯到PHP內(nèi)核中,因此在處理性能方面更加優(yōu)秀;同時(shí)它在處理高并發(fā)方面也比spawn-fcgi引擎好很多,因此,推薦Nginx+PHP/PHP-FPM這個(gè)組合對(duì)PHP進(jìn)行解析。
 

FastCGI 的主要優(yōu)點(diǎn)是把動(dòng)態(tài)語(yǔ)言和HTTP Server分離開(kāi)來(lái),所以Nginx與PHP/PHP-FPM經(jīng)常被部署在不同的服務(wù)器上,以分擔(dān)前端Nginx服務(wù)器的壓力,使Nginx專一處理靜態(tài)請(qǐng)求和轉(zhuǎn)發(fā)動(dòng)態(tài)請(qǐng)求,而PHP/PHP-FPM服務(wù)器專一解析PHP動(dòng)態(tài)請(qǐng)求。

四、 PHP與PHP-FPM的安裝及優(yōu)化

1.下載安裝包
www.php.net官方網(wǎng)站下載PHP源碼包,這里下載的是穩(wěn)定版php-5.2.13.tar.gz。
http://php-fpm.org/downloads/下載對(duì)應(yīng)的PHP-FPM源碼包,這里下載的是php-5.2.13-fpm-0.5.13.diff.gz。
需要注意,在下載軟件包版本時(shí),盡量使PHP和PHP-FPM版本一致,如果版本之間相差太大,可以會(huì)出現(xiàn)兼容問(wèn)題。

2.配置安裝環(huán)境
安裝PHP需要下面軟件包的支持,如果沒(méi)有安裝,請(qǐng)自行安裝。

  1. gcc gcc-c++ libxml2 libxml2-devel autoconf libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel  zlib zlib-devel glibc glibc-devel glib2 glib2-devel   

由于各個(gè)Linux系統(tǒng)版本的不確定性,讀者也可以在安裝PHP過(guò)程中,根據(jù)錯(cuò)誤提示信息,安裝對(duì)應(yīng)的軟件庫(kù)。

3.開(kāi)始編譯安裝PHP和PHP-FPM
編譯安裝PHP和PHP-FPM很簡(jiǎn)單,下面是安裝過(guò)程:

  1. [root@localhost local]#tar zxvf php-5.2.13.tar.gz  
  2. [root@localhost local]#gzip -cd php-5.2.13-fpm-0.5.13.diff.gz | patch -d php-5.2.13 -p1  
  3. [root@localhost local]#cd php-5.2.13  
  4. [root@localhost php-5.2.13]#./configure  --prefix=/usr/local/php --enable-fastcgi --enable-fpm  
  5. [root@localhost php-5.2.13]#make  
  6. [root@localhost php-5.2.13]#make install  
  7. [root@localhost php-5.2.13]cp php.ini-dist /usr/local/php/lib/php.ini  

其中,第二步將PHP-FPM作為補(bǔ)丁加入PHP源碼中。
在“./configure”編譯選項(xiàng)中,指定將PHP安裝到/usr/local下,“--enable-fastcgi”是啟用對(duì)PHP的FastCGI支持,“--enable-fpm”是激活對(duì)FastCGI模式的fpm支持。
在編譯PHP時(shí)可以加入很多編譯選項(xiàng),但是這里為了介紹PHP的FastCGI功能沒(méi)有加入更多的編譯選項(xiàng)。

4.配置與優(yōu)化PHP-FPM
PHP的全局配置文件是php.ini,在上面的步驟中,已經(jīng)將此文件復(fù)制到了/usr/local/php/lib/php.ini下。可以根據(jù)每個(gè)應(yīng)用需求的不同,對(duì)php.ini進(jìn)行相應(yīng)的配置。
下面重點(diǎn)介紹PHP-FPM引擎的配置文件。
 

根據(jù)上面指定的安裝路徑,PHP-FPM的默認(rèn)配置文件為/usr/local/php/etc/php-fpm.conf。
php-fpm.conf是一個(gè)XML格式的純文本文件,其內(nèi)容很容易看明白。這里重點(diǎn)介紹幾個(gè)重要的配置標(biāo)簽:
 

標(biāo)簽listen_address是配置fastcgi進(jìn)程監(jiān)聽(tīng)的IP地址以及端口,默認(rèn)是127.0.0.1:9000。
<value name="listen_address">127.0.0.1:9000</value> 
 

標(biāo)簽display_errors用來(lái)設(shè)置是否顯示PHP錯(cuò)誤信息,默認(rèn)是0,不顯示錯(cuò)誤信息,設(shè)置為1可以顯示PHP錯(cuò)誤信息。
<value name="display_errors">0</value>
 

標(biāo)簽user和group用于設(shè)置運(yùn)行FastCGI進(jìn)程的用戶和用戶組。需要注意的是,這里指定的用戶和用戶組要和Nginx配置文件中指定的用戶和用戶組一致。
<value name="user">nobody</value> 
<value name="group">nobody</value> 
 

標(biāo)簽max_children用于設(shè)置FastCGI的進(jìn)程數(shù)。根據(jù)官方建議,小于2GB內(nèi)存的服務(wù)器,可以只開(kāi)啟64個(gè)進(jìn)程,4GB以上內(nèi)存的服務(wù)器可以開(kāi)啟200個(gè)進(jìn)程。
<value name="max_children">5</value>
 

標(biāo)簽request_terminate_timeout用于設(shè)置FastCGI執(zhí)行腳本的時(shí)間。默認(rèn)是0s,也就是無(wú)限執(zhí)行下去,可以根據(jù)情況對(duì)其進(jìn)行修改。
<value name="request_terminate_timeout">0s</value>
 

標(biāo)簽rlimit_files用于設(shè)置PHP-FPM對(duì)打開(kāi)文件描述符的限制,默認(rèn)值為1024。這個(gè)標(biāo)簽的值必須和Linux內(nèi)核打開(kāi)文件數(shù)關(guān)聯(lián)起來(lái),例如要將此值設(shè)置為65535,就必須在Linux命令行執(zhí)行'ulimit -HSn 65536'。
<value name="rlimit_files">1024</value>
 

標(biāo)簽max_requests指明了每個(gè)children最多處理多少個(gè)請(qǐng)求后便會(huì)被關(guān)閉,默認(rèn)的設(shè)置是500。
<value name="max_requests">500</value>
 

標(biāo)簽allowed_clients用于設(shè)置允許訪問(wèn)FastCGI進(jìn)程解析器的IP地址。如果不在這里指定IP地址,Nginx轉(zhuǎn)發(fā)過(guò)來(lái)的PHP解析請(qǐng)求將無(wú)法被接受。
<value name="allowed_clients">127.0.0.1</value>

5.管理FastCGI進(jìn)程
在配置完php-fpm后,就可以啟動(dòng)FastCGI進(jìn)程了。啟動(dòng)fastcgi進(jìn)程有兩種方式:

  1. /usr/local/php/bin/php-cgi --fpm   
  2. 或者  
  3. /usr/local/php/sbin/php-fpm  start  

建議采用第二種方式啟動(dòng)FastCGI進(jìn)程。
 /usr/local/php/sbin/php-fpm還有其他參數(shù),具體為start|stop|quit|restart|reload|logrotate。
每個(gè)啟動(dòng)參數(shù)的含義如下:

  1.  start,啟動(dòng)PHP的FastCGI進(jìn)程。  
  2.  stop,強(qiáng)制終止PHP的FastCGI進(jìn)程。  
  3.  quit,平滑終止PHP的FastCGI進(jìn)程。  
  4.  restart, 重啟PHP的FastCGI進(jìn)程。  
  5.  reload, 重新加載PHP的php.ini。  
  6.  logrotate, 重新啟用log文件。  

reload是個(gè)很重要的參數(shù),它可以在PHP的FastCGI進(jìn)程不中斷的情況下重新加載改動(dòng)過(guò)的php.ini,因此通過(guò)php-fpm可以平滑變更FastCGI模式下的PHP設(shè)置。


在FastCGI進(jìn)程啟動(dòng)后,其監(jiān)聽(tīng)的IP地址和端口也隨即啟動(dòng),可以通過(guò)ps和netstat查看相關(guān)信息。

  1.  [root@localhost php]# netstat -antl|grep 9000  
  2. tcp        0      0 127.0.0.1:9000              0.0.0.0:*                   LISTEN    
  3. [root@localhost php]# ps -ef|grep php-cgi  
  4. root      3567     1     0  17:06 ?       00:00:00 /usr/local/php/bin/php-cgi --fpm --fpm-config /usr/local/php/etc/php-fpm.conf  
  5. nobody    3568  3567  0  17:06 ?        00:00:00 /usr/local/php/bin/php-cgi --fpm --fpm-config /usr/local/php/etc/php-fpm.conf  
  6. nobody    3569  3567  0  17:06 ?        00:00:00 /usr/local/php/bin/php-cgi --fpm --fpm-config /usr/local/php/etc/php-fpm.conf  
  7. nobody    3570  3567  0  17:06 ?        00:00:00 /usr/local/php/bin/php-cgi --fpm --fpm-config /usr/local/php/etc/php-fpm.conf  
  8. nobody    3571  3567  0  17:06 ?        00:00:00 /usr/local/php/bin/php-cgi --fpm --fpm-config /usr/local/php/etc/php-fpm.conf  
  9. nobody    3572  3567  0  17:06 ?        00:00:00 /usr/local/php/bin/php-cgi --fpm --fpm-config /usr/local/php/etc/php-fpm.conf  
  10. root      3583  3524  0 17:09 pts/1    00:00:00 grep php-cgi  

五、配置Nginx來(lái)支持PHP
Nginx的安裝特別簡(jiǎn)單,前面已經(jīng)對(duì)此進(jìn)行了詳細(xì)介紹,這里不再進(jìn)行講述。下面重點(diǎn)介紹Nginx如何通過(guò)php-fpm的FastCGI進(jìn)程對(duì)PHP進(jìn)行解析處理。
由于Nginx本身不會(huì)對(duì)PHP進(jìn)行解析,因此要實(shí)現(xiàn)Nginx對(duì)PHP的支持,其實(shí)是將對(duì)PHP頁(yè)面的請(qǐng)求交給fastCGI進(jìn)程監(jiān)聽(tīng)的IP地址及端口。如果把php-fpm當(dāng)做動(dòng)態(tài)應(yīng)用服務(wù)器,那么Nginx其實(shí)就是一個(gè)反向代理服務(wù)器。Nginx通過(guò)反向代理功能實(shí)現(xiàn)對(duì)PHP的解析,這就是Nginx實(shí)現(xiàn)PHP動(dòng)態(tài)解析的原理。
這里假定Nginx的安裝目錄為/usr/local,則Nginx配置文件的路徑為/usr/local/nginx/conf/nginx.conf。下面是在Nginx下支持PHP解析的一個(gè)虛擬主機(jī)配置實(shí)例。

  1.         server {  
  2.  include port.conf;  
  3.  server_name www.ixdba.net ixdba.net;  
  4.  
  5.   location / {  
  6.  index index.html index.php;  
  7.  root /web/www/www.ixdba.net;  
  8.  }  
  9.  
  10.  location ~ \.php$ {  
  11.             root           html;  
  12.             fastcgi_pass   127.0.0.1:9000;  
  13.             fastcgi_index  index.php;  
  14.             fastcgi_param  SCRIPT_FILENAME  html$fastcgi_script_name;  
  15.             include        fastcgi_params;  
  16.         }  
  17. }  
  18.  

通過(guò)location指令,將所有以php為后綴的文件都交給127.0.0.1:9000來(lái)處理,而這里的IP地址和端口就是FastCGI進(jìn)程監(jiān)聽(tīng)的IP地址和端口。
fastcgi_param指令指定放置PHP動(dòng)態(tài)程序的主目錄,也就是$fastcgi_script_name前面指定的路徑,這里是/usr/local/nginx/html目錄,建議將這個(gè)目錄與Nginx虛擬主機(jī)指定的根目錄保持一致,當(dāng)然也可以不一致。
fastcgi_params文件是FastCGI進(jìn)程的一個(gè)參數(shù)配置文件,在安裝Nginx后,會(huì)默認(rèn)生成一個(gè)這樣的文件,這里通過(guò)include指令將FastCGI參數(shù)配置文件包含了進(jìn)來(lái)。
接下來(lái),啟動(dòng)nginx服務(wù)。
/usr/local/nginx/sbin/nginx
到此為止,Nginx+PHP已經(jīng)配置完成。

六、測(cè)試Nginx對(duì)PHP的解析功能
這里在/usr/local/nginx/html目錄下創(chuàng)建一個(gè)phpinfo.php文件,內(nèi)容如下:
<?php phpinfo(); ?>
然后通過(guò)瀏覽器訪問(wèn)http://www.ixdba.net/index.html,默認(rèn)會(huì)在瀏覽器顯示“Welcome to Nginx!”表示Nginx正常運(yùn)行。
接著在瀏覽器中訪問(wèn)http://www.ixdba.net/phpinfo.php,如果PHP能夠正常解析,會(huì)出現(xiàn)PHP安裝配置以及功能列表統(tǒng)計(jì)信息。

七、實(shí)例講解Nginx中FastCGI參數(shù)的優(yōu)化
在配置完成Nginx+FastCGI之后,為了保證Nginx下PHP環(huán)境的高速穩(wěn)定運(yùn)行,需要添加一些FastCGI優(yōu)化指令。下面給出一個(gè)優(yōu)化實(shí)例,將下面代碼添加到Nginx主配置文件中的HTTP層級(jí)。

  1. fastcgi_cache_path /usr/local/nginx/fastcgi_cache levels=1:2 keys_zone=TEST:10m inactive=5m;    
  2. fastcgi_connect_timeout 300;    
  3. fastcgi_send_timeout 300;    
  4. fastcgi_read_timeout 300;    
  5. fastcgi_buffer_size 64k;    
  6. fastcgi_buffers 4 64k;    
  7. fastcgi_busy_buffers_size 128k;    
  8. fastcgi_temp_file_write_size 128k;    
  9. fastcgi_cache TEST;    
  10. fastcgi_cache_valid 200 302 1h;    
  11. fastcgi_cache_valid 301 1d;    
  12. fastcgi_cache_valid any 1m;     

下面是對(duì)上述代碼的含義進(jìn)行介紹。
第一行代碼是為FastCGI緩存指定一個(gè)文件路徑、目錄結(jié)構(gòu)等級(jí)、關(guān)鍵字區(qū)域存儲(chǔ)時(shí)間和非活動(dòng)刪除時(shí)間。
fastcgi_connect_timeout指定連接到后端FastCGI的超時(shí)時(shí)間。
fastcgi_send_timeout指定向FastCGI傳送請(qǐng)求的超時(shí)時(shí)間,這個(gè)值是已經(jīng)完成兩次握手后向FastCGI傳送請(qǐng)求的超時(shí)時(shí)間。
fastcgi_read_timeout指定接收FastCGI應(yīng)答的超時(shí)時(shí)間,這個(gè)值是已經(jīng)完成兩次握手后接收FastCGI應(yīng)答的超時(shí)時(shí)間。

fastcgi_buffer_size用于指定讀取FastCGI應(yīng)答第一部分需要用多大的緩沖區(qū),這個(gè)值表示將使用1個(gè)64KB的緩沖區(qū)讀取應(yīng)答的第一部分(應(yīng)答頭),可以設(shè)置為fastcgi_buffers選項(xiàng)指定的緩沖區(qū)大小。

fastcgi_buffers指定本地需要用多少和多大的緩沖區(qū)來(lái)緩沖FastCGI的應(yīng)答請(qǐng)求。如果一個(gè)PHP腳本所產(chǎn)生的頁(yè)面大小為256KB,那么會(huì)為其分配4個(gè)64KB的緩沖區(qū)來(lái)緩存;如果頁(yè)面大小大于256KB,那么大于256KB的部分會(huì)緩存到fastcgi_temp指定的路徑中,但是這并不是好方法,因?yàn)閮?nèi)存中的數(shù)據(jù)處理速度要快于硬盤(pán)。一般這個(gè)值應(yīng)該為站點(diǎn)中PHP腳本所產(chǎn)生的頁(yè)面大小的中間值,如果站點(diǎn)大部分腳本所產(chǎn)生的頁(yè)面大小為256KB,那么可以把這個(gè)值設(shè)置為“16 16k”、“4 64k”等。

fastcgi_busy_buffers_size的默認(rèn)值是fastcgi_buffers的兩倍。

fastcgi_temp_file_write_size表示在寫(xiě)入緩存文件時(shí)使用多大的數(shù)據(jù)塊,默認(rèn)值是fastcgi_buffers的兩倍。

fastcgi_cache表示開(kāi)啟FastCGI緩存并為其指定一個(gè)名稱。開(kāi)啟緩存非常有用,可以有效降低CPU的負(fù)載,并且防止502錯(cuò)誤的發(fā)生,但是開(kāi)啟緩存也會(huì)引起很多問(wèn)題,要視具體情況而定。
fastcgi_cache_valid、fastcgi用來(lái)指定應(yīng)答代碼的緩存時(shí)間,實(shí)例中的值表示將200和302應(yīng)答緩存一個(gè)小時(shí),將301應(yīng)答緩存1天,其他應(yīng)答均緩存1分鐘。

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開(kāi)APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
第1章 輕量級(jí)HTTP服務(wù)器Nginx
Apache和Nginx WEB原理
nginx 并發(fā)監(jiān)控
nginx詳解
使用 Nginx 提升網(wǎng)站訪問(wèn)速度
2、認(rèn)識(shí)Nginx配置文件
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服