摘要:切圖仔的小書(shū)本文陸續(xù)介紹的功能配置及一些實(shí)用場(chǎng)景待完善。更可貴的是配置簡(jiǎn)單文檔豐富大大降低了學(xué)習(xí)的門(mén)檻。為什么選擇自年發(fā)布以來(lái),一直是服務(wù)器市場(chǎng)的霸主。雖然發(fā)布較晚,但是卻因?yàn)樵诟卟l(fā)下卓越的表現(xiàn)而迅速嶄露頭角。
切圖仔的 Nginx 小書(shū)
一、介紹 Nginx 1. Nginx 是什么?本文陸續(xù)介紹 Nginx 的功能、配置、及一些實(shí)用場(chǎng)景(待完善...)。
Nginx,很多工程師喜歡讀成"恩基克思"。Nginx 是一款高性能的HTTP和反向代理服務(wù)器軟件,第一個(gè)開(kāi)源版本誕生于2004年,雖然誕生較晚但經(jīng)過(guò)十多年的發(fā)展,已經(jīng)成為非常流行的 web 服務(wù)器軟件。其發(fā)展速度和流行程度已經(jīng)遠(yuǎn)遠(yuǎn)超過(guò)其它同類軟件,成為大型網(wǎng)站和高并發(fā)網(wǎng)站的首選。
2. Nginx 為什么流行Nginx 之所以能夠脫穎而出,一方面是因?yàn)槭袌?chǎng)往往會(huì)選擇簡(jiǎn)單實(shí)用的技術(shù),另一方面是因?yàn)閣eb服務(wù)器的高并發(fā)已經(jīng)成為趨勢(shì),而高并發(fā)又要求架構(gòu)具有健壯性和可伸縮性。Nginx 的特性迎合了市場(chǎng)的這個(gè)發(fā)展趨勢(shì),它是為性能而生,從發(fā)布以來(lái)一直側(cè)重于高性能,高并發(fā),低 CPU 內(nèi)存消耗;在功能方面:負(fù)載均衡,反向代理,訪問(wèn)控制,熱部署,高擴(kuò)展性等特性又十分適合現(xiàn)代的網(wǎng)絡(luò)架構(gòu)。更可貴的是配置簡(jiǎn)單文檔豐富,大大降低了學(xué)習(xí)的門(mén)檻。這樣穩(wěn)定,性能強(qiáng),功能豐富又簡(jiǎn)單的產(chǎn)品當(dāng)然會(huì)受歡迎了。
3. 為什么選擇 Nginx?Apache 自1990年發(fā)布以來(lái),一直是 web 服務(wù)器市場(chǎng)的霸主。Nginx 雖然發(fā)布較晚,但是卻因?yàn)樵诟卟l(fā)下卓越的表現(xiàn)而迅速嶄露頭角。最初,Nginx 只是作為 Apache 在高并發(fā)場(chǎng)景下的補(bǔ)充,兩者結(jié)合輔助使用。而現(xiàn)在,Nginx 隨著迭代功能,在極多數(shù)場(chǎng)合已經(jīng)可以拋棄老大哥來(lái)獨(dú)當(dāng)一面了。
Nginx 和 Apache 相同點(diǎn):
同是 Http 服務(wù)器軟件,都采用模塊化結(jié)構(gòu)設(shè)計(jì)
支持通用語(yǔ)言接口,如 PHP,Python 等。
支持正向代理和反向代理。
支持虛擬主機(jī)以及 SSL 加密傳輸
支持緩存以及壓縮傳輸
支持 URL 重寫(xiě)
模塊多,擴(kuò)展性強(qiáng)
多平臺(tái)支持
Nginx 的優(yōu)勢(shì):
輕量級(jí),安裝簡(jiǎn)單、配置文件簡(jiǎn)潔,運(yùn)行時(shí) CPU 內(nèi)存使用率低。
性能強(qiáng) 支持多核,處理靜態(tài)文件效率高。
支持熱部署,啟動(dòng)速度快,可以在不間斷服務(wù)情況下對(duì)軟件和配置進(jìn)行升級(jí)
負(fù)載均衡 支持容錯(cuò)和健康檢查
代理功能強(qiáng)大 支持無(wú)緩存的方向代理,同時(shí)支持 IMAP/POPS/SMTP 的代理
Nginx 的劣勢(shì):
相對(duì)于老大哥 Apache 模塊要少一些
對(duì)動(dòng)態(tài)請(qǐng)求的支持不如 Apache
Windows 版本功能有限,受限于 Windows 的特性,支持最好的還是 *unix 系統(tǒng)
4. Nginx 的工作原理Nginx 由內(nèi)核和一系列模塊組成,內(nèi)核提供 Web Server 的基本功能,如啟動(dòng)網(wǎng)絡(luò)協(xié)議,創(chuàng)建運(yùn)行環(huán)境,接收和分配客戶端請(qǐng)求,處理模塊之間的交互。Nginx 的各種功能和操作都由模塊來(lái)實(shí)現(xiàn)。
Nignx 的模塊從結(jié)構(gòu)上分為:
核心模塊:HTTP 模塊、EVENT 模塊和 MAIL 模塊
基礎(chǔ)模塊:HTTP Access 模塊、HTTP FastCGI 模塊、HTTP Proxy 模塊和 HTTP Rewrite 模塊
第三方模塊:HTTP Upstream Request Hash 模塊、Notice 模塊和HTTP Access Key 模塊以及其它自開(kāi)發(fā)模塊。
這樣的設(shè)計(jì)使 Nginx 方便開(kāi)發(fā)和擴(kuò)展,也正因此才使得 Nginx 功能如此強(qiáng)大。Nginx 的模塊默認(rèn)編譯進(jìn) Nginx 中,如果需要增加或刪除模塊,需要重新編譯 Nginx ,這一點(diǎn)不如 Apache 的動(dòng)態(tài)模塊加載方便。(如果需動(dòng)態(tài)加載模塊,可以使用兼容 Nginx 的web服務(wù)器 Tengine )
5. Nginx 的請(qǐng)求處理Nginx 使用一個(gè)多進(jìn)程模型來(lái)應(yīng)對(duì)外來(lái)需求,其中一個(gè) master 進(jìn)程,多個(gè) worker 進(jìn)程。master 進(jìn)程負(fù)責(zé)管理 Nginx 本身和其他 worker 進(jìn)程。
所有實(shí)際上的業(yè)務(wù)處理邏輯都在 worker 進(jìn)程,其內(nèi)有一個(gè)無(wú)限循環(huán)執(zhí)行的函數(shù),不斷處理來(lái)自客戶端的請(qǐng)求,并進(jìn)行處理,直到整個(gè) Nginx 服務(wù)停止。
worker 進(jìn)程中,ngx_worker_process_cycle() 就是這個(gè)無(wú)線循環(huán)的函數(shù)。內(nèi)部對(duì)一個(gè)請(qǐng)求的簡(jiǎn)單處理流程如下:
操作系統(tǒng)提供的機(jī)制產(chǎn)生相關(guān)的事件
接受和處理這些事件,如果是接收數(shù)據(jù),則產(chǎn)生更高層的request對(duì)象
處理 request 的 header 和 body
產(chǎn)生響應(yīng),并發(fā)送回客戶端
完成 request 的處理
重新初始化定時(shí)器及其他事件
如圖展示了 Nginx 模塊常規(guī)的HTTP請(qǐng)求和響應(yīng)的過(guò)程:
#運(yùn)行用戶 user nobody; #啟動(dòng)進(jìn)程,通常設(shè)置成和cpu的數(shù)量相等 worker_processes 1; #全局錯(cuò)誤日志及PID文件 #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #pid logs/nginx.pid; #工作模式及連接數(shù)上限 events { #單個(gè)后臺(tái)worker process進(jìn)程的最大并發(fā)鏈接數(shù) worker_connections 1024; } http { #設(shè)定mime類型,類型由mime.type文件定義 include mime.types; default_type application/octet-stream; #設(shè)定日志格式 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 指令指定 nginx 是否調(diào)用 sendfile 函數(shù)(zero copy 方式)來(lái)輸出文件, #對(duì)于普通應(yīng)用,必須設(shè)為 on, #如果用來(lái)進(jìn)行下載等應(yīng)用磁盤(pán)IO重負(fù)載應(yīng)用,可設(shè)置為 off, #以平衡磁盤(pán)與網(wǎng)絡(luò)I/O處理速度,降低系統(tǒng)的uptime. sendfile on; #tcp_nopush on; #連接超時(shí)時(shí)間 #keepalive_timeout 0; keepalive_timeout 65; #開(kāi)啟gzip壓縮 #gzip off; #設(shè)定虛擬主機(jī)配置 server { #偵聽(tīng)80端口 listen 80; #定義使用 www.nginx.cn訪問(wèn) server_name www.nginx.cn; #定義服務(wù)器的默認(rèn)網(wǎng)站根目錄位置 root html; #設(shè)定本虛擬主機(jī)的訪問(wèn)日志 access_log logs/nginx.access.log main; #默認(rèn)請(qǐng)求 location / { #定義首頁(yè)索引文件的名稱 index index.php index.html index.htm; } # 定義錯(cuò)誤提示頁(yè)面 error_page 500 502 503 504 /50x.html; location = /50x.html { } #靜態(tài)文件,nginx自己處理 location ~ ^/(images|javascript|js|css|flash|media|static)/ { #過(guò)期30天,靜態(tài)文件不怎么更新,過(guò)期可以設(shè)大一點(diǎn), #如果頻繁更新,則可以設(shè)置得小一點(diǎn)。 expires 30d; } #PHP 腳本請(qǐng)求全部轉(zhuǎn)發(fā)到 FastCGI處理. 使用FastCGI默認(rèn)配置. location ~ .php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } #禁止訪問(wèn) .htxxx 文件 location ~ /.ht { deny all; } } }三、Nginx 命令行
不像其他系統(tǒng)軟件,Nginx 僅由幾個(gè)命令行參數(shù)
-c // 為Nginx指定一個(gè)配置文件,來(lái)代替缺省的 -t // 不運(yùn)行,僅僅測(cè)試配置。 -v // 顯示Nginx的版本 -V // 顯示Nginx的版本,編譯器版本和配置參數(shù)。
Nginx 啟動(dòng)、停止、重啟命令
// 啟動(dòng) sudo nginx // 或者 sudo /usr/local/Cellar/nginx/1.12.0_1/bin/nginx // 如果不知道實(shí)際路徑,可以nginx —V查看 // 停止命令 ps -ef | grep nginx // 查看占用進(jìn)程 kill -QUIT nginx主進(jìn)程號(hào) // 從容停止 kill -TERM nginx主進(jìn)程號(hào) // 快速停止 kill -9 nginx主進(jìn)程號(hào) // 強(qiáng)制停止 // 或者 kill -QUIT `cat /usr/local/var/run/nginx.pid` // 如果不知道實(shí)際路徑,可以nginx —V查看 // 重啟命令 kill -QUIT `cat /usr/local/var/run/nginx.pid` sudo /usr/local/Cellar/nginx/1.12.0_1/bin/nginx四、Nginx 實(shí)用 場(chǎng)景1:適配PC與移動(dòng)web
一般門(mén)戶網(wǎng)站在訪問(wèn)時(shí),會(huì)有 PC 和 H5、Pad 幾個(gè)適配版本,我們常會(huì)有這樣的需求,在網(wǎng)站被訪問(wèn)時(shí)候,服務(wù)端來(lái)識(shí)別用戶是 PC 設(shè)備還是移動(dòng)設(shè)備,跳轉(zhuǎn)返回相應(yīng)適配版本的頁(yè)面。
第一步通常是判斷 HTTP 請(qǐng)求頭的 User-Agent ,基本原理是通過(guò)正則匹配判斷,有一套開(kāi)源的解決方案可以直接使用:http://detectmobilebrowsers.com/,下載 Nginx 配置即可。
第二步就是通過(guò)之前對(duì)設(shè)備的判斷,來(lái)反向代理到不同的版本。
location / { proxy_pass http://leju.com if ($mobile_rewrite = perform) { proxy_pass http://m.leju.com/ # 手機(jī)版 } }
第三步,因?yàn)榭赡苠e(cuò)誤判斷設(shè)備,或者用戶就想指定訪問(wèn)某種設(shè)備版本,在頁(yè)面底部,通常會(huì)有鏈接跳轉(zhuǎn)其他版本。
同時(shí)在 Nginx 中加入判斷,如果包含指定 source 參數(shù),則指定進(jìn)入某個(gè)版本。
場(chǎng)景2:前端環(huán)境切換前端開(kāi)發(fā)中,我們經(jīng)常需要在多個(gè)環(huán)境(開(kāi)發(fā)、內(nèi)測(cè)、外測(cè)、預(yù)發(fā)、正式環(huán)境)進(jìn)行切換。
我們通常通過(guò)切換 host 指向搭配機(jī)器綁定不同域名的方式去實(shí)現(xiàn):比如測(cè)試環(huán)境是dev.j.esf.sina.com,正式環(huán)境是j.esf.sina.com,搭配不同的 host 指向,可以形成多種組合。
而通過(guò)反向代理的Nginx,更容易處理這種代理轉(zhuǎn)發(fā)的問(wèn)題:
我們通過(guò)點(diǎn)擊頁(yè)面的環(huán)境按鈕,讓綁定的 javascript 代碼往域名下種入帶有 IP 信息的 cookie,同時(shí)刷新頁(yè)面。
Nginx 接收新的請(qǐng)求,讀取請(qǐng)求的 cookie ,如果包含指定的鍵名和值,則代理到這個(gè) IP 地址。(http header 也可以)
如果沒(méi)有,則代理到默認(rèn)的線上環(huán)境。
set $env_id “123.59.190.206”; if( $http_cookie~* "host_id(S+)(;.*|$)"){ set $env_id $1; } location / { proxy_set_header Host $host; proxy_pass http://$env_id:80; }
...場(chǎng)景待續(xù)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/39708.html
摘要:切圖仔的小書(shū)本文陸續(xù)介紹的功能配置及一些實(shí)用場(chǎng)景待完善。更可貴的是配置簡(jiǎn)單文檔豐富大大降低了學(xué)習(xí)的門(mén)檻。為什么選擇自年發(fā)布以來(lái),一直是服務(wù)器市場(chǎng)的霸主。雖然發(fā)布較晚,但是卻因?yàn)樵诟卟l(fā)下卓越的表現(xiàn)而迅速嶄露頭角。 切圖仔的 Nginx 小書(shū) 本文陸續(xù)介紹 Nginx 的功能、配置、及一些實(shí)用場(chǎng)景(待完善...)。 一、介紹 Nginx 1. Nginx 是什么? Nginx,很多工程師...
摘要:切圖仔的一點(diǎn)工作經(jīng)驗(yàn)?zāi)サ恫徽`砍柴功一個(gè)趁手的編輯器比如自己調(diào)教好的或如,可以極大的提高自己的工作效率。如果美工做圖的時(shí)候能把什么命名字體行距內(nèi)外邊距標(biāo)注清楚,能省切圖仔多少事編寫(xiě)先創(chuàng)建好模板,常用的標(biāo)簽重置這些先帶上。 blog 切圖仔的一點(diǎn)工作經(jīng)驗(yàn) 0 磨刀不誤砍柴功 一個(gè)趁手的編輯器(比如自己調(diào)教好的st3)或IDE(如Hbuilder、webstorm),可以極大的提高自己的工作...
摘要:切圖仔的一點(diǎn)工作經(jīng)驗(yàn)?zāi)サ恫徽`砍柴功一個(gè)趁手的編輯器比如自己調(diào)教好的或如,可以極大的提高自己的工作效率。如果美工做圖的時(shí)候能把什么命名字體行距內(nèi)外邊距標(biāo)注清楚,能省切圖仔多少事編寫(xiě)先創(chuàng)建好模板,常用的標(biāo)簽重置這些先帶上。 blog 切圖仔的一點(diǎn)工作經(jīng)驗(yàn) 0 磨刀不誤砍柴功 一個(gè)趁手的編輯器(比如自己調(diào)教好的st3)或IDE(如Hbuilder、webstorm),可以極大的提高自己的工作...
摘要:代碼開(kāi)發(fā)記得曾經(jīng)聽(tīng)開(kāi)發(fā)平臺(tái)的同學(xué)驕傲的講,中只有百度有全公司級(jí)別的統(tǒng)一代碼倉(cāng)庫(kù),并且使用管理代碼,不明覺(jué)厲,我也很驕傲。 前言 從前,一個(gè)類B/S架構(gòu)的應(yīng)用里,F(xiàn)Eer,或者叫切圖仔,切圖+表單驗(yàn)證就是工作的全部。無(wú)奈我所做的全部,只是整個(gè)應(yīng)用的冰山一角...責(zé)任小了,邊緣感就強(qiáng)了,owner意識(shí)自然差,視野自然受限。 感謝V8引擎的極速體驗(yàn)&chrome瀏覽器的緊隨規(guī)范,js執(zhí)行速度...
閱讀 1686·2021-09-26 10:00
閱讀 2945·2021-09-06 15:00
閱讀 3553·2021-09-04 16:40
閱讀 2324·2019-08-30 15:44
閱讀 729·2019-08-30 10:59
閱讀 1901·2019-08-29 18:34
閱讀 3629·2019-08-29 15:42
閱讀 2306·2019-08-29 15:36