總結(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)靜分離的兩種方法:
- 動(dòng)靜資源各自使用一個(gè)域名
有跨域問題,可以通過給一個(gè) location /url 指向靜態(tài)服務(wù)器來解決 - 動(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)求限流(限制處理速度,可以處理峰值)
- 沒有加burst 和 nodelay 的情況:
依照 rate 的速度來處理請(qǐng)求,超過 rate 處理能力范圍的直接503。 - 加 burst 但不加 nodelay 的情況:
依照 rate 的速度來處理請(qǐng)求,超過了(burst + rate)處理能力的請(qǐng)求直接503直接503,在緩沖隊(duì)列中的請(qǐng)求會(huì)按照 rate 的速度慢慢處理。 - 同時(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ù)壓縮
}