Nginx入門到實戰(2)場景實現篇
一、靜態資源WEB服務
1.靜態資源型別
非伺服器動態執行生成的檔案,換句話說,就是可以直接在伺服器上找到對應檔案的請求
- 瀏覽器端渲染:HTML,CSS,JS
- 圖片:JPEG,GIF,PNG
- 視訊:FLV,MPEG
- 檔案:TXT,任意下載檔案
2.靜態資源服務場景-CDN
什麼是CDN?例如一個北京使用者要請求一個檔案,而檔案放在的新疆的資源儲存中心,如果直接請求新疆距離太遠,延遲久。使用nginx靜態資源回源,分發給北京的資源儲存中心,讓使用者請求的動態定位到北京的資源儲存中心請求,實現傳輸延遲的最小化
2.nginx靜態資源配置
配置域:http、server、location #檔案高速讀取 http { sendfile on; } #在 sendfile 開啟的情況下,開啟 tcp_nopush 提高網路包傳輸效率 #tcp_nopush 將檔案一次性一起傳輸給客戶端,就好像你有十個包裹,快遞員一次送一個,來回十趟,開啟後,快遞員講等待你十個包裹都派件,一趟一起送給你 http { sendfile on; tcp_nopush on; } #tcp_nodelay 開啟實時傳輸,傳輸方式與 tcp_nopush 相反,追求實時性,但是它只有在長連線下才生效 http { sendfile on; tcp_nopush on; tcp_nodelay on; }
#將訪問的檔案壓縮傳輸 (減少檔案資源大小,提高傳輸速度) #當訪問內容以gif或jpg結尾的資源時 location ~ .*\.(gif|jpg)$ { gzip on; #開啟 gzip_http_version 1.1; #伺服器傳輸版本 gzip_comp_level 2; #壓縮比,越高壓縮越多,壓縮越高可能會消耗伺服器效能 gzip_types text/plain application/javascript application/x-javascript text/javascript text/css application/xml application/xml+rss image/jpeg image/gif image/png; #壓縮檔案型別 root /opt/app/code; #對應目錄(去該目錄下尋找對應檔案) } #直接訪問已壓縮檔案 #當訪問路徑以download開頭時,如www.baidu.com/download/test.img #去/opt/app/code目錄下尋找test.img.gz檔案,返回到前端時已是可以瀏覽的img檔案 location ~ load^/download { gzip_static on #開啟; tcp_nopush on; root /opt/app/code; }
二、瀏覽器快取
HTTP協議定義的快取機制(如:Expires; Cache-control等 )
減少服務端的消耗,降低延遲
1.瀏覽器無快取
瀏覽器請求 -> 無快取 -> 請求WEB伺服器 -> 請求相應 -> 呈現
在呈現階段會根據快取的設定在瀏覽器中生成快取
2.瀏覽器有快取
瀏覽器請求 -> 有快取 -> 校驗本地快取時間是否過期 -> 沒有過期 -> 呈現
若過期從新請求WEB伺服器
3.語法配置
location ~ .*\.(html|htm)$ { expires 12h; #快取12小時 }
伺服器響應靜態檔案時,請求頭資訊會帶上 etag 和 last_modified_since 2個標籤值,瀏覽器下次去請求時,頭資訊傳送這兩個標籤,伺服器檢測檔案有沒有發生變化,如無,直接頭資訊返 etag 和last_modified_since,狀態碼為 304 ,瀏覽器知道內容無改變,於是直接呼叫本地快取,這個過程也請求了服務,但是傳著的內容極少
三、跨站訪問
開發nginx跨站訪問設定
location ~ .*\.(html|htm)$ { add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE,OPTIONS; #Access-Control-Allow-Credentials true #允許cookie跨域 }
在響應中指定 Access-Control-Allow-Credentials 為 true 時,Access-Control-Allow-Origin 不能指定為 *,需要指定到具體域名
相關跨域內容可參考 Laravel 跨域功能中介軟體 使用程式碼實現跨域,原理與nginx跨域配置相同
四、防盜鏈
防止伺服器內的靜態資源被其他網站所套用
此處介紹的 nginx 防盜鏈為基礎方式,其它更加深入的方式將在之後的文章介紹
首先,需要理解一個nginx變數
$http_referer #表示當前請求上一次頁面訪問的地址,換句話說,訪問 www.baidu.com 主頁,這是第一次訪問,所以 $http_referer 為空,但是 訪問此頁面的時候還需要獲取一張首頁圖片,再請求這張圖片的時候 $http_referer 就為 www.baidu.com
然後配置
location ~ .*\.(jpg|gif)$ { #valid_referers 表示我們允許哪些 $http_referer 來訪問 #none 表示沒有帶 $http_referer,如第一次訪問時 $http_referer 為空 #blocked 表示 $http_referer 不是標準的地址,非正常域名等 #只允許此ip valid_referers none blocked 127.xxx.xxx.xx if ($invalid_referer) { #不滿足情況下變數值為1 return 403; } }
五、HTTP代理服務
Nginx可以實現多種代理方式
- HTTP
- ICMPPOPIMAP
- HTTPS
- RTMP
1. 代理區別
區別在於代理的物件不一樣
正向代理代理的物件是客戶端
反向代理代理的物件是服務端
2. 反向代理
語法:proxy_pass URL 預設:—— 位置:loaction
#代理埠 #場景:伺服器80埠開放,8080埠對外關閉,客戶端需要訪問到8080 #在nginx中配置proxy_pass代理轉發時,如果在proxy_pass後面的url加/,表示絕對根路徑;如果沒有/,表示相對路徑,把匹配的路徑部分也給代理走 server { listen 80; location / { proxy_pass http://127.0.0.1:8080/; proxy_redirect default; proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; #獲取客戶端真實IP proxy_connect_timeout 30; #超時時間 proxy_send_timeout 60; proxy_read_timeout 60; proxy_buffer_size 32k; proxy_buffering on; #開啟緩衝區,減少磁碟io proxy_buffers 4 128k; proxy_busy_buffers_size 256k; proxy_max_temp_file_size 256k; #當超過記憶體允許儲蓄大小,存到檔案 } }
相關文章
- Nginx入門到實戰(1)基礎篇Nginx
- Nginx入門到實戰(4)常見問題Nginx
- nginx實現常見場景Nginx
- MongoDB一篇從入門到實戰MongoDB
- Linux入門到實戰Linux
- web3從入門到實戰-理論篇Web
- NGINX 入門到企業級應用實踐-基礎篇Nginx
- Redis 從入門到實戰Redis
- Gin + GORM 入門到實戰GoORM
- Locust 從入門到實戰
- Nginx入門到實戰(3)負載均衡和快取服務Nginx負載快取
- Docker從入門到實戰pdfDocker
- Docker實戰-從入門到跑路Docker
- 前端開發入門到實戰:css實現div垂直水平居中的2種常用方法前端CSS
- web前端入門到實戰:css3 實現大轉盤Web前端CSSS3
- nginx實用入門Nginx
- 快速入門一篇搞定RocketMq-實現微服務實戰落地MQ微服務
- web前端入門到實戰:H5-canvas實現粒子時鐘Web前端H5Canvas
- Uni-app從入門到實戰APP
- Dubbo 一篇文章就夠了:從入門到實戰
- web前端入門到實戰:非同步載入CSS最簡單的實現方式Web前端非同步CSS
- Nginx入門實踐(二)Nginx
- Linux Capabilities 入門教程:進階實戰篇Linux
- web前端入門到實戰:JS中new操作符原始碼實現Web前端JS原始碼
- 微信小程式入門到實戰(三)微信小程式
- 小程式從入門到實戰系列(一)
- web前端入門到實戰:Js代理模式Web前端JS模式
- iOS逆向安防從入門到實戰iOS
- VT 入門篇——最小 VT 實現(上)
- Python實戰案例彙總,帶你輕鬆從入門到實戰Python
- 實戰篇——CSRF漏洞pikachu靶場實戰
- Pulsar 入門實戰(2)--特性及架構架構
- Spring Boot2從入門到實戰:統一異常處理Spring Boot
- JDBC+MySQL入門實戰(實現CURD的例子)JDBCMySql
- SqlSugar ORM 入門篇2 【查詢】 讓我們實現零SQLSqlSugarORM
- podman 入門實戰
- Angularjs 從入門到實戰(含專案教程)AngularJS
- 小白變大神——Docker入門到精通完整實戰Docker