亚洲熟女综合色一区二区三区,亚洲精品中文字幕无码蜜桃,亚洲va欧美va日韩va成人网,亚洲av无码国产一区二区三区,亚洲精品无码久久久久久久

秒懂!四步16點(diǎn)高效搞定高性能web服務(wù)器nginx

本文由馬哥教育面授班23期學(xué)員推薦,轉(zhuǎn)載自互聯(lián)網(wǎng),作者為dongsong,內(nèi)容略經(jīng)小編改編和加工,觀點(diǎn)跟作者無(wú)關(guān),最后感謝作者的辛苦貢獻(xiàn)與付出。

Nginx(讀音engine x)服務(wù)器由于性能優(yōu)秀穩(wěn)定、配置簡(jiǎn)單以及跨平臺(tái),被越來(lái)越多的公司和個(gè)人所采用,現(xiàn)已成為市場(chǎng)份額繼Apache之后的第二大Web服務(wù)器。各大小網(wǎng)站論壇博客也介紹說(shuō)明了Nginx從安裝到優(yōu)化的各種配置。

不過(guò)看了很多這些相關(guān)Nginx的文檔之后,發(fā)現(xiàn)一個(gè)比較大的問(wèn)題,就是這些文檔基本也就從兩個(gè)方面著手,一是修改Nginx的配置文件,二是調(diào)整操作系統(tǒng)的相關(guān)內(nèi)核參數(shù);而且文檔說(shuō)明也不夠明了,缺乏比較系統(tǒng)級(jí)別的優(yōu)化。

本文將從Nginx源碼編譯安裝開(kāi)始,到修改配置文件,調(diào)整系統(tǒng)內(nèi)核參數(shù)以及架構(gòu)四個(gè)方面著手分別介紹如何優(yōu)化。

一.???? 安裝


(1) ?精簡(jiǎn)模塊

Nginx由于不斷添加新的功能,附帶的模塊也越來(lái)越多。很多操作系統(tǒng)廠商為了用戶方便安裝管理,都增加了rpm、deb或者其他自有格式軟件包,可以本地甚至在線安裝。不過(guò)我不太建議使用這種安裝方式。這雖然簡(jiǎn)化了安裝,在線安裝甚至可以自動(dòng)解決軟件依賴關(guān)系,但是安裝后軟件的文件布局過(guò)于分散,不便管理維護(hù);同時(shí)也正是由于存在軟件包之間的依賴關(guān)系,導(dǎo)致當(dāng)有安全漏洞、或者其它問(wèn)題,想要通過(guò)更新升級(jí)Nginx新版本時(shí)卻發(fā)現(xiàn)yum、deb源還未發(fā)布新版本(一般都落后于官網(wǎng)發(fā)布的軟件版本)。最重要的是采用非源碼編譯安裝的方式,默認(rèn)會(huì)添加入許多模塊,比如郵件相關(guān)、uwsgi、memcache等等,很多網(wǎng)站運(yùn)行時(shí)這些模塊根本未用到,雖然平時(shí)占用的資源很小,但是仍然可能是壓彎駱駝的一根稻草。各種非必需模塊默認(rèn)安裝運(yùn)行的同時(shí),也給Web系統(tǒng)帶來(lái)了安全隱患。盡量保持軟件的輕裝上陣,是每個(gè)運(yùn)維應(yīng)當(dāng)盡力做到的,所以我建議一般常用的服務(wù)器軟件使用源碼編譯安裝管理。。我一般使用的編譯參數(shù)如下,PHP相關(guān)模塊fastcgi被保留用作后文優(yōu)化說(shuō)明,:

./configure?\

"--prefix=/App/nginx"?\

"--with-http_stub_status_module"?\

"--without-http_auth_basic_module"?\

"--without-http_autoindex_module"?\

"--without-http_browser_module"?\

"--without-http_empty_gif_module"?\

"--without-http_geo_module"?\

"--without-http_limit_conn_module"?\

"--without-http_limit_req_module"?\

"--without-http_map_module"?\

"--without-http_memcached_module"?\

"--without-http_proxy_module"?\

"--without-http_referer_module"?\

"--without-http_scgi_module"?\

"--without-http_split_clients_module"?\

"--without-http_ssi_module"?\

"--without-http_upstream_ip_hash_module"?\

"--without-http_upstream_keepalive_module"?\

"--without-http_upstream_least_conn_module"?\

"--without-http_userid_module"?\

"--without-http_uwsgi_module"?\

"--without-mail_imap_module"?\

"--without-mail_pop3_module"?\

"--without-mail_smtp_module"?\

"--without-poll_module"?\

"--without-select_module"?\

"--with-cc-opt='-O2'"

編譯參數(shù)根據(jù)網(wǎng)站是否真正用到的原則增添或者減少,比如我們公司如果需要用到ssi模塊,從而能夠?qū)崿F(xiàn)訪問(wèn)shtml頁(yè)面,可以將第17行刪除,那么Nginx將默認(rèn)安裝。大家可以通過(guò)運(yùn)行 "./configure --help" 查看編譯幫助,決定是否需要安裝哪些模塊。

(2) ?GCC編譯參數(shù)優(yōu)化 [可選項(xiàng)】

GCC總共提供了5級(jí)編譯優(yōu)化級(jí)別:

-O0:無(wú)優(yōu)化。

-O和-O1:使用能減少目標(biāo)代碼尺寸以及執(zhí)行時(shí)間并且不會(huì)使編譯時(shí)間明顯增加的優(yōu)化。在編譯大型程序的時(shí)候會(huì)顯著增加編譯時(shí)內(nèi)存的使用。

-O2:包含-O1的優(yōu)化并增加了不需要在目標(biāo)文件大小和執(zhí)行速度上進(jìn)行折衷的優(yōu)化。編譯器不執(zhí)行循環(huán)展開(kāi)以及函數(shù)內(nèi)聯(lián)。此選項(xiàng)將增加編譯時(shí)間和目標(biāo)文件的執(zhí)行性能。

-Os:可以看成 -O2.5,專門(mén)優(yōu)化目標(biāo)文件大小,執(zhí)行所有的不增加目標(biāo)文件大小的-O2優(yōu)化選項(xiàng),并且執(zhí)行專門(mén)減小目標(biāo)文件大小的優(yōu)化選項(xiàng)。適用于磁盤(pán)空間緊張時(shí)使用。但有可能有未知的問(wèn)題發(fā)生,況且目前硬盤(pán)容量很大,常用程序無(wú)必要使用。

-O3:打開(kāi)所有 -O2 的優(yōu)化選項(xiàng)外增加 -finline-functions、-funswitch-loops、-fgcse-after-reload 優(yōu)化選項(xiàng)。相對(duì)于 -O2 性能并未有較多提高,編譯時(shí)間也最長(zhǎng),生成的目標(biāo)文件也更大更占內(nèi)存,有時(shí)性能不增反而降低,甚至產(chǎn)生不可預(yù)知的問(wèn)題(包括錯(cuò)誤),所以并不被大多數(shù)軟件安裝推薦,除非有絕對(duì)把握方可使用此優(yōu)化級(jí)別。

修改GCC編譯參數(shù),提高編譯優(yōu)化級(jí)別,此方法適用于所有通過(guò)GCC編譯安裝的程序,不止Nginx。穩(wěn)妥起見(jiàn)用 -O2,這也是大多數(shù)軟件編譯推薦的優(yōu)化級(jí)別。查看Nginx源碼文件 auto/cc/gcc,搜索NGX_GCC_OPT,默認(rèn)GCC編譯參數(shù)為-O,可以直接修改內(nèi)容為NGX_GCC_OPT="-O2"或者在 ./configure配置時(shí)添加--with-cc-opt='-O2'選項(xiàng)。

二. ?????配置


應(yīng)用服務(wù)器的性能優(yōu)化主要在合理使用CPU、內(nèi)存、磁盤(pán)IO和網(wǎng)絡(luò)IO四個(gè)方面,現(xiàn)在我們從Nginx配置文件 nginx.conf 入手進(jìn)行優(yōu)化:

(1) ?工作進(jìn)程數(shù)的選擇

指令:worker_processes

定義了Nginx對(duì)外提供web服務(wù)時(shí)的工作進(jìn)程數(shù)。最優(yōu)值取決于許多因素,包括(但不限于)CPU核心的數(shù)量、存儲(chǔ)數(shù)據(jù)的硬盤(pán)數(shù)量及負(fù)載模式。不能確定的時(shí)候,將其設(shè)置為可用的CPU內(nèi)核數(shù)將是一個(gè)好的開(kāi)始(設(shè)置為“auto”將嘗試自動(dòng)檢測(cè)它)。Shell執(zhí)行命令??ps ax | grep "nginx: worker process" | grep -v "grep" 可以看到運(yùn)行中的Nginx工作進(jìn)程數(shù),一般建議設(shè)置成服務(wù)器邏輯核心數(shù),Shell執(zhí)行命令?cat /proc/cpuinfo | grep processor | wc -l 可以檢測(cè)出服務(wù)器邏輯核心總數(shù),偷懶可以直接寫(xiě)auto,Nginx自適應(yīng)。

(2) ?是否綁定CPU

指令:worker_cpu_affinity

綁定工作進(jìn)程到對(duì)應(yīng)CPU核心,Nginx默認(rèn)未開(kāi)啟CPU綁定。目前的服務(wù)器一般為多核CPU,當(dāng)并發(fā)很大時(shí),服務(wù)器各個(gè)CPU的使用率可能出現(xiàn)嚴(yán)重不均衡的局面,這時(shí)候可以考慮使用CPU綁定,以達(dá)到CPU使用率相對(duì)均勻的狀態(tài),充分發(fā)揮多核CPU的優(yōu)勢(shì)。top、htop等程序可以查看所有CPU核心的使用率狀況。綁定樣例:

worker_processes????4;

worker_cpu_affinity?0001?0010?0100?1000;

(3) ?打開(kāi)文件數(shù)限制

指令:worker_rlimit_nofile

設(shè)定了每個(gè)Nginx工作進(jìn)程打開(kāi)的最大文件數(shù),受限于系統(tǒng)的用戶進(jìn)程打開(kāi)文件數(shù)限制,未設(shè)置則使用系統(tǒng)默認(rèn)值。理論上應(yīng)該設(shè)置為當(dāng)前Shell啟動(dòng)進(jìn)程的最大打開(kāi)文件數(shù)除以Nginx的工作進(jìn)程數(shù)。由于Nginx的工作進(jìn)程打開(kāi)文件數(shù)并不一完全均勻,所以可以將其設(shè)置成Shell啟動(dòng)進(jìn)程的最大打開(kāi)文件數(shù)。Shell執(zhí)行命令 ulimit -n?可以查看當(dāng)前登錄Shell會(huì)話最大打開(kāi)文件數(shù)數(shù)限制。Linux系統(tǒng)用戶進(jìn)程默認(rèn)同時(shí)打開(kāi)文件最大數(shù)為1024,這個(gè)值太小,訪問(wèn)量稍大就報(bào)“too many open files"。Shell執(zhí)行命令先修改用戶打開(kāi)文件數(shù)限制:

echo?"*?-?nofile?65536"?>>?/etc/security/limits.conf

然后添加入/etc/profile如下兩行內(nèi)容,修改所有Shell和通過(guò)Shell啟動(dòng)的進(jìn)程打開(kāi)文件數(shù)限制:

echo?"ulimit?-n?65536"?>>?/etc/profile

Shell執(zhí)行命令使當(dāng)前Shell臨時(shí)會(huì)話立即生效:

ulimit?-n?65536

(4) 驚群?jiǎn)栴}

指令:accept_mutex

如果?accept_mutex 指令值為 on 啟用,那么將輪流喚醒一個(gè)工作進(jìn)程接收處理新的連接,其余工作進(jìn)程繼續(xù)保持睡眠;如果值為 off 關(guān)閉,那么將喚醒所有工作進(jìn)程,由系統(tǒng)通過(guò)use指令指定的網(wǎng)絡(luò)IO模型調(diào)度決定由哪個(gè)工作進(jìn)程處理,未接收到連接請(qǐng)求的工作進(jìn)程繼續(xù)保持睡眠,這就是所謂的“驚群?jiǎn)栴}”。Web服務(wù)器Apache的進(jìn)程數(shù)很多,成百上千也是時(shí)有的事,“驚群?jiǎn)栴}”也尤為明顯。Nginx為了穩(wěn)定,參數(shù)值保守的設(shè)置為 on 開(kāi)啟狀態(tài)??梢詫⑵湓O(shè)置成Off 提高性能和吞吐量,但這樣也會(huì)帶來(lái)上下文切換增多或者負(fù)載升高等等其它資源更多消耗的后果。

(5) ?網(wǎng)絡(luò)IO模型

指令:use

定義了Nginx設(shè)置用于復(fù)用客戶端線程的輪詢方法(也可稱多路復(fù)用網(wǎng)絡(luò)IO模型)。這自然是選擇效率更高的優(yōu)先,Linux 2.6+內(nèi)核推薦使用epoll,F(xiàn)reeBSD推薦使用kqueue,安裝時(shí)Nginx會(huì)自動(dòng)選擇。

(6) ?連接數(shù)

指令:worker_connections

定義了Nginx一個(gè)工作進(jìn)程的最大同時(shí)連接數(shù),不僅限于客戶端連接,包括了和后端被代理服務(wù)器等其他的連接。官網(wǎng)文檔還指出了該參數(shù)值不能超過(guò)?worker_rlimit_nofile 值,所以建議設(shè)置成和?worker_rlimit_nofile 值相等。

(7) ?打開(kāi)文件緩存

指令:open_file_cache

開(kāi)啟關(guān)閉打開(kāi)文件緩存,默認(rèn)值 off 關(guān)閉,強(qiáng)烈建議開(kāi)啟,可以避免重新打開(kāi)同一文件帶來(lái)的系統(tǒng)開(kāi)銷,節(jié)省響應(yīng)時(shí)間。如需開(kāi)啟必須后接參數(shù) max=數(shù)字,設(shè)置緩存元素的最大數(shù)量。當(dāng)緩存溢出時(shí),使用LRU(最近最少使用)算法刪除緩存中的元素;可選參數(shù) inactive=時(shí)間?設(shè)置超時(shí),在這段時(shí)間內(nèi)緩存元素如果沒(méi)有被訪問(wèn),將從緩存中刪除。示例:open_file_cache max=65536 ?inactive=60s。

指令:open_file_cache_valid

設(shè)置檢查open_file_cache緩存的元素的時(shí)間間隔。

指令:open_file_cache_min_uses

設(shè)置在由open_file_cache指令的inactive參數(shù)配置的超時(shí)時(shí)間內(nèi), 文件應(yīng)該被訪問(wèn)的最小次數(shù)。如果訪問(wèn)次數(shù)大于等于此值,文件描述符會(huì)保留在緩存中,否則從緩存中刪除。

(8) ?日志相關(guān)

指令:access_log 和?error_log

當(dāng)并發(fā)很大時(shí),Nginx的訪問(wèn)日志和錯(cuò)誤日志的保存肯定會(huì)造成對(duì)磁盤(pán)的大量讀寫(xiě),也將影響Nginx的性能。并發(fā)量越大,IO越高。這時(shí)候可以考慮關(guān)閉訪問(wèn)日志和錯(cuò)誤日志,或者將日志保存到tmpfs文件系統(tǒng)里,或者減少保存的訪問(wèn)日志條目和錯(cuò)誤日志的級(jí)別,從而避免磁盤(pán)IO的影響。關(guān)閉日志使用 access_logoff。如必須保存日志,可以按每日或者每時(shí)或者其它時(shí)間段對(duì)日志做切割,這也可以減小IO,雖然可能效果不是特別大,不過(guò)因?yàn)槿罩疚募叽缱冃×撕芏?,也方便查閱或歸檔分析日志。一般線上環(huán)境建議錯(cuò)誤日志設(shè)置為 error 或者 crit。自定義訪問(wèn)日志的條目和錯(cuò)誤日志的級(jí)別,詳細(xì)信息可以參閱官網(wǎng)或者網(wǎng)上其它文檔,按需修改。

(9) ?隱藏Nginx版本號(hào)

指令:server_tokens

開(kāi)啟或關(guān)閉“Server”響應(yīng)頭中輸出的Nginx版本號(hào)。推介設(shè)置為 off,關(guān)閉顯示響應(yīng)頭的版本號(hào),對(duì)性能的提高有小小的裨益,主要還是為了安全起見(jiàn),不被駭客找到版本號(hào)對(duì)應(yīng)的漏洞,從而被攻擊。

(10) 壓縮相關(guān)

指令:gzip

Nginx默認(rèn)開(kāi)啟了gzip壓縮功能。有可能很多人認(rèn)為,開(kāi)啟gzip壓縮會(huì)增加CPU的處理時(shí)間和負(fù)載。但是經(jīng)過(guò)我們網(wǎng)站的測(cè)試發(fā)現(xiàn),關(guān)閉了gzip壓縮功能的Nginx雖然減少了CPU計(jì)算,節(jié)省了服務(wù)器的響應(yīng)時(shí)間,但網(wǎng)站頁(yè)面總體響應(yīng)時(shí)間反而加長(zhǎng)了,原因在于js和css、xml、json、html等等這些靜態(tài)文件的數(shù)據(jù)傳輸時(shí)間的增長(zhǎng)大大超過(guò)了服務(wù)器節(jié)省出來(lái)的響應(yīng)時(shí)間,得不償失。gzip on 開(kāi)啟壓縮后,大約可以減少75%的文件尺寸,不但節(jié)省了比較多的帶寬流量,也提高了頁(yè)面的整體響應(yīng)時(shí)間。所有建議還是開(kāi)啟。當(dāng)然也不是所有的靜態(tài)文件都需要壓縮,比如靜態(tài)圖片和PDF、視頻,文件本身就應(yīng)當(dāng)做壓縮處理后保存到服務(wù)器。這些文件再次使用gzip壓縮,壓縮的比例并不高,甚至適得其反,壓縮后文件尺寸增大了。CPU壓縮處理這些靜態(tài)文件增加占用的服務(wù)器響應(yīng)時(shí)間絕大部分時(shí)候會(huì)超過(guò)了被壓縮減小的文件尺寸減少的數(shù)據(jù)傳輸時(shí)間,不劃算。是否需要對(duì)Web網(wǎng)站開(kāi)啟壓縮,以及對(duì)哪些文件過(guò)濾壓縮,大家可以通過(guò)使用HttpWatch、Firebug等等網(wǎng)絡(luò)分析工具對(duì)比測(cè)試。

指令:gzip_comp_level

指定壓縮等級(jí),其值從1到9,數(shù)字越大,壓縮率越高,越消耗CPU,負(fù)載也越高。9等級(jí)無(wú)疑壓縮率最高,壓縮后的文件尺寸也最小,但也是最耗CPU資源,負(fù)載最高,速度最慢的,這對(duì)于用戶訪問(wèn)有時(shí)是無(wú)法忍受的。一般推薦使用1-4等級(jí),比較折衷的方案。我們公司網(wǎng)站使用等級(jí)2。

指令:gzip_min_length

指定壓縮的文件最小尺寸,單位 bytes 字節(jié),低于該值的不壓縮,超過(guò)該值的將被壓縮。我們網(wǎng)站設(shè)置為1k,太小的文件沒(méi)必要壓縮,壓縮過(guò)小尺寸文件帶來(lái)增加的CPU消耗時(shí)間和壓縮減少的文件尺寸降低的數(shù)據(jù)下載時(shí)間互相抵消,并有可能增加總體的響應(yīng)時(shí)間。

指令:gzip_types

指定允許壓縮的文件類型,Nginx配置目錄 conf 下的?mime.types 文件存放了Nginx支持的文件類型,text/html類型文件,文件后綴為html htm shtml默認(rèn)壓縮。推薦配置:gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript。

(11) 瀏覽器緩存

指令:expires

設(shè)置HTTP應(yīng)答中的“Expires”和“Cache-Control”頭標(biāo)。"Expires"一般結(jié)合"Last-Modified"使用。當(dāng)設(shè)置了合理的expires配置時(shí),瀏覽器第一次訪問(wèn)Web頁(yè)面元素,會(huì)下載頁(yè)面中的的靜態(tài)文件到本機(jī)臨時(shí)緩存目錄下。第二次及之后再次訪問(wèn)相同URL時(shí)將發(fā)送帶頭標(biāo)識(shí)"If-Modified-Since"和本地緩存文件時(shí)間屬性值的請(qǐng)求給服務(wù)器,服務(wù)器比對(duì)服務(wù)器本地文件時(shí)間屬性值,如果未修改,服務(wù)器直接返回http 304狀態(tài)碼,瀏覽器直接調(diào)用本地已緩存的文件;如果時(shí)間屬性值修改了,重新發(fā)送新文件。這樣就避免了從服務(wù)器再次傳送文件內(nèi)容,減小了服務(wù)器壓力,節(jié)省了帶寬,同時(shí)也提高了用戶訪問(wèn)速度,一舉三得。指令后接數(shù)字加時(shí)間單位,即為緩存過(guò)期時(shí)間;-1 表示永遠(yuǎn)過(guò)期,不緩存。強(qiáng)烈建議添加expires配置,過(guò)期時(shí)間的選擇具體分析。我們公司的部分Nginx配置如下:

location?~?.+\.(gif|jpg|jpeg|png|bmp|swf)$

{

expires?30d;

}

location?~?.+\.(js|css|xml|javascript|txt|csv)$

{

expires?30d;

}

或者統(tǒng)一將靜態(tài)文件放在固定目錄下再對(duì)目錄做location和expires,示例:

location?/static/

{

expires?30d;

}

(12) 持久連接

指令:keepalive_timeout

啟用Http的持久連接Keepalive屬性,復(fù)用之前已建立的TCP連接接收請(qǐng)求、發(fā)送回應(yīng),減少重新建立TCP連接的資源時(shí)間開(kāi)銷。在此的建議是當(dāng)網(wǎng)站頁(yè)面內(nèi)容以靜態(tài)為主時(shí),開(kāi)啟持久連接;若主要是動(dòng)態(tài)網(wǎng)頁(yè),且不能被轉(zhuǎn)化為靜態(tài)頁(yè)面,則關(guān)閉持久連接。后接數(shù)字和時(shí)間單位符號(hào)。正數(shù)為開(kāi)啟持久連接,0關(guān)閉。

(13) 減少HTTP請(qǐng)求次數(shù)

網(wǎng)站頁(yè)面中存在大量的圖片、腳本、樣式表、Flash等靜態(tài)元素,減少訪問(wèn)請(qǐng)求次數(shù)最大的優(yōu)點(diǎn)就是減少用戶首次訪問(wèn)頁(yè)面的加載時(shí)間。可以采用合并相同類型文件為一個(gè)文件的辦法減少請(qǐng)求次數(shù)。這其實(shí)屬于Web前端優(yōu)化范疇,應(yīng)當(dāng)由Web前段工程師做好相關(guān)靜態(tài)文件的規(guī)劃管理,而不是由運(yùn)維來(lái)做。不過(guò)Nginx也可以通過(guò)安裝阿里巴巴提供的Concat或者Google的PageSpeed模塊實(shí)現(xiàn)這個(gè)合并文件的功能。我們公司并未使用合并功能,具體安裝配置信息請(qǐng)查詢網(wǎng)上相關(guān)文檔,這里不再累述。Concat源代碼網(wǎng)址:https://github.com/alibaba/nginx-http-concat/,PageSpeed源代碼網(wǎng)址:https://github.com/pagespeed/ngx_pagespeed。

(14) PHP相關(guān)

Nginx不能直接解析PHP代碼文件,需要調(diào)用FastCGI接口轉(zhuǎn)給PHP解釋器執(zhí)行,然后將結(jié)果返回給Nginx。PHP優(yōu)化本文暫不介紹。Nginx可以開(kāi)啟FastCGI的緩存功能,從而提高性能。

指令:fastcgi_temp_path

定義FastCGI緩存文件保存臨時(shí)路徑。

指令:fastcgi_cache_path

定義FastCGI緩存文件保存路徑和緩存的其它參數(shù)。緩存數(shù)據(jù)以二進(jìn)制數(shù)據(jù)文件形式存儲(chǔ),緩存文件名和key都是通過(guò)對(duì)訪問(wèn)URL使用MD5計(jì)算獲得的結(jié)果。緩存文件先保存至fastcgi_temp_path指定的臨時(shí)目錄下,然后通過(guò)重命名操作移至fastcgi_cache_path指定的緩存目錄。levels指定了目錄結(jié)構(gòu),子目錄數(shù)以16為基數(shù);keys_zone指定了共享內(nèi)存區(qū)名和大小,用于保存緩存key和數(shù)據(jù)信息;inactive指定了緩存數(shù)據(jù)保存的時(shí)間,當(dāng)這段時(shí)間內(nèi)未被訪問(wèn),將被移出;max_size指定了緩存使用的最大磁盤(pán)空間,超過(guò)容量時(shí)將最近最少使用數(shù)據(jù)刪除。建議fastcgi_temp_path和fastcgi_cache_path設(shè)為同一分區(qū),同分區(qū)移動(dòng)操作效率更高。示例:

fastcgi_temp_path?/tmp/fastcgi_temp;

fastcgi_cache_path?/tmp/fastcgi_cache?levels=1:2?keys_zone=cache_fastcgi:16m?inactive=30m?max_size=1g;

示例中使用/tmp/fastcgi_temp作為FastCGI緩存的臨時(shí)目錄;/tmp/fastcgi_cache作為FastCGI緩存保存的最終目錄;一級(jí)子目錄為16的一次方16個(gè),二級(jí)子目錄為16的2次方256個(gè);共享內(nèi)存區(qū)名為cache_fastcgi,占用內(nèi)存128MB;緩存過(guò)期時(shí)間為30分鐘;緩存數(shù)據(jù)保存于磁盤(pán)的最大空間大小為1GB。

指令:fastcgi_cache_key

定義FastCGI緩存關(guān)鍵字。啟用FastCGI緩存必須加上這個(gè)配置,不然訪問(wèn)所有PHP的請(qǐng)求都為訪問(wèn)第一個(gè)PHP文件URL的結(jié)果。

指令:fastcgi_cache_valid

為指定的Http狀態(tài)碼指定緩存時(shí)間。

指令:fastcgi_cache_min_uses

指定經(jīng)過(guò)多少次請(qǐng)求相同的URL將被緩存。

指令:fastcgi_cache_use_stale

指定當(dāng)連接FastCGI服務(wù)器發(fā)生錯(cuò)誤時(shí),哪些情況使用過(guò)期數(shù)據(jù)回應(yīng)。

指令:fastcgi_cache

緩存使用哪個(gè)共享內(nèi)存區(qū)。

我常用nginx.conf模板,大家根據(jù)情況做適當(dāng)修改:

[plain]view plaincopy

user??nginx?nginx;

worker_processes??auto;

error_log??logs/error.log?error;

pid????????logs/nginx.pid;

worker_rlimit_nofile????65536;

events

{

use?epoll;

accept_mutex?off;

worker_connections??65536;

}

http

{

include???????mime.types;

default_type??text/html;

charset?UTF-8;

server_names_hash_bucket_size???128;

client_header_buffer_size???????4k;

large_client_header_buffers??4?32k;

client_max_body_size????????????8m;

open_file_cache?max=65536??inactive=60s;

open_file_cache_valid??????80s;

open_file_cache_min_uses???1;

log_format??main??'$remote_addr?-?$remote_user?[$time_local]?"$request"?'

'$status?$body_bytes_sent?"$http_referer"?'

'"$http_user_agent"?"$http_x_forwarded_for"';

access_log??logs/access.log??main;

sendfile????on;

server_tokens?off;

fastcgi_temp_path??/tmp/fastcgi_temp;

fastcgi_cache_path?/tmp/fastcgi_cache?levels=1:2?keys_zone=cache_fastcgi:128m?inactive=30m?max_size=1g;

fastcgi_cache_key??$host$request_uri;

fastcgi_cache_valid?200?302?1h;

fastcgi_cache_valid?301?????1d;

fastcgi_cache_valid?any?????1m;

fastcgi_cache_min_uses?1;

fastcgi_cache_use_stale?error?timeout?http_500?http_503?invalid_header;

keepalive_timeout??60;

gzip??on;

gzip_min_length?1k;

gzip_buffers??4???64k;

gzip_http_version???1.1;

gzip_comp_level?2;

gzip_types?text/plain?text/css?application/json?application/x-javascript?text/xml?application/xml?application/xml+rss?text/javascript;

server

{

listen???????80;

server_name??localhost;

index????????index.html;

root?????????/App/web;

location?~?.+\.(php|php5)$

{

fastcgi_pass???unix:/tmp/php.sock;

fastcgi_index??index.php;

include????????fastcgi.conf;

fastcgi_cache??cache_fastcgi;

}

location?~?.+\.(gif|jpg|jpeg|png|bmp|swf|txt|csv|doc|docx|xls|xlsx|ppt|pptx|flv)$

{

expires?30d;

}

location?~?.+\.(js|css|html|xml)$

{

expires?30d;

}

location?/nginx-status

{

stub_status?on;

allow?192.168.1.0/24;

allow?127.0.0.1;

deny?all;

}

}

}

三.????????內(nèi)核


Linux內(nèi)核參數(shù)部分默認(rèn)值不適合高并發(fā),一般臨時(shí)方法可以通過(guò)調(diào)整/Proc文件系統(tǒng),或者直接修改/etc/sysctl.conf配置文件永久保存。調(diào)整/Proc文件系統(tǒng),系統(tǒng)重啟后還原至默認(rèn)值,所以不推薦。Linux內(nèi)核調(diào)優(yōu),主要涉及到網(wǎng)絡(luò)和文件系統(tǒng)、內(nèi)存等的優(yōu)化,下面是我常用的內(nèi)核調(diào)優(yōu)配置:

grep?-q?"net.ipv4.tcp_max_tw_buckets"?/etc/sysctl.conf?||?cat?>>?/etc/sysctl.conf?<<?EOF

########################################

net.core.rmem_default?=?262144

net.core.rmem_max?=?16777216

net.core.wmem_default?=?262144

net.core.wmem_max?=?16777216

net.core.somaxconn?=?262144

net.core.netdev_max_backlog?=?262144

net.ipv4.tcp_max_orphans?=?262144

net.ipv4.tcp_max_syn_backlog?=?262144

net.ipv4.tcp_max_tw_buckets?=?10000

net.ipv4.ip_local_port_range?=?1024?65500

net.ipv4.tcp_tw_recycle?=?1

net.ipv4.tcp_tw_reuse?=?1

net.ipv4.tcp_syncookies?=?1

net.ipv4.tcp_synack_retries?=?1

net.ipv4.tcp_syn_retries?=?1

net.ipv4.tcp_fin_timeout?=?30

net.ipv4.tcp_keepalive_time?=?600

net.ipv4.tcp_keepalive_intvl?=?30

net.ipv4.tcp_keepalive_probes?=?3

net.ipv4.tcp_mem?=?786432?1048576?1572864

fs.aio-max-nr?=?1048576

fs.file-max?=?6815744

kernel.sem?=?250?32000?100?128

vm.swappiness?=?10

EOF

sysctl?-p

四.架構(gòu)


Nginx的最大優(yōu)勢(shì)在于處理靜態(tài)文件和代理轉(zhuǎn)發(fā)功能,支持7層負(fù)載均衡和故障隔離。?動(dòng)靜分離是每個(gè)網(wǎng)站發(fā)展到一定規(guī)模之后必然的結(jié)果。靜態(tài)請(qǐng)求則應(yīng)當(dāng)最好將其拆分,并啟用獨(dú)立的域名,既便于管理的需要,也便于今后能夠快速支持CDN。如果一臺(tái)Nginx性能無(wú)法滿足,則可以考慮在Nginx前端添加LVS負(fù)載均衡,或者F5等硬件負(fù)載均衡(費(fèi)用昂貴,適合土豪公司單位),由多臺(tái)Nginx共同分擔(dān)網(wǎng)站請(qǐng)求。還可以考慮結(jié)合Varnish或者Squid緩存靜態(tài)文件實(shí)現(xiàn)類似CDN功能。

新版Nginx目前已經(jīng)支持直接讀寫(xiě)Memcache,可以編譯安裝時(shí)候選擇添加此類模塊,從而節(jié)省了轉(zhuǎn)交給PHP或者JPS等動(dòng)態(tài)程序服務(wù)器處理時(shí)間,提高效率的同時(shí),減小了動(dòng)態(tài)服務(wù)器的負(fù)載。

相關(guān)新聞

歷經(jīng)多年發(fā)展,已成為國(guó)內(nèi)好評(píng)如潮的Linux云計(jì)算運(yùn)維、SRE、Devops、網(wǎng)絡(luò)安全、云原生、Go、Python開(kāi)發(fā)專業(yè)人才培訓(xùn)機(jī)構(gòu)!