首頁»服務器»Nginx入門到實戰(2)場景實現篇

Nginx入門到實戰(2)場景實現篇

來源:海島 發布時間:2019-07-02 閱讀次數:

一、靜態資源WEB服務

1.靜態資源類型

非服務器動態運行生成的文件,換句話說,就是可以直接在服務器上找到對應文件的請求

  1. 瀏覽器端渲染:HTML,CSS,JS
  2. 圖片:JPEG,GIF,PNG
  3. 視頻:FLV,MPEG
  4. 文件: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; #當超過內存允許儲蓄大小,存到文件
    }
}
QQ群:WEB開發者官方群(515171538),驗證消息:10000
微信群:加小編微信 849023636 邀請您加入,驗證消息:10000
提示:更多精彩內容關注微信公眾號:全棧開發者中心(fsder-com)
網友評論(共0條評論) 正在載入評論......
理智評論文明上網,拒絕惡意謾罵 發表評論 / 共0條評論
登錄會員中心
李逵劈鱼9900炮 香港赛马会历史开奖记录 3d试机号后预测汇总牛材网 福建时时几点开始 江西时时彩走势图 最准的特马网站免费白小姐 上海时时开奖直播 排球场比分直播 六位微信号注册推荐 五分快三的和值 五大联赛每年都有吗