Nginx-場景實踐篇

Nginx-場景實踐篇

1、Nginx做爲靜態資源Web服務

一、動態資源和靜態資源

客戶端請求的頁面若是是靜態網頁,那麼服務器會直接把靜態網頁的內容響應給客戶端。若是客戶端請求的是動態網頁,服務器須要先把動態網頁換成靜態網頁,而後再把轉換後的靜態網頁響應給客戶端

靜態資源的幾種類型node

  • 瀏覽器渲染:HTML、CSS、JAVASCRIPT
  • 圖片:JPEG、GIF、PNG ...
  • 視頻:FLV、MPEG ...
  • 文件:TXT、等任意下載文件

二、CDN(Content Delivery Network)內容分發網絡

其基本思路是儘量避開互聯網上有可能影響數據傳輸速度和穩定性的瓶頸和環節,使內容傳輸的更快、更穩定。經過在網絡各處放置節點服務器所構成的在現有的互聯網基礎之上的一層智能虛擬網絡,CDN系統可以實時地根據網絡流量和各節點的鏈接、負載情況以及到用戶的距離和響應時間等綜合信息將用戶的請求從新導向離用戶最近的服務節點上。其目的是使用戶可就近取得所需內容,解決 Internet網絡擁擠的情況,提升用戶訪問網站的響應速度。

三、配置語法

  1. sendfile(文件讀取)算法

    • 配置語法:sendfile on|off;
    • 默認:無
    • Context:http,server,location,if in location
  2. tcp_nopush(sendfile開啓的狀況下,提升網絡包的傳輸效率)後端

    • 配置語法:tcp_nopush on|off;
    • 默認:無
    • Context:http,server,location
  3. tcp_nodelay(keepalive鏈接下,提升網絡包的傳輸實時性)瀏覽器

    • 配置語法:tcp_nodely on|off;
    • 默認:無
    • Context:http,server,location
  4. gzip(壓縮)緩存

    • 配置語法:gzip on|off;
    • 默認:無
    • Context:http,server,location,if in location
  5. gizp_comp_level(壓縮比)服務器

    • 配置語法:gzip_comp_level level;
    • 默認:無;
    • Context:http,server,location
  6. gzip_http_version(gzip的http的版本)cookie

    • 配置語法:gzip_http_version 1.0|1.1;
    • 默認:無
    • Context:http,server,location
  7. gzip_static(預讀gzip功能)網絡

    • 配置語法:gzip_static on|off|always;
    • 默認:gzip_static off;
    • Context:http,server,location

四、瀏覽器緩存

HTTP協議定義的緩存機制(如:Expires;Cache-control等)
  • 瀏覽器無緩存:負載均衡

    • 瀏覽器請求→無緩存→請求WEB服務器→請求相應,協商→呈現
  • 客戶端有緩存curl

    • 瀏覽器請求→有緩存→校驗過時→呈現
  • 校驗過時機制
校驗方式 對應頭信息
校驗是否過時 Expires、Cache-Control(max-age)
協議中的Etag頭信息校驗 Etag
Last-Modified有信息校驗 Last-Modified
  • 第一次請求:

圖片描述

  • 第二次請求:

圖片描述

  • expires(response的headers添加Cache-Control、Expires)

    • 配置語法:expires [modified] time; expires epoch |max |off;
    • 默認:expires off;
    • Context:http,server,location,if in location

五、跨站訪問

Nginx如何打開跨站訪問? Access-Controller-Allow-Origin
  • add_header

    • 配置語法:add_header name value [always];
    • 默認:無
    • Context:http,server,location,if in location
name能夠爲 Access-Controller-Allow-Origin 和 Access-Controller-Allow-Method

六、防盜鏈

基於http_refer防盜鏈配置模塊
  • 配置語法:valid_referers none|blocked|server_names|string...;
  • 默認:無
  • Context:server,location
valid_referers none blocked IP
if($invalid_referer) {
    return 403;
}

提醒:可使用curl來測試配置好的防盜鏈:curl -e "http:www.baidu.com" -I IP


2、Nginx做爲代理服務

  • 正向代理

    • 對象是客戶端(好比說想訪問外網,把代理服務器設到代理地址,客戶端能夠訪問任何網站)
  • 反向代理

    • 對象是服務端(並不須要關心訪問的是哪一臺服務器,反向代理就放在服務端。反向代理會幫咱們處理請求)
  • proxy_pass

    • 配置語法:proxy_pass URL;
    • 默認:無
    • Context:location,if in location,limit_except
其餘代理的一些語法 補充
  • proxy_buffering(緩衝區)

    • 語法配置:proxy_buffering on | off;
    • 默認:無;
    • Context:http,server,location
    • 擴展:proxy_buffer_size、proxy_buffers、proxy_busy_buffers_size
  • proxy_redirect(跳轉重定向)

    • 配置語法:proxy_redirect default;proxy_redirect off;proxy_redirect redirect replacement;
    • 默認:無
    • Context:http,server,location
  • proxy_set_header(頭信息)

    • 配置語法:proxy_set_header file value;
    • 默認:proxy_set_header Host $proxy_host;proxy_set_header Connection close;
    • Context:http,server,location
    • 擴展:proxy_hide_header、proxy_set_body
  • proxy_connect_timeout(超時)

    • 配置語法:proxy_connect_timeout time;
    • 默認:無
    • Context:http,server,location
    • 擴展:proxy_read_timeout、proxy_send_timeout
配置文件中的例子:
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;

proxy_connect_timeout 30;
proxy_send_timeout 60;
proxy_read_timeout 60;

proxy_buffer_size 32k;
proxy_buffering on;
proxy_buffers 4 128k;
proxy_busy_buffers_size 256k;
proxy_max_temp_file_size 256k;

3、Nginx做爲負載均衡服務

負載均衡:創建在現有網絡結構之上,它提供了一種廉價有效透明的方法擴展網絡設備和服務器的帶寬、增長吞吐量、增強網絡數據處理能力、提升網絡的靈活性和可用性。
負載均衡,英文名稱爲Load Balance,其意思就是分攤到多個操做單元上進行執行,例如Web服務器、FTP服務器、企業關鍵應用服務器和其它關鍵任務服務器等,從而共同完成工做任務。
  • upstream

    • 配置語法: upstream name {...}
    • 默認:無
    • Context:http

簡單配置例子

upstream ronaldo {
        server ip:port [param];
        server ip:port [param];
        server ip:port [param];
}
server {
    location / {
        proxy_pass http://ronaldo;
    }
}

param參數解釋:

param 意義
down 當前的server暫時不參與負載均衡
weight=num 權重,num越大,輪詢到的機率越大
backup 預留的備份服務器
max_fails 容許請求失敗的次數
fail_timeout 通過max_fails失敗後,服務暫停的時間(默認是10s)
max_conns 限制最大的接收的鏈接數

調度算法:

算法 意義
輪詢 按時間順序逐一分配到不一樣的後端服務器
加權輪詢 weight值越大,分配到的訪問概率越高
ip_hash 每一個請求按訪問IP的hash結果分配,這樣來自同一個IP就固定訪問同一個後端服務器
least_conn 最少鏈接數,哪一個服務器鏈接數少就分發
url_hash 按照訪問的URL的hash結果來分配請求,是每一個URL定向到同一個後端服務器
hash關鍵字值 hash自定義的key
  • ip_hash:

    • 只須要在upstream中加入 ip_hash; 便可
    • 缺陷:若是走代理,那麼remote_addr就不是用戶真實的ip
  • url_hash(1.7.2版本之後可用):

    • 配置語法:hash key [consistent];
    • 默認:無
    • Context:upstream
key能夠是$request_uri,根據url進行hash

4、Nginx做爲緩存服務

一、緩存的類型

  • 服務端緩存。例:memcache、reids
  • 代理緩存。例:Nginx緩存服務端的數據
  • 客戶端緩存。

圖片描述

二、經常使用緩存配置

  • proxy_cache_path

    • 配置語法proxy_cache_path path [levels=levels] [use_temp_path=on|off] keys_zone=name:size [inactive=time] [max_size] [use_temp_path]...
    • 默認:無
    • Context:http
  • proxy_cache

    • 配置語法:proxy_cache zone | off;
    • 默認:proxy_cache off;
    • Context:http,server,location
  • proxy_cache_valid(緩存過時週期)

    • 配置語法:proxy_cache_valid [code...] time
    • 默認:無
    • Context:http、server、location
  • proxy_cache_key(緩存的維度)

    • 配置語法:proxy_cache_key string;
    • 默認:proxy_cache_key $scheme$proxy_host$request_uri;
    • Context:http、server、location

常見配置:

proxy_cache_path cache_path levels=1:2 keys_zone=key_name:10m max_size=10g inactive=60m use_temp_path=off;

server {
    loaction / {
        proxy_pass http://ronaldo;
        proxy_cache key_name;
        proxy_cache_valid 200 304 12h;
        proxy_cache_valid any 10m;
        proxy_cache_key $host$uri$is_args$args;
        add_header Nginx-Cache "$upstream_cache_status";

        proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
    }
}

二、清除指定緩存

  • rm -rf 緩存目錄內容
  • 第三方擴展模塊:ngx_cache_purge

三、如何讓部分頁面不緩存

  • proxy_no_cache

    • 配置語法:proxy_no_cache string ...;
    • 默認:無
    • Context:http,server,location

簡單示例

if ($request_uri ~ ^/(url_3|login|register|password\/reset)) {
    set $cookie_nocache 1;
}

location / {
    proxy_no_cache $cookie_nocache;
}

四、大文件分片請求

  • slice

    • 語法配置:slice size;
    • 默認:slice 0;
    • Context:http、server,location
優點:每一個子請求收到的數據都會造成一個獨立的文件,一個請求斷了,其餘請求不受影響。
缺點:當文件很大或者slice很小的時候,可能會致使文件描述符耗盡等待狀況。
相關文章
相關標籤/搜索