• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • Nginx 簡介

    標簽: Nginx  nginx

    什么是Nignx服務器

    • 官網:http://nginx.org/
    • 是一個高性能的HTTP和反向代理web服務器
    • Nginx代碼完全用C語言從頭寫成
    • 適合系統:Mac/Windows/Linux

     

    為什么要用這個

    • 社區活躍
    • 高性能-支持單機千萬級連接
    • 強大的第三方庫支持
    • 功能強大:負載均衡、靜態文件服務器、支持多種協議https、POP3等等

     

    什么是正向代理服務器和反向代理服務器

    正向代理服務器

    • 客戶端和目標服務器之間的服務器,客戶端向代理發送一個請求指定目標服務器,然后代理向目標服務器請求并獲得內容,并返回給客戶端,平時說的代理服務器一般是正向代理服務器

    • 核心:用戶知道自己訪問的目標服務器

    • 場景:跳板機、堡壘機、訪問原來無法訪問的網站, 比如國外的一些站點

    反向代理服務器(如Nginx)

    • 客戶端和目標服務器之間的服務器,客戶端向代理發送一個請求,然后代理向目標服務器請求并獲得內容,并返回給客戶端。反向代理隱藏了真實的服務器
    • 核心:客戶端不知道要訪問的目標服務器是哪臺服務器,代理會根據一定的策略選擇一個真實的服務器進行請求
    • 場景:訪問淘寶,知道訪問的域名是taobao.com, 但是后面提供數據的具體是什么域名或ip我們是不知道的

     

    阿里云服務器登錄使用和常見終端工具

    • 控制臺修改阿里云遠程連接密碼
    • windows工具 putty,xshell, security CRT
    • 蘋果系統MAC : 通過終端登錄
    • linux圖形操作工具(用于遠程連接上傳文件)

    mac: filezilla

    sftp://39.95.62.131

     

    windows: winscp

     

    nginx下載和阿里快速安裝

    • 下載壓縮包 并上傳

    http://nginx.org/en/download.html

    • 安裝依賴

    yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel

    • 創建一個文件夾,上傳本地提供的nginx包

    tar -zxvf nginx-1.18.0.tar.gz

    //執行命令 
    ./configure
    make
    make install

    • 默認安裝路徑

    /usr/local/nginx

    • 訪問配置

    cd /usr/local/nginx/sbin

    // 啟動Nginx
    ./nginx

    • 防火墻開放端口,阿里云網絡安全組配置80端口

     

    應用部署到可以公網訪問需要知道的常識

    • 一個http請求基本流程

    客戶端通過發起域名資源請求 -> DNS解析獲得IP -> 尋找服務器獲得資源

    • 域名和ip的關系,DNS作用

    DNS:Domain Name Server 域名服務器

    域名雖然便于人們記憶,但網絡中的計算機之間只能互相認識IP地址,它們之間的轉換工作稱為域名解析,域名解析需要由專門的域名解析服務器來完成,DNS 就是進行域名解析的服務器

    • 什么是cname和a記錄

    a記錄

    用戶可以在此設置域名并指向到自己的目標主機地址上,從而實現通過域名找到服務器(也叫ip指向域名配置)vincent.com -> 39.95.62.131

    cname

    別名指向,可以為一個主機設置別名。比如設置vincent1024.com,用來指向一個主機 vincent.com 那么以后就可以用vincent1024.com來代替訪問 vincent.net 了

    • 購買域名,備案

    阿里云 備案地址:https://beian.aliyun.com/

    • 安裝項目依賴的基本環境,比如java、nginx等軟件
    • 配置域名解析到服務器,nginx是80端口,解析到80端口就行

     

    Nginx目錄文件講解

    • 源碼編譯安裝后,默認目錄
    /usr/local/nginx
    • 目錄核心介紹

    conf  #所有配置文件目錄
      nginx.conf    #默認的主要的配置文件
      nginx.conf.default  #默認模板
    ?
    html  # 這是編譯安裝時Nginx的默認站點目錄
      50x.html #錯誤頁面
      index.html #默認首頁
      
    logs  # nginx默認的日志路徑,包括錯誤日志及訪問日志
      error.log  #錯誤日志
      nginx.pid  #nginx啟動后的進程id
      access.log #nginx訪問日志
    ?
    sbin  #nginx命令的目錄
      nginx  #啟動命令

    • 常見命令

    ./nginx  #默認配置文件啟動
    ?
    ./nginx -s reload #重啟,加載默認配置文件
    ?
    ./nginx -c /usr/local/nginx/conf/nginx.conf    #啟動指定某個配置文件
    ?
    ./nginx -s stop   #停止

    ./nginx -t     #測試配置文件是否有語法錯誤
    ?
    #關閉進程,nginx有master process 和worker process,關閉master即可
    ps -ef | grep "nginx"
    kill -9 PID 

    Nginx核心知識之默認配置文件講解

    • 全局配置
    • server 主機設置
    • location(URL匹配特定位置的設置)
    # 每個配置項由配置指令和指令參數 2 個部分構成
    #user  nobody;  # 指定Nginx Worker進程運行以及用戶組
    worker_processes  1;   # 
    ?
    #error_log  logs/error.log;  # 錯誤日志的存放路徑  和錯誤日志
    #error_log  logs/error.log  notice;
    #error_log  logs/error.log  info;
    ?
    #pid        logs/nginx.pid;   # 進程PID存放路徑
    ?
    ?
    # 事件模塊指令,用來指定Nginx的IO模型,Nginx支持的有select、poll、kqueue、epoll 等。不同的是epoll用在Linux平臺上,而kqueue用在BSD系統中,對于Linux系統,epoll工作模式是首選
    events { 
        use epoll;
      # 定義Nginx每個進程的最大連接數, 作為服務器來說: worker_connections * worker_processes,
      # 作為反向代理來說,最大并發數量應該是worker_connections * worker_processes/2。因為反向代理服務器,每個并發會建立與客戶端的連接和與后端服務的連接,會占用兩個連接
        worker_connections  1024; 
    }
    ?
    ?
    http {
        include       mime.types;
        default_type  application/octet-stream;
        # 自定義服務日志
        #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
        #                  '$status $body_bytes_sent "$http_referer" '
        #                  '"$http_user_agent" "$http_x_forwarded_for"';
    ?
        #access_log  logs/access.log  main;
    ?
        # 是否開啟高效傳輸模式 on開啟 off關閉
        sendfile        on;
        
        #減少網絡報文段的數量
        #tcp_nopush     on;
    ?
        #keepalive_timeout  0;
        # 客戶端連接保持活動的超時時間,超過這個時間之后,服務器會關閉該連接
        keepalive_timeout  65;
    ?
        #gzip  on;
        
        # 虛擬主機的配置
        server {
            listen       80; # 虛擬主機的服務端口
            server_name  localhost; #用來指定IP地址或域名,多個域名之間用空格分開
    ?
            #charset koi8-r;
    ?
            #access_log  logs/host.access.log  main;
    ?
            #URL地址匹配
            location / {
                root   html;  # 服務默認啟動目錄
                index  index.html index.htm; #默認訪問文件,按照順序找
            }
    ?
            #error_page  404              /404.html;   #錯誤狀態碼的顯示頁面
    ?
            # redirect server error pages to the static page /50x.html
            #
            error_page   500 502 503 504  /50x.html;
            location = /50x.html {
                root   html;
            }
    ?
            # proxy the PHP scripts to Apache listening on 127.0.0.1:80
            #
            #location ~ \.php$ {
            #    proxy_pass   http://127.0.0.1;
            #}
    ?
            # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
            #
            #location ~ \.php$ {
            #    root           html;
            #    fastcgi_pass   127.0.0.1:9000;
            #    fastcgi_index  index.php;
            #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
            #    include        fastcgi_params;
            #}
    ?
            # deny access to .htaccess files, if Apache's document root
            # concurs with nginx's one
            #
            #location ~ /\.ht {
            #    deny  all;
            #}
        }
    ?
    ?
        # another virtual host using mix of IP-, name-, and port-based configuration
        #
        #server {
        #    listen       8000;
        #    listen       somename:8080;
        #    server_name  somename  alias  another.alias;
    ?
        #    location / {
        #        root   html;
        #        index  index.html index.htm;
        #    }
        #}
    ?
    ?
        # HTTPS server
        #
        #server {
        #    listen       443 ssl;
        #    server_name  localhost;
    ?
        #    ssl_certificate      cert.pem;
        #    ssl_certificate_key  cert.key;
    ?
        #    ssl_session_cache    shared:SSL:1m;
        #    ssl_session_timeout  5m;
    ?
        #    ssl_ciphers  HIGH:!aNULL:!MD5;
        #    ssl_prefer_server_ciphers  on;
    ?
        #    location / {
        #        root   html;
        #        index  index.html index.htm;
        #    }
        #}
    }

     

    Nginx配置虛擬主機,搭建前端靜態資源服務器

    • 什么是虛擬主機

    指在一臺物理主機服務器上劃分出多個磁盤空間,每個磁盤空間都是一個虛擬主機,每臺虛擬主機都可以對外提供Web服務,并且互不干擾,就類似虛擬機

    利用虛擬主機把多個不同域名的網站部署在同一臺服務器上,節省了服務器硬件成本和相關的維護費用

    • 【注意】配置之前,拷貝一份默認的出來,nginx配置容易出錯且肉眼難看出來,要仔細核對

    • Nginx虛擬主機配置
    server {
            listen       80;
            server_name  9527abc.com;
    ?
            location / {
                root   /usr/local/nginx/html;
                index  vincent.html;
            }
      }
      
    server {
            listen       80;
            server_name  2459527.com;
            
            location / {
                root   html;
                index  vincent.html index.htm;
            }
    }

     

    Nginx搭建圖片-文件服務器

    • 圖片服務器

    學javaweb、或者其他基礎web項目,基本都是圖片上傳到項目本身,這個是生成很少用

    公司一般會使用圖片服務器或者云廠商提供的CDN

    • 使用流程

    前端提交圖片->后端處理->存儲到圖片服務器->拼接好訪問路徑存儲到數據庫和范圍前端

    • 本地圖片上傳上去,配置專屬訪問路徑
    server {
            listen       80;
            server_name  vincent9527.com;
            location /app/img {
              alias /usr/local/software/img/;
            }
      }
    
    • 注意

    在location / 中配置root目錄

    在location /path中配置alias虛擬目錄, 目錄后面的"/"符號一定要帶上

     

    Nginx訪問日志的用處

    • access.log日志用處
    1. 統計站點訪問ip來源、某個時間段的訪問頻率
    2. 查看訪問最頻的頁面、Http響應狀態碼、接口性能
    3. 接口秒級訪問量、分鐘訪問量、小時和天訪問量
    • 默認配置解析
    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';
    • 案例
    61.140.75.5 - - [04/Sept/2020:14:46:48 +0800] "GET /user/api/v1/product/order/query_state?product_id=1&token=vincenteyJhbGciOJE HTTP/1.1" 200 48 "https://vincent.com/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36"
    • 解析
    $remote_addr 對應的是真實日志里的61.140.75.5,即客戶端的IP。
    ?
    $remote_user 對應的是第二個中杠“-”,沒有遠程用戶,所以用“-”填充。
    ?
    [$time_local]對應的是[04/Sept/2020:14:46:48 +0800]。
    ?
    “$request”對應的是"GET /user/api/v1/product/order/query_state?product_id=1&token=vincenteyJhbGciOJE HTTP/1.1"。
    ?
    $status對應的是200狀態碼,200表示正常訪問。
    ?
    $body_bytes_sent對應的是48字節,即響應body的大小。
    ?
    “$http_referer” 對應的是”https://vincent.com/“,若是直接打開域名瀏覽的時,referer就會沒有值,為”-“。
    ?
    “$http_user_agent” 對應的是”Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:56.0) Gecko/20100101 Firefox/56.0”。
    ?
    “$http_x_forwarded_for” 對應的是”-“或者空。

     

    Nginx統計站點訪問量、高頻url統計

    • 查看訪問最頻繁的前100個IP
    awk '{print $1}' access_temp.log | sort -n |uniq -c | sort -rn | head -n 100
    • 統計訪問最多的url 前20名
    cat access_temp.log |awk '{print $7}'| sort|uniq -c| sort -rn| head -20 | more
    • 基礎命令
    awk 是文本處理工具,默認按照空格切分,$N 是第切割后第N個,從1開始
    ?
    ?
    sort命令用于將文本文件內容加以排序,-n 按照數值排,-r 按照倒序來排
    案例的sort -n 是按照第一列的數值大小進行排序,從小到大,倒序就是 sort -rn
    ?
    uniq 去除重復出現的行列, -c 在每列旁邊顯示該行重復出現的次數

     

    自定義日志格式,統計接口響應耗時

    • 日志格式增加 $request_time
    從接受用戶請求的第一個字節到發送完響應數據的時間,即包括接收請求數據時間、程序響應時間、輸出響應數據時間
    ?
    $upstream_response_time:指從Nginx向后端建立連接開始到接受完數據然后關閉連接為止的時間
    ?
    $request_time一般會比upstream_response_time大,因為用戶網絡較差,或者傳遞數據較大時,前者會耗時大很多
    • 配置自定義日志格式
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                         '$status $body_bytes_sent "$http_referer" '
                          '"$http_user_agent" "$http_x_forwarded_for" $request_time';
    ?
    ?
    server {
            listen       80;
            server_name  vincent9527.com;
    ?
            location / {
                root   /usr/local/nginx/html;
                index  vincent.html;
            }
            #charset koi8-r;
            #
            access_log  logs/host.access.log  main;
    }
    • 統計耗時接口, 列出傳輸時間超過 2 秒的接口,顯示前5條
    cat time_temp.log|awk '($NF > 2){print $7}'|sort -n|uniq -c|sort -nr|head -5
    ?
    備注:$NF 表示最后一列, awk '{print $NF}'

     

    Nginx的upstream模板介紹

    • 負載均衡(Load Balance)
    1. 分布式系統中一個非常重要的概念,當訪問的服務具有多個實例時,需要根據某種“均衡”的策略決定請求發往哪個節點,這就是所謂的負載均衡
    2. 原理是:將數據流量分攤到多個服務器執行,減輕每臺服務器的壓力,從而提高了數據的吞吐量
    • 負載均衡的種類
    1. 通過硬件來進行解決,常見的硬件有NetScaler、F5、Radware和Array等商用的負載均衡器,但比較昂貴的
    2. 通過軟件來進行解決,常見的軟件有LVS、Nginx等,它們是基于Linux系統并且開源的負載均衡策略
    3. 目前性能和成本來看,Nginx是目前多數公司選擇使用的

    • 配置案例
    upstream lbs {
       server 192.168.0.106:8080;
       server 192.168.0.106:8081;
    }
    ?
    location /api/ {
        proxy_pass http://lbs;
        proxy_redirect default;
    }

     

    Nginx常見的負載均衡策略解析

    • 節點輪詢(默認)

    簡介:每個請求按順序分配到不同的后端服務器

    場景:會造成可靠性低和負載分配不均衡,適合靜態文件服務器

    • weight 權重配置

    簡介:weight和訪問比率成正比,數字越大,分配得到的流量越高

    場景:服務器性能差異大的情況使用

    upstream lbs {
       server 192.168.159.133:8080 weight=5;
       server 192.168.159.133:8081 weight=10; 
    }
    • ip_hash(固定分發)

    簡介:根據請求按訪問ip的hash結果分配,這樣每個用戶就可以固定訪問一個后端服務器

    場景:服務器業務分區、業務緩存、Session需要單點的情況

    upstream lbs {
       ip_hash;
       server 192.168.159.133:8080;
       server 192.168.159.133:8081;
    }
    • upstream還可以為每個節點設置狀態值

    down 表示當前的server暫時不參與負載

    server 192.168.159.133:8080 down;

    backup 其它所有的非backup機器down的時候,會請求backup機器,這臺機器壓力會最輕,配置也會相對低

    server 192.168.159.133:8080 backup;

     

    Nginx探測后端節點可用性和配置

    • 如果某個應用掛了,請求不應該繼續分發過去

    max_fails 允許請求失敗的次數,默認為1.當超過最大次數時就不會請求

    fail_timeout : max_fails次失敗后,暫停的時間,默認:fail_timeout為10s

    參數解釋:

    • max_fails=N 設定Nginx與后端節點通信的嘗試失敗的次數
    • 在fail_timeout參數定義的時間內,如果失敗的次數達到此值,Nginx就這個節點不可用
    • 在下一個fail_timeout時間段到來前,服務器不會再被嘗試
    • 失敗的嘗試次數默認是1,如果設為0就會停止統計嘗試次數,認為服務器是一直可用的

    什么是nginx認為的失敗呢

    可以通過指令proxy_next_upstream來配置什么是失敗的嘗試

    注意默認配置時,http_404狀態不被認為是失敗的嘗試

    • 配置實操
    upstream lbs {
        server 192.168.0.106:8080 max_fails=2 fail_timeout=60s ;
        server 192.168.0.106:8081 max_fails=2 fail_timeout=60s;
    }
    ?
    ?
    location /api/ {
        proxy_pass http://lbs;
        proxy_next_upstream error timeout http_500 http_503 http_404;
    }
    • 案例實操

    暫停一個后節點,然后訪問接口大于10次,Nginx會把這個節點剔除

    重啟這個節點,在fail_timeout周期里面不會再獲取流量

     

    Nginx自定義全局異常json數據

    • 任何接口都是可能出錯,4xx、5xx等
    • 如果業務沒有做好統一的錯誤管理,直接暴露給用戶,無疑是看不懂
    • 所以假如后端某個業務出錯,nginx層也需要進行轉換
    • 讓前端知道Http響應是200,其實是將錯誤的狀態碼定向至200,返回了全局兜底數據
    location / {
                proxy_pass http://lbs;
                proxy_redirect default;
               
                # 存放用戶的真實ip
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;  
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  
                
                proxy_next_upstream error timeout http_503 non_idempotent;
    ?
                #開啟錯誤攔截配置,一定要開啟
                proxy_intercept_errors on;
      }
    ?
    # 不加 =200,則返回的就是原先的http錯誤碼;配上后如果出現500等錯誤都返回給用戶200狀態,并跳轉至/default_api
      error_page  404 500 502 503 504  =200  /default_api;
      location = /default_api {
        default_type application/json;
        return 200 '{"code":"-1","msg":"invoke fail, not found "}';
     }

     

    Nginx封禁惡意IP

    網絡攻擊時有發生,TCP洪水攻擊、注入攻擊、DOS等,比較難防的有DDOS等

    數據安全,防止對手爬蟲惡意爬取,封禁IP

    • 采取措施一般就是封禁ip

    linux server的層面封IP:iptables

    nginx的層面封IP ,方式多種 (但 req還是會打進來, 讓nginx 返回 403, 占用資源)

    • Nginx作為網關,可以有效的封禁ip
    單獨網站屏蔽IP的方法,把include xxx; 放到網址對應的在server{}語句塊,虛擬主機
    所有網站屏蔽IP的方法,把include xxx; 放到http {}語句塊。
    ?
    nginx配置如下:
    ?
    http{
        # ....
        include blacklist.conf;
    }
    ?
    location / {
        proxy_pass http://lbs;
        proxy_redirect default;
    }
    ?
    ?
    #blacklist.conf目錄下文件內容
    deny 192.168.159.2;
    deny 192.168.159.32;
    • ./nginx -s reload   #重新加載配置,不中斷服務
    • 自動化封禁思路
    • 編寫shell腳本
    • awk 統計access.log,記錄每秒訪問超過60次的ip,然后配合nginx或者iptables進行封禁
    • crontab定時跑腳本

     

    Nginx配置解決瀏覽器跨域

    • 跨域:瀏覽器同源策略 1995年,同源政策由 Netscape 公司引入瀏覽器。目前,所有瀏覽器都實行這個政策。 最初,它的含義是指,A網頁設置的 Cookie,B網頁不能打開,除非這兩個網頁"同源"。所謂"同源"指的是"三個相同"

    協議相同  http https
    域名相同  www.baidu.com
    端口相同  80  81


    一句話:瀏覽器從一個域名的網頁去請求另一個域名的資源時,域名、端口、協議任一不同,都是跨域


    瀏覽器控制臺跨域提示:
    No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'null' is therefore not allowed access.

    • 解決方法
    1. JSONP
    2. Http響應頭配置允許跨域
    • nginx層配置
    • 程序代碼中處理通過攔截器配置
    • Nginx開啟跨域配置

    location下配置

    location / { 
        add_header 'Access-Control-Allow-Origin' $http_origin;
        add_header 'Access-Control-Allow-Credentials' 'true';
        add_header 'Access-Control-Allow-Headers' 'DNT,web-token,app-token,Authorization,Accept,Origin,Keep-Alive,User-Agent,X-Mx-ReqToken,X-Data-Type,X-Auth-Token,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range';
        add_header Access-Control-Allow-Methods 'GET,POST,OPTIONS';
    ?
    #如果預檢請求則返回成功,不需要轉發到后端
      if ($request_method = 'OPTIONS') {
          add_header 'Access-Control-Max-Age' 1728000;
          add_header 'Content-Type' 'text/plain; charset=utf-8';
          add_header 'Content-Length' 0;
          return 200;
        }
      
    }

     

    Nginx的location規則

    • 正則表達式
    ^ 以什么開始
    $ 以什么結束
    ?
    例如:^/api/user$
    • location 路徑匹配
    語法: location [ = | ~ | ~* | ^~ ] uri { ...... }
    • location = /uri

    = 表示精準匹配,只要完全匹配上才能生效

    • location /uri

    不帶任何修飾符,表示前綴匹配

    • location ^~ /uri/

    匹配任何已 /uri/ 開頭的任何查詢并且停止搜索

    • location /

    通用匹配,任何未匹配到其他location的請求都會匹配到

    • 正則匹配
    區分大小寫匹配(~)
    
    不區分大小寫匹配(~*)
    • 優先級(不要寫復雜,容易出問題和遺忘)

    精準匹配 > 字符串匹配(若有多個匹配項匹配成功,那么選擇匹配長的并記錄) > 正則匹配

    • 案例
    server { 
    ?
       server_name vincent.com;   
    ?
       location ~^/api/pub$ { 
          ...
        }
    ?
    }
    ?
    ^/api/pub$   這個正則表達式表示字符串必須以/開始,以b$結束,中間必須是/api/pub
    ?
    http://vincent.com/api/v1 匹配(完全匹配)
    ?
    http://vincent.com/API/PUB 不匹配,大小寫敏感
    ?
    http://vincent.com/api/pub?key1=value1 匹配
    ?
    http://vincent.com/api/pub/ 不匹配
    ?
    http://vincent.com/api/public 不匹配,不能匹配正則表達式
    • 測試
    location = /img/test.png {
       return 1;
    }
    ?
    location  /img/test.png {
       return 2;
    }
    ?
    location ^~/img/ {
       return 3;
    }
    ?
    location = / {
       return 4;
    }
    ?
    location / {
       return 5;
    }

     

    Nginx的rewrite規則和應用

    • rewrite 地址重定向,實現URL重定向的重要指令,他根據regex(正則表達式)來匹配內容跳轉到相應的頁面

    語法: rewrite regex replacement[flag]

    rewrite ^/(.*)  https://vincent.com/$1 permanent
    # 這是一個正則表達式,匹配完整的域名和后面的路徑地址
    # replacement部分是https://xdclass.net/$1,$1是取自regex部分()里的內容
    • 常用正則表達式
    字符描述
    ^匹配輸入字符串的起始位置
    $匹配輸入字符串的結束位置
    *匹配前面的字符零次或者多次
    +匹配前面字符串一次或者多次
    ?匹配前面字符串的零次或者一次
    .匹配除“\n”之外的所有單個字符
    (pattern)匹配括號內的pattern
    • rewrite 最后一項flag參數
    標記符號說明
    last本條規則匹配完成后繼續向下匹配新的location URI規則
    break本條規則匹配完成后終止,不在匹配任何規則
    redirect返回302臨時重定向
    permanent返回301永久重定向
    • 應用場景
    • 非法訪問跳轉,防盜鏈
    • 網站更換新域名
    • http跳轉https
    • 不同地址訪問同一個虛擬主機的資源

     

    Nginx 配置websocket反向代理

    • 配置
    server {
      listen    80;
      server_name vincent.com;
      location / {
       proxy_pass http://lbs;
       proxy_read_timeout 300s; //websocket空閑保持時長
       proxy_set_header Host $host;
       proxy_set_header X-Real-IP $remote_addr;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
       proxy_http_version 1.1;
       
       proxy_set_header Upgrade $http_upgrade;
       proxy_set_header Connection $connection_upgrade;
      } 
    }
    • 核心是下面的配置    其他和普通反向代理沒區別, 表示請求服務器升級協議為WebSocket
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $connection_upgrade;
    • 服務器處理完請求后,響應如下報文 # 狀態碼為101
    HTTP/1.1 101 Switching Protocols
    Upgrade: websocket
    Connection: upgrade

     

    Nginx的配置服務端緩存核心配置

    • 常見的開發人員控制的緩存分類
    • 數據庫緩存
    • 應用程序緩存
    • Nginx網關緩存
    • 前端緩存

    • 讓后端結果緩存離用戶更進一步

    /root/cache
        本地路徑,用來設置Nginx緩存資源的存放地址

    levels=1:2
        默認所有緩存文件都放在上面指定的根路徑中,可能影響緩存的性能,推薦指定為 2 級目錄來存儲緩存文件;1和2表示用1位和2位16進制來命名目錄名稱。第一級目錄用1位16進制命名,如a;第二級目錄用2位16進制命名,如3a。所以此例中一級目錄有16個,二級目錄有16*16=256個,總目錄數為16 * 256=4096個。
        當levels=1:1:1時,表示是三級目錄,且每級目錄數均為16個
        
    key_zone
        在共享內存中定義一塊存儲區域來存放緩存的 key 和 metadata

    max_size
        最大緩存空間, 如果不指定會使用掉所有磁盤空間。當達到 disk 上限后,會刪除最少使用的 cache

    inactive
        某個緩存在inactive指定的時間內如果不訪問,將會從緩存中刪除

    proxy_cache_valid
        配置nginx cache中的緩存文件的緩存時間,proxy_cache_valid 200 304 2m 對于狀態為200和304的緩存文件的緩存時間是2分鐘

    use_temp_path
        建議為 off,則 nginx 會將緩存文件直接寫入指定的 cache 文件中

    proxy_cache
        啟用proxy cache,并指定key_zone,如果proxy_cache off表示關閉掉緩存

    add_header Nging-Cache "$upstream_cache_status"
        用于前端判斷是否是緩存,miss、hit、expired(緩存過期)、updating(更新,使用舊的應答)

    proxy_cache_path /root/cache levels=1:2 keys_zone=vincent_cache:10m max_size=1g inactive=60m use_temp_path=off;
    ?
    server {
    ?
          location / {
            ...     
            proxy_cache vincent_cache;
            proxy_cache_valid 200 304 10m;
            proxy_cache_valid 404 1m; 
            proxy_cache_key $host$uri$is_args$args;
            add_header Nginx-Cache "$upstream_cache_status";
          }
      }
    • 還原nginx配置,只保留upstream模塊
    • 配置實操

    請求后端json接口,通過控制臺日志判斷是否有到后端服務

    注意

    • nginx緩存過期影響的優先級進行排序為:inactvie > 源服務器端Expires/max-age > proxy_cache_valid
    • 如果出現 Permission denied 修改nginx.conf,將第一行修改為 user root
    • 默認情況下GET請求及HEAD請求會被緩存,而POST請求不會被緩存,并非全部都要緩存,可以過濾部分路徑不用緩存
    • 緩存清空
    直接rm刪除
    ngx_cache_purge
    • 緩存命中率統計
    • 前端打點日志上報

    • nginx日志模板增加信息

      • $upstream_cache_status

     

    Nginx的壓縮配置和實操

    • 對文本、js和css文件等進行壓縮,一般是壓縮后的大小是原始大小的25%
    #開啟gzip,減少我們發送的數據量
    gzip on;
    gzip_min_length 1k;
    ?
    #4個單位為16k的內存作為壓縮結果流緩存
    gzip_buffers 4 16k;
    ?
    #gzip壓縮比,可在1~9中設置,1壓縮比最小,速度最快,9壓縮比最大,速度最慢,消耗CPU
    gzip_comp_level 4;
    ?
    #壓縮的類型
    gzip_types application/javascript text/plain text/css application/json application/xml    text/javascript; 
    ?
    #給代理服務器用的,有的瀏覽器支持壓縮,有的不支持,所以避免浪費不支持的也壓縮,所以根據客戶端的HTTP頭來判斷,是否需要壓縮
    gzip_vary on;
    ?
    #禁用IE6以下的gzip壓縮,IE某些版本對gzip的壓縮支持很不好
    gzip_disable "MSIE [1-6].";
    • 壓縮前后區別(上傳js文件進行驗證)
    location /static {
       alias /usr/local/software/static;
    }
    • 壓縮是時間換空間,還是空間換時間?
    • web層主要涉及瀏覽器和服務器的網絡交互,而網絡交互顯然是耗費時間的

    • 要盡量減少交互次數

    • 降低每次請求或響應數據量

    • 開啟壓縮

      • 在服務端是時間換空間的策略,服務端需要犧牲時間進行壓縮以減小響應數據大小
      • 壓縮后的內容可以獲得更快的網絡傳輸速度,時間是得到了優化
      • 所以是雙向的
    版權聲明:本文為vincent_wen0766原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/vincent_wen0766/article/details/108766976

    智能推薦

    Nginx的簡介

    Nginx介紹 Nginx是一款輕量級的Web 服務器/反向代理服務器及電子郵件(IMAP/POP3)代理服務器,在BSD-like 協議下發行。其特點是占有內存少,并發能力強,事實上nginx的并發能力在同類型的網頁服務器中表現較好,中國大陸使用nginx網站用戶有:百度、京東、新浪、網易、騰訊、淘寶等。 內存: 不到2M 并發能力強: 3-5萬次/秒 理想環境下 /tomcat服務器 150-...

    nginx簡介和使用

    Nginx 的代名詞就是 “高負載均衡服務器”。 官網地址:http://nginx.org/en/download.html 1 簡介 nginx (“engine x”) 是一個高性能的 HTTP 和 反向代理 服務器,也是一個 IMAP/POP3/SMTP 代理服務器。 Nginx 是由 Igor Sysoev 為俄羅斯訪問量第二的 Rambl...

    Nginx簡介---01

    反向代理機制 反向代理服務器位于用戶與目標服務器之間,但是對于用戶而言,反向代理服務器就相當于目標服務器,即用戶直接訪問反向代理服務器就可以獲得目標服務器的資源。同時,用戶不需要知道目標服務器的地址,也無須在用戶端作任何設定。反向代理服務器通常可用來作為Web加速,即使用反向代理作為Web服務器的前置機來降低網絡和服務器的負載,提高訪問效率。 概括: 1.位于用戶(客戶端)-服務器之間. 2.用戶...

    HTML中常用操作關于:頁面跳轉,空格

    1.頁面跳轉 2.空格的代替符...

    freemarker + ItextRender 根據模板生成PDF文件

    1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...

    猜你喜歡

    電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!

    Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...

    requests實現全自動PPT模板

    http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...

    Linux C系統編程-線程互斥鎖(四)

    互斥鎖 互斥鎖也是屬于線程之間處理同步互斥方式,有上鎖/解鎖兩種狀態。 互斥鎖函數接口 1)初始化互斥鎖 pthread_mutex_init() man 3 pthread_mutex_init (找不到的情況下首先 sudo apt-get install glibc-doc sudo apt-get install manpages-posix-dev) 動態初始化 int pthread_...

    統計學習方法 - 樸素貝葉斯

    引入問題:一機器在良好狀態生產合格產品幾率是 90%,在故障狀態生產合格產品幾率是 30%,機器良好的概率是 75%。若一日第一件產品是合格品,那么此日機器良好的概率是多少。 貝葉斯模型 生成模型與判別模型 判別模型,即要判斷這個東西到底是哪一類,也就是要求y,那就用給定的x去預測。 生成模型,是要生成一個模型,那就是誰根據什么生成了模型,誰就是類別y,根據的內容就是x 以上述例子,判斷一個生產出...

    精品国产乱码久久久久久蜜桃不卡