Nginx作爲靜態資源Web服務

  Nginx作爲靜態資源web服務時,通過接收客戶端的靜態資源請求,然後到靜態文件存儲位置獲取對應的資源並返回給客戶端,流程如下圖所示:



  我們常見的靜態資源種類有哪些呢?
  -瀏覽器端渲染:HTML、CSS、JS
  -圖片:JPEG、GIF、PNG
  -視頻:FLV、MPEG
  -文件:TXT、等任意下載文件

Nginx作爲靜態資源服務的場景:CDN


  在北京的用戶請求的資源在北京時,速度會非常快。但是並不是所有資源都放在北京,可能有一天要請求的靜態資源放在上海,這個時候,CDN的作用就來了。如果發現在北京的CDN緩存服務器上沒有資源,就會向資源存儲中心請求上海的資源,然後根據配置策略緩存在北京,Nginx可以完成這項任務。CDN具體是什麼可以看看這篇文章:https://zhuanlan.zhihu.com/p/52362950?utm_source=wechat_session&utm_medium=social&utm_oi=631750531454996480

Nginx關於靜態資源的相關配置

  文件讀取配置

   sendfile on | off,默認sendfile是關閉的,可以配置在http,server,location,if in location中

  多個包整合

   tcp_nopush on | off,默認是關閉狀態,可以在http,server,location中配置,它的作用是在sendfile開啓的情況下,提高網絡包的傳輸效率。什麼意思呢,假設服務端收到請求,需要推送10個包,爲了提高傳輸效率,這10個包不會一個一個返回給客戶端,而是將10個包攢夠了後一起返回回去。

  網絡包的實時性傳輸

   tcp_nodelay on | off,默認開啓,可以在http,server,location中配置,它的作用是在keepalive鏈接下,提高網絡包的傳輸實時性。

  壓縮

   gzip on | off,默認是關閉狀態,可以在http,server,location,if in location中配置,作用是壓縮傳輸。一般來說瀏覽器是可以對壓縮後的內容進行解壓的。

  壓縮級別

   gzip_comp_level level;默認的壓縮級別是1,可以在http,server,location中配置,級別配置的越高,壓縮的越好,但是壓縮會耗費服務端的計算資源,所以要控制好壓縮級別

  壓縮對http協議的支持

   gzip_http_version 1.0 | 1.1,默認對HTTP/1.1協議的請求才會進行gzip壓縮,可以配置在http,server,location中配置。當用戶想要讀取一個1.html文件,首先會在目錄中找尋1.html.gz是否存在,所以這就導致了磁盤資源的浪費,必須要存儲兩份文件。

  壓縮實戰

  實戰1:壓縮下載文件

  步驟1:配置一個conf文件,這個時候gzip on先不打開:

    location ~ .*\.(jpg|gif|png)$ {
        #gzip on;
        #gzip_http_version 1.1;
        #gzip_comp_level 2;
        #gzip_types text/plain application/javascript image/jpeg image/gif image/png;
        root   /usr/share/nginx/images;
    }

    location ~ .*\.(txt|xml)$ {
        #gzip on;
        #gzip_http_version 1.1;
        #gzip_comp_level 1;
        #gzip_types text/plain application/javascript image/jpeg image/gif image
/png;
        root   /usr/share/nginx/code;
    }

    location ~ ^/download {
        gzip_static on;
        tcp_nopush on;
        root /opt/app/code;
    }

  步驟2:直接訪問,我們可以看到請求的文本大小是68.7KB:

  步驟3:取消gzip的相關注釋

    location ~ .*\.(jpg|gif|png)$ {
        gzip on;
        gzip_http_version 1.1;
        gzip_comp_level 2;
        gzip_types text/plain application/javascript image/jpeg image/gif image/png;
        root   /usr/share/nginx/images;
    }

    location ~ .*\.(txt|xml)$ {
        gzip on;
        gzip_http_version 1.1;
        gzip_comp_level 1;
        gzip_types text/plain application/javascript image/jpeg image/gif image/png;
        root   /usr/share/nginx/code;
    }

  步驟4:再次訪問:只有18.6KB了,說明我們壓縮成功了。

Nginx緩存配置

  在瀏覽器沒有緩存的情況下,請求到響應的過程如下:



  有緩存的情況如下:



校驗緩存是否過期的機制有三個:
  通過Expires、Cache-Control來判斷

  通過協議中Etag頭信息來校驗
  通過Last-Modified頭信息來校驗
後兩種要和服務端聯繫。LastModified精確到秒,如果說在一秒內改變了兩次是無法判斷過期的,Etag是通過一個特殊字符串來解決這個侷限,所以優先被使用。我們可以看看瀏覽器是如何判斷緩存是否過期的,流程圖如下:


Nginx如何配置Expires

  expires [modified] time; expires epoch | max | off,默認情況下是關閉的,可以配置在http,server,location,if in location中。這裏多說一句,不是每個瀏覽器都會給max-age設置值,chrome瀏覽器的max-age始終是0,會強制去服務器拿資源。
  我們先看一下沒有expire的情況下,服務端的響應返回是什麼:



  Nginx.conf端配置:

location ~ .*\.(htm|html)$ {
        expires 24h;
        root   /usr/share/nginx/code;
    }

  返回結果多了max-age,而且應答碼是304:


Nginx防盜鏈

  Nginx的防盜鏈是防止資源被盜用,有的同學會問爲什麼要防呢,你的網站不是給別人訪問的麼,但是有時候我們不希望自己的靜態資源被競爭公司訪問到,這個時候就需要使用防盜鏈了。防盜鏈的設置思路就是區別哪些請求是正常用戶的請求。

使用方式:


    location ~ .*\.(jpg|gif|png)$ {
        gzip on;
        gzip_http_version 1.1;
        gzip_comp_level 2;
        gzip_types text/plain application/javascript image/jpeg image/gif image/png;
        valid_referers none blocked 47.100.199.15;
        if($invalid_referer) {
           return 403;
        }
        root   /usr/share/nginx/images;
    }

該指令會根據Referer Header頭的內容分配一個值爲0或1給變量invalid_referer。如果Referer Header頭不符合valid_referers指令設置的有效Referer,變量invalid_referer將被設置爲1。none:表示無Referer值的情況。blocked:表示Referer值被防火牆進行僞裝。
結果:

[root@slave2 conf.d]# curl -e "http://www.baidu.com" -I http://47.100.199.15/haha.png
HTTP/1.1 403 Forbidden
Server: nginx/1.16.0
Date: Sun, 19 May 2019 09:20:31 GMT
Content-Type: text/html
Content-Length: 153
Connection: keep-alive

響應碼403被攔截。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章