首頁  >  文章  >  後端開發  >  Nginx的場景實踐

Nginx的場景實踐

不言
不言原創
2018-05-07 11:05:511435瀏覽

這篇文章主要介紹了關於Nginx的場景實踐,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下

#一、Nginx作為靜態資源Web服務

1、動態資源和靜態資源

客戶端請求的頁面如果是靜態網頁,那麼伺服器會直接把靜態網頁的內容回應給客戶端。如果客戶端要求的是動態網頁,伺服器需要先把動態網頁換成靜態網頁,然後再把轉換後的靜態網頁回應給客戶端

靜態資源的幾種型別

  • #瀏覽器渲染:HTML、CSS、JAVASCRIPT

  • 圖片:JPEG、GIF、PNG ...

  • 視頻:FLV、MPEG ...

  • 檔:TXT、等任一下載檔案

2、CDN(Content Delivery Network)內容傳遞網絡

其基本想法是盡可能避開網路上有可能影響資料傳輸速度和穩定性的瓶頸和環節,使內容傳輸的更快、更穩定。透過在網絡各處放置節點伺服器所構成的在現有的互聯網基礎之上的一層智能虛擬網絡,CDN系統能夠實時地根據網絡流量和各節點的連接、負載狀況以及到用戶的距離和響應時間等綜合資訊將使用者的請求重新導向離用戶最近的服務節點上。其目的是使用戶可就近取得所需內容,解決 Internet網路擁擠的狀況,提高使用者造訪網站的回應速度。

3、設定語法

  1. sendfile(檔案讀取)

  • 設定語法:sendfile on|off ;

  • 預設:無

  • Context:http,server,location,if in location

  • tcp_nopush(sendfile開啟的情況下,提高網路套件的傳輸效率)

    • 設定語法:tcp_nopush on|off;

    • #預設:無

    • Context:http,server,location

  • tcp_nodelay(keepalive連線下,提升網路包的傳輸即時性)

    • 設定語法:tcp_nodely on|off;

    • ##預設:無

    • Context:http,server,location

  • gzip(壓縮)

    • 設定語法:gzip on|off;

    • 預設:無

    • #Context:http,server,location,if in location

  • gizp_comp_level(壓縮比)

    • 設定語法:gzip_comp_level level;

    • #預設:無;

    • Context:http,server,location

  • #gzip_http_version(gzip的http的版本)

    • #設定語法:gzip_http_version 1.0|1.1;

    • 預設:無

    • Context:http,server,location

  • gzip_static(預讀gzip功能)

    • 設定語法:gzip_static on|off|always;

    • 預設:gzip_static off;

    • Context:http,server,location

    ##4、瀏覽器快取

    HTTP協定定義的快取機制(如:Expires;Cache-control等)

      瀏覽器無快取:
      • 瀏覽器請求→無快取→請求WEB伺服器→請求相應,協商→呈現
      #客戶端有快取
      • #瀏覽器請求→有快取→校驗過期→呈現
      #校驗過期機制
    校驗方式#校驗是否過期協定中的Etag頭資訊校驗##Last-Modified有資訊校驗Last-Modified
    • 第一次要求:

    Nginx的場景實踐

    • #第二次請求:

    Nginx的場景實踐

    • #expires(response的headers新增Cache-Control、Expires)

      • 設定語法:expires [modified] time; expires epoch |max |off;

      • 預設:expires off;

      • Context:http,server,location,if in location

    #5、跨站訪問

    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
    #6、防盜鏈

    基於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
    • 二、Nginx作為代理服務

      • 正向代理程式

      ##物件是客戶端(比如說想存取外網,把代理伺服器設到代理位址,客戶端可以存取任何網站)
      • #反向代理程式
      • 物件是服務端(不需要關心存取的是哪一台伺服器,反向代理就放在服務端。反向代理程式會幫我們處理請求)

      • proxy_pass

    設定語法:proxy_pass URL;
      預設:無
    • Context:location,if in location,limit_except
      • #其他代理程式的一些語法
      • 補充

      • #proxy_buffering(緩衝區)

      • 語法配置:proxy_buffering on | off;
    • ## 預設:無;

      • Context:http,server,location
      • 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(超時)##############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;
    ###三、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参数解释:

    對應頭資訊
    Expires、 Cache-Control(max-age)
    Etag
    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

    四、Nginx作为缓存服务

    1、缓存的类型

    • 服务端缓存。例:memcache、reids

    • 代理缓存。例:Nginx缓存服务端的数据

    • 客户端缓存。

    Nginx的場景實踐

    2、常用缓存配置

    • 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;
        }
    }

    2、清除指定缓存

    • rm -rf 缓存目录内容

    • 第三方扩展模块:ngx_cache_purge

    3、如何让部分页面不缓存

    • 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;
    }

    4、大文件分片请求

    • slice

      • 语法配置:slice size;

      • 默认:slice 0;

      • Context:http、server,location

    优势:每个子请求收到的数据都会形成一个独立的文件,一个请求断了,其他请求不受影响。
    缺点:当文件很大或者slice很小的时候,可能会导致文件描述符耗尽等待情况。

    相关推荐:

    关于Nginx的基础内容

    Nginx编译安装Lua模块

    以上是Nginx的場景實踐的詳細內容。更多資訊請關注PHP中文網其他相關文章!

    陳述:
    本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn