摘要:只需要兩個配置,個,個,分別用來做反向代理,和負(fù)載均衡。以反向代理為例,不自己處理的相關(guān)請求,而是把的相關(guān)請求轉(zhuǎn)發(fā)給來處理。
二話不說,直接進(jìn)入配置主題,若對nginx毫無了解的請?zhí)D(zhuǎn)Nginx入門到實戰(zhàn)(1)基礎(chǔ)篇
在此之前,先把配置參數(shù)所在位置分為四層
1. conf 全局層
2. http 服務(wù)器層
3. server 虛擬主機層
4. location 定位層
#有1個工作的子進(jìn)程,可以自行修改,但太大無益,因為要爭奪CPU,一般設(shè)置為 CPU數(shù)*核數(shù) worker_processes 1; #一般是配置nginx連接的特性,如1個子進(jìn)程能同時允許多少連接 Event { #這是指一個子進(jìn)程最大允許連1024個連接 worker_connections 1024; } #這是配置http服務(wù)器的主要段 http { #這是虛擬主機段 Server1 { #定位,把特殊的路徑或文件再次定位,如image目錄多帶帶處理,如.php多帶帶處理 Location { ... } } Server2 { ... } }二、HTTP服務(wù)器層 1. 網(wǎng)頁內(nèi)容的壓縮編碼與傳輸速度優(yōu)化
請求: Accept-Encoding:gzip,deflate,sdch 響應(yīng): Content-Encoding:gzip Content-Length:36093
原理:
瀏覽器---請求----> 聲明可以接受 gzip壓縮 或 deflate壓縮 或compress 或 sdch壓縮。
從http協(xié)議的角度看--請求頭 聲明 acceopt-encoding: gzip deflate sdch (是指壓縮算法,其中sdch是google倡導(dǎo)的一種壓縮方式,目前支持的服務(wù)器尚不多)
服務(wù)器-->回應(yīng)---把內(nèi)容用gzip方式壓縮---->發(fā)給瀏覽器
瀏覽<-----解碼gzip-----接收gzip壓縮內(nèi)容
gzip #配置的常用參數(shù) gzip on|off; #是否開啟gzip gzip_buffers 32 4K | 16 8K #緩沖(壓縮在內(nèi)存中緩沖幾塊? 每塊多大?) gzip_comp_level #[1-9] #推薦6 壓縮級別(級別越高,壓的越小,越浪費CPU計算資源) gzip_disable #正則匹配UA 什么樣的Uri不進(jìn)行g(shù)zip gzip_min_length 200 #開始壓縮的最小長度(再小就不要壓縮了,意義不在) gzip_http_version 1.0|1.1 # 開始壓縮的http協(xié)議版本(可以不設(shè)置,目前幾乎全是1.1協(xié)議) gzip_proxied #設(shè)置請求者代理服務(wù)器,該如何緩存內(nèi)容 gzip_types text/plain application/xml #對哪些類型的文件用壓縮如txt,xml,html ,css ,若不知道類型名稱,可以查看nginx下conf文件夾的mime.types gzip_vary on|off #是否傳輸gzip壓縮標(biāo)志
注意:
圖片/mp3這樣的二進(jìn)制文件,不必壓縮因為壓縮率比較小,比如100->80字節(jié),而且壓縮也是耗費CPU資源的。比較小的文件不必壓縮。
對于網(wǎng)站的圖片,尤其是新聞?wù)荆瑘D片一旦發(fā)布,改動的可能是非常小的。我們希望 能否在用戶訪問一次后,圖片緩存在用戶的瀏覽器端,且時間比較長的緩存。
可以, 用到nginx的expires設(shè)置。
#在location或if段里 expires 30s; expires 30m; expires 2h; expires 30d; location ~ image { expires 1d; }
另: 304 也是一種很好的緩存手段
原理是: 服務(wù)器響應(yīng)文件內(nèi)容是,同時響應(yīng)etag標(biāo)簽(內(nèi)容的簽名,內(nèi)容一變,他也變), 和 last_modified_since 2個標(biāo)簽值。瀏覽器下次去請求時,頭信息發(fā)送這兩個標(biāo)簽, 服務(wù)器檢測文件有沒有發(fā)生變化,如無,直接頭信息返回 etag,last_modified_since
瀏覽器知道內(nèi)容無改變,于是直接調(diào)用本地緩存。
這個過程,也請求了服務(wù)器,但是傳著的內(nèi)容極少。
對于變化周期較短的,如靜態(tài)html,js,css,,比較適于用這個方式
#基于域名的虛擬主機 server { listen 80; #監(jiān)聽端口 server_name a.com; #監(jiān)聽域名 location / { root /var/www/a.com; #根目錄定位 index index.html; } } #基于端口的虛擬主機配置 訪問 192.xxx.xx.xxx:8080 server { listen 8080; #監(jiān)聽8080端口 server_name 192.xxx.xx.xxx; #服務(wù)器IP地址 location / { root /var/www/html8080; index index.html; } }1. 日志管理
#不同的server可以使用不同的log #此處定義了日志格式,最好定位在頂層,方便其他server公用 log_format main "$remote_addr - $remote_user [$time_local] "$request" " # "$status $body_bytes_sent "$http_referer" " # ""$http_user_agent" "$http_x_forwarded_for""; $remote_addr 用戶ip $remote_user [$time_local] 用戶訪問時間 $request 請求類型 get,post... $status 請求狀態(tài) 200 304... $body_bytes_sent 請求的內(nèi)容有多少字節(jié) $http_referer 上一個頁面來自哪里(從哪里跳轉(zhuǎn)過來) $http_user_agent 用戶代理(用了什么瀏覽器訪問) #這說明 該server, 它的訪問日志的文件,使用的格式main格式. access_log logs/host.access.log main;
寫一個sh腳本,每天半夜切分log日志,避免log每天累積造成文件過大
#!/bin/bash base_path="/usr/local/nginx/logs" log_path=$(date -d yesterday +"%Y%m") day=$(date -d yesterday +"%d") mkdir -p $base_path/$log_path mv $base_path/access.log $base_path/$log_path/access_$day.log #echo $base_path/$log_path/access_$day.log kill -USR1 `cat /usr/local/nginx/logs/nginx.pid` #Crontab 編輯定時任務(wù) 01 00 * * * /xxx/path/b.sh 每天0時1分(建議在02-04點之間,系統(tǒng)負(fù)載小)四、定位層 1. location定位
location 有“定位”的意思,根據(jù)Uri來進(jìn)行不同的定位,在虛擬主機的配置中,是必不可少的。location可以把網(wǎng)站的不同部分,定位到不同的處理方式上。
當(dāng)我們碰到“.php”, 如何調(diào)用PHP解釋器? --這時就需要location
#location 的語法 location [=|~|~*|^~] patt { ... } #中括號可以不寫任何參數(shù),此時稱為一般匹配 #也可以寫參數(shù) #因此,大類型可以分為3種 #首先看有沒有精準(zhǔn)匹配,如果有,則停止匹配過程,若沒有向下匹配到最符合的location location = patt {} #[精準(zhǔn)匹配] location patt{} #[一般匹配] location ~ patt{} #[正則匹配]
匹配順序?qū)嵗?
location / { root /usr/local/nginx/html; index index.html index.htm; } location ~ image { root /var/www/image; index index.html; } #如果我們訪問 http://xx.com/image/logo.png #此時, “/” 與”/image/logo.png” 匹配 #同時,”image”正則 與”image/logo.png”也能匹配,誰發(fā)揮作用? #正則表達(dá)式的成果將會使用. #圖片真正會訪問 /var/www/image/logo.png #注意,若在roo最后加了"/",那么將訪問/var/www/image/image/logo.png
匹配順序?qū)嵗?
location / { root /usr/local/nginx/html; index index.html index.htm; } location /foo { root /var/www/html; index index.html; } #我們訪問 http://xxx.com/foo #對于uri “/foo”, 兩個location的patt,都能匹配他們 #即 ‘/’能從左前綴匹配 ‘/foo’, ‘/foo’也能左前綴匹配’/foo’, #此時, 真正訪問 /var/www/html/index.html #原因:’/foo’匹配的更長,因此使用之
總結(jié):
先判斷精準(zhǔn)命中,如果命中,立即返回結(jié)果并結(jié)束解析過程
判斷普通命中,如果有多個命中,記錄下最長的命中結(jié)果為準(zhǔn)(記錄但不結(jié)束)
繼續(xù)判斷正則表達(dá)式的解析結(jié)果,按配置里的正則表達(dá)式順序為準(zhǔn),由上往下,一旦匹配成功1個,立即返回結(jié)果,并結(jié)束解析
分析:
普通命中順序無所謂,按命中長短來決定
正則命中,按順序
2. rewrite 重寫#重寫中用到的指令 if (條件) {} #設(shè)定條件,再進(jìn)行重寫 set #設(shè)置變量 return #返回狀態(tài)碼 break #跳出rewrite rewrite #重寫 #If 語法格式 If 空格 (條件) { 重寫模式 } #條件語法 1: “=”來判斷相等, 用于字符串比較 2: “~” 用正則來匹配(此處的正則區(qū)分大小寫) ~* 不區(qū)分大小寫的正則 3: -f -d -e來判斷是否為文件,為目錄,是否存在.
例子
location / { #當(dāng)訪問ip相等時,返回403 if ($remote_addr = 192.xxx.xx.xx) { return 403; } #如果是IE瀏覽器訪問 if ($http_user_agent ~ MSIE) { rewrite ^.*$ /ie.htm; break; #若不brea,重定向后又會匹配到IE瀏覽器,又走到這一步,會循環(huán)重定向 } #若訪問目錄、文件不存在,重定向到404頁面 if (!-e $document_root$fastcgi_script_name) { rewrite ^.*$ /404.html break; } root html; index index.html }
以xx.com/dsafsd.html這個不存在頁面為例,我們觀察訪問日志,日志中顯示的訪問路徑,依然是GET /dsafsd.html HTTP/1.1。提示:服務(wù)器內(nèi)部的rewrite和302跳轉(zhuǎn)不一樣。
跳轉(zhuǎn)的話URL都變了,變成重新http請求404.html,而內(nèi)部rewrite, 上下文沒變,
就是說 fastcgi_script_name 仍然是 dsafsd.html,因此會循環(huán)重定向。
set 是設(shè)置變量用的, 可以用來達(dá)到多條件判斷時作標(biāo)志用,達(dá)到apache下的 rewrite_condition的效果
#使用set方式防止重定向死循環(huán) if ($http_user_agent ~* msie) { set $isie 1; } if ($fastcgi_script_name = ie.html) { set $isie 0; } if ($isie 1) { rewrite ^.*$ ie.html; }3. Nginx與PHP配合
#當(dāng)碰到訪問 .php 的時候時候 location ~ .php$ { root html; #把請求的信息轉(zhuǎn)發(fā)給9000端口的PHP進(jìn)程 fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; #告訴php進(jìn)程想運行哪個php文件 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } #1: 碰到php文件, #2: 把根目錄定位到 html, #3: 把請求上下文轉(zhuǎn)交給9000端口PHP進(jìn)程, #4: 并告訴PHP進(jìn)程,當(dāng)前的腳本是 $document_root$fastcgi_scriptname # (注:PHP會去找這個腳本并處理,所以腳本的位置要指對)4. 反向代理 + 負(fù)載均衡
用nginx做反向代理和負(fù)載均衡非常簡單。
只需要兩個配置, 1個proxy, 1個upstream,分別用來做反向代理,和負(fù)載均衡。
以反向代理為例,nginx不自己處理php的相關(guān)請求,而是把php的相關(guān)請求轉(zhuǎn)發(fā)給apache來處理。
#將php程序交給8080端口的apache處理,實現(xiàn)動靜分離 location ~ .php$ { proxy_pass http://xxx.xxx.xx:8080 }
http { ... #負(fù)載均衡服務(wù)器池 upstream xxx { server 127.xx.xx.xx1; server 127.xx.xx.xx2; } server { liseten 80; server_name localhost; location / { #用戶真實IP proxy_set_header X-Real-IP $remote_addr; proxy_pass http://xxx #upstream 對應(yīng)自定義名稱 include proxy.conf; } } }
有收獲的朋友記得點個 贊 或 收藏 哦~
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/39954.html
摘要:同時由于跨域了,就想利用的反向代理去處理一下跨域,但是在解決問題的同時,發(fā)現(xiàn)網(wǎng)上有些方案的確是存在一些問題,在這里總結(jié)一下基本配置,也聊一下常見的配置問題。 最近公司前后端分離,前端獨立提供頁面和靜態(tài)服務(wù)很自然的就想到了用nginx去做靜態(tài)服務(wù)器。同時由于跨域了,就想利用nginx的反向代理去處理一下跨域,但是在解決問題的同時,發(fā)現(xiàn)網(wǎng)上有些方案的確是存在一些問題,在這里總結(jié)一下基本配置...
摘要:同時由于跨域了,就想利用的反向代理去處理一下跨域,但是在解決問題的同時,發(fā)現(xiàn)網(wǎng)上有些方案的確是存在一些問題,在這里總結(jié)一下基本配置,也聊一下常見的配置問題。 最近公司前后端分離,前端獨立提供頁面和靜態(tài)服務(wù)很自然的就想到了用nginx去做靜態(tài)服務(wù)器。同時由于跨域了,就想利用nginx的反向代理去處理一下跨域,但是在解決問題的同時,發(fā)現(xiàn)網(wǎng)上有些方案的確是存在一些問題,在這里總結(jié)一下基本配置...
摘要:設(shè)置一個共享內(nèi)存區(qū),該內(nèi)存區(qū)用于存儲緩存鍵和元數(shù)據(jù),有些類似計時器的用途。注意,非活動內(nèi)容有別于過期內(nèi)容。在兩次緩存管理器啟動的間隔,緩存的數(shù)據(jù)量可能短暫超過配置的大小。為在緩存響應(yīng)之前必須使用相同密鑰的請求的最小次數(shù)。 原文鏈接:何曉東 博客 使用場景:項目的頁面需要加載很多數(shù)據(jù),也不是經(jīng)常變化的,不涉及個性化定制,為每次請求去動態(tài)生成數(shù)據(jù),性能比不上根據(jù)請求路由和參數(shù)緩存一下結(jié)果,...
摘要:設(shè)置一個共享內(nèi)存區(qū),該內(nèi)存區(qū)用于存儲緩存鍵和元數(shù)據(jù),有些類似計時器的用途。注意,非活動內(nèi)容有別于過期內(nèi)容。在兩次緩存管理器啟動的間隔,緩存的數(shù)據(jù)量可能短暫超過配置的大小。為在緩存響應(yīng)之前必須使用相同密鑰的請求的最小次數(shù)。 原文鏈接:何曉東 博客 使用場景:項目的頁面需要加載很多數(shù)據(jù),也不是經(jīng)常變化的,不涉及個性化定制,為每次請求去動態(tài)生成數(shù)據(jù),性能比不上根據(jù)請求路由和參數(shù)緩存一下結(jié)果,...
摘要:設(shè)置一個共享內(nèi)存區(qū),該內(nèi)存區(qū)用于存儲緩存鍵和元數(shù)據(jù),有些類似計時器的用途。注意,非活動內(nèi)容有別于過期內(nèi)容。在兩次緩存管理器啟動的間隔,緩存的數(shù)據(jù)量可能短暫超過配置的大小。為在緩存響應(yīng)之前必須使用相同密鑰的請求的最小次數(shù)。 原文鏈接:何曉東 博客 使用場景:項目的頁面需要加載很多數(shù)據(jù),也不是經(jīng)常變化的,不涉及個性化定制,為每次請求去動態(tài)生成數(shù)據(jù),性能比不上根據(jù)請求路由和參數(shù)緩存一下結(jié)果,...
閱讀 1147·2021-11-25 09:43
閱讀 2965·2019-08-30 15:54
閱讀 3349·2019-08-30 15:54
閱讀 2991·2019-08-30 15:44
閱讀 1623·2019-08-26 12:18
閱讀 2254·2019-08-26 11:42
閱讀 875·2019-08-26 11:35
閱讀 3294·2019-08-23 18:22