nginx 使用總結(jié)

總結(jié)一下常用的 nginx 功能

常用的 nginx 功能

  • 靜態(tài)服務(wù)器
  • 根據(jù)域名分發(fā)路徑
  • 反向代理
  • 動(dòng)靜分離
  • 負(fù)載均衡
  • 跨域
  • 限流
  • 緩存
  • HTTP2.0
  • gzip
靜態(tài)服務(wù)器

nginx 基本功能,類似于 tomcat

根據(jù)域名分發(fā)路徑

通過添加更多的 server 配置項(xiàng)來實(shí)現(xiàn)

server {
    listen       80;
    server_name  www.baidu1.com;
    location / {
        root   html;
        index  index.html index.htm;
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   html;
    }
}
server {
    listen       80;
    server_name  www.google1.com;
    location / {
        root   html;
        index  index.html index.htm;
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   html;
    }
}
反向代理

客戶端將請(qǐng)求發(fā)送到反向代理服務(wù)器,由反向代理服務(wù)器去選擇目標(biāo)服務(wù)器
此時(shí)反向代理服務(wù)器和目標(biāo)服務(wù)器對(duì)外就是一個(gè)服務(wù)器

暴露的是代理服務(wù)器地址,隱藏了真實(shí)服務(wù)器IP地址,提高了服務(wù)器的安全性。

通過 location 的 proxy_pass 屬性實(shí)現(xiàn)

# 訪問 http://www.baidu.com,指向 http://127.0.0.1:8080
server {
    listen       80;
    server_name  www.baidu.com;

    location / {
        proxy_pass http://127.0.0.1:8080;
        index  index.html index.htm index.jsp;
    }
}
動(dòng)靜分離

靜態(tài)資源: html、js、css、圖片、音樂、視頻等等。
動(dòng)態(tài)資源: 接口、后端代碼。

實(shí)現(xiàn)動(dòng)靜分離的兩種方法:

  1. 動(dòng)靜資源各自使用一個(gè)域名
    有跨域問題,可以通過給一個(gè) location /url 指向靜態(tài)服務(wù)器來解決
  2. 動(dòng)靜資源同域名,通過 location /url 來區(qū)分
    無跨域問題,但是動(dòng)靜資源同服務(wù)器不利于整體應(yīng)用效率的提升,動(dòng)態(tài)資源偏執(zhí)行,靜態(tài)資源偏訪問
負(fù)載均衡

解決高并發(fā)的問題,將客戶端請(qǐng)求分配到不通的服務(wù)器上

upstram XXX: 表示負(fù)載均衡服務(wù)器,也是通常再說的上游服務(wù)器。

upstram server 狀態(tài):
1.down 表示單前的server暫時(shí)不參與負(fù)載
2.weight 默認(rèn)為1,weight越大,負(fù)載的權(quán)重就越大。
3.max_fails 允許請(qǐng)求失敗的次數(shù)默認(rèn)為1,當(dāng)超過最大次數(shù)時(shí),返回proxy_next_upstream 模塊定義的錯(cuò)誤
4.fail_timeout 請(qǐng)求失敗次數(shù)消耗完(max_fails)后,暫停的時(shí)間。
5.backup 其它所有的非backup機(jī)器down或者忙的時(shí)候,請(qǐng)求backup機(jī)器。所以這臺(tái)機(jī)器壓力會(huì)最輕。

nginx支持同時(shí)設(shè)置多組的負(fù)載均衡,用來給不用的server來使用

負(fù)載均衡算法:

  • 輪詢
  • 權(quán)重
  • ip綁定。
輪詢算法

默認(rèn)使用輪詢算法,按照 upstream 的順序從上往下,如果服務(wù)器 down
掉,能自動(dòng)剔除。
127.0.0.1:8083 -> 127.0.0.1:8082 -> 127.0.0.1:8081 -> 127.0.0.1:8083

# ****************輪詢算法*****************
upstream  loadBalance {
   server 127.0.0.1:8083;
   server 127.0.0.1:8082;
   server 127.0.0.1:8081;
}
server {
    listen       80;
    server_name  www.taobao.com;
    location / {
        proxy_pass  http://loadBalance;
        index  index.html index.htm;
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   html;
    }
}
權(quán)重算法

為服務(wù)器配置被訪問的比例,數(shù)字越大表示輪到的概率越大
8083、8082 、8081 被訪問的概率比為3:2:1

# ****************權(quán)重算法*****************
upstream  loadBalance {
   server 127.0.0.1:8083 weight=3;
   server 127.0.0.1:8082 weight=2;
   server 127.0.0.1:8081 weight=1;
}
server {
    listen       80;
    server_name  www.taobao.com;
    location / {
        proxy_pass  http://loadBalance;
        index  index.html index.htm;
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   html;
    }
}

PS:權(quán)重算法是指分配的概率,不代表6個(gè)請(qǐng)求中連續(xù)的3個(gè)都在8083
例如:[8083,8082,8081,8083,8083,8082]
因此輪詢算法 ≠ weight等于1的權(quán)重算法

# 下面兩者不等價(jià)
upstream  loadBalance {
   server 127.0.0.1:8083;
   server 127.0.0.1:8082;
   server 127.0.0.1:8081;
}
upstream  loadBalance {
   server 127.0.0.1:8083 weight=1;
   server 127.0.0.1:8082 weight=1;
   server 127.0.0.1:8081 weight=1;
}
IP算法

第一次訪問時(shí),nginx會(huì)將ip通過哈希算法,算出值,然后分配到一個(gè)服務(wù)器。
之后的每一次訪問都是去請(qǐng)求那個(gè)第一次訪問的服務(wù)器。(無session問題)

upstream  loadBalance {
   server 127.0.0.1:8082;
   server 127.0.0.1:8081;
   ip_hash;
}
server {
    listen       80;
    server_name  www.taobao.com;
    location / {
        proxy_pass  http://loadBalance;
        index  index.html index.htm;
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   html;
    }
}
跨域
http {
  add_header Access-Control-Allow-Origin *;
  add_header Access-Control-Allow-Headers X-Requested-With;
  add_header Access-Control-Allow-Methods GET,POST,OPTIONS;
}
限流

限流限制的是客戶端的IP請(qǐng)求的并發(fā)連接數(shù)和客戶端的IP每秒被允許的請(qǐng)求數(shù)。

  • 請(qǐng)求限流(漏桶、令牌桶)(ngx_http_limit_req_module)
  • 流量限制(ngx_stream_limit_conn_module)
  • 服務(wù)端限流(ngx_http_upstream_module)
請(qǐng)求限流(限制處理速度,可以處理峰值)
  1. 沒有加burst 和 nodelay 的情況:
    依照 rate 的速度來處理請(qǐng)求,超過 rate 處理能力范圍的直接503。
  2. 加 burst 但不加 nodelay 的情況:
    依照 rate 的速度來處理請(qǐng)求,超過了(burst + rate)處理能力的請(qǐng)求直接503直接503,在緩沖隊(duì)列中的請(qǐng)求會(huì)按照 rate 的速度慢慢處理。
  3. 同時(shí)加 burst 和 nodelay 的情況:
    可以爆發(fā)出一個(gè)峰值處理能力(burst + rate),對(duì)于峰值處理數(shù)量之外的請(qǐng)求直接503。在完成峰值請(qǐng)求之后,緩沖隊(duì)列不能再放入請(qǐng)求。如果rate=10r/m,且這段時(shí)間內(nèi)沒有請(qǐng)求再到來,則每6 s 緩沖隊(duì)列就能回復(fù)一個(gè)緩沖請(qǐng)求的能力,直到回復(fù)到能緩沖 burst 個(gè)請(qǐng)求為止。
# $binary_remote_addr 客戶端請(qǐng)求的IP地址;
# mylimit 自定義的緩存區(qū)變量名,后跟緩存區(qū)大??;
# rate 請(qǐng)求頻率,每秒允許多少請(qǐng)求;
# limit_req 與 limit_req_zone 對(duì)應(yīng)
# burst 被緩存的請(qǐng)求數(shù)
# nodelay 不延遲處理
http {
    limit_req_zone $binary_remote_addr zone=mylimit:10m rate=1r/s;
    server {
        listen  70;
        location / {
            # 同一個(gè) IP 每秒只能發(fā)送一次請(qǐng)求(1r/s),這里配置了緩存3個(gè)請(qǐng)求,即一秒內(nèi)最多 4 個(gè)請(qǐng)求響應(yīng)成功,其它請(qǐng)求則返回503錯(cuò)誤
            limit_req zone=mylimit burst=3 nodelay;
            proxy_pass http://localhost:7070;
        }
    }
}
流量限制(限制并發(fā)連接數(shù)和處理速度)
# $binary_remote_addr 客戶端請(qǐng)求的IP地址;
# myconn 自定義的緩存區(qū)變量名,后跟緩存區(qū)大?。?# limit_rate 限制傳輸速度
# limit_conn 與 limit_conn_zone 對(duì)應(yīng),限制網(wǎng)絡(luò)連接數(shù)
http {
    limit_conn_zone $binary_remote_addr zone=myconn:10m;
    server {
        listen  70;
        location / {
            # 每個(gè) IP 只允許一個(gè)連接
            limit_conn myconn 1;
            # 限制傳輸速度(如果有N個(gè)并發(fā)連接,則是 N * limit_rate)
            limit_rate 1024k;
            proxy_pass http://localhost:7070;
        }
    }
}
服務(wù)端限流
upstream loadBalance {
    server 127.0.0.1:8080 max_conns=10;
    server 127.0.0.1:8081 max_conns=10;
}
緩存
HTTP2.0
gzip
http {
    gzip on;            #開啟gzip功能
    gzip_min_length  1024;      #響應(yīng)頁面數(shù)據(jù)上限
    gzip_buffers     4 16k;         #緩存空間大小
    gzip_http_version 1.1;      #http協(xié)議版本
    gzip_comp_level  4;         #壓縮級(jí)別4
    gzip_types       text/plain application/x-javascript text/css application/xml text/javascript;
    gzip_vary on;       #啟用壓縮標(biāo)識(shí)
    gzip_static on;     #開啟文件預(yù)壓縮
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容