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