簡介
Nginx是一款輕量級的web服務(wù)器秦踪、反向代理服務(wù)器芍殖。
Nginx的Master-Worker模式
Nginx啟動后其實就是在80端口啟動了socket服務(wù)進行監(jiān)聽不傅。
Master負責讀取并按照配置文件宝冕、管理一個或多個Worker姓言。
每一個Worker進程的維護一個線程寻狂,處理連接和請求岁经;其中Worker進程個數(shù)由配置文件決定
,一般和CPU個數(shù)相關(guān)蛇券。
思考:Nginx掛了怎么辦缀壤?
Keepalived+Nginx實現(xiàn)高可用。
第一:請求不要直接打到Nginx上纠亚,應(yīng)該先通過Keepalived(這就是所謂虛擬IP塘慕,VIP)
第二:Keepalived應(yīng)該能監(jiān)控Nginx的生命狀態(tài)(提供一個用戶自定義的腳本,定期檢查Nginx進程狀態(tài)蒂胞,進行權(quán)重變化,图呢,從而實現(xiàn)Nginx故障切換)
動靜分離
靜態(tài)文件放在Nginx,
反向代理和正向代理
例子:使用vpn代理訪問外網(wǎng)骗随。叫村里的小盆友幫忙買辣條蛤织,在這里小盆友就充當代理,商店就充當服務(wù)端鸿染,而“你”充當客戶端指蚜。
反向代理:
總結(jié):
正向代理:代理的是客戶端;這個時候服務(wù)端是不知道真正的客戶端牡昆。
反向代理:代理的是服務(wù)端姚炕;這個時候客戶端是不知道真正的服務(wù)端。
反向代理demo
#啟動進程,通常設(shè)置成和cpu的數(shù)量相等
worker_processes 1;
events {
#單個后臺worker process進程的最大并發(fā)鏈接數(shù)
worker_connections 1024;
# 并發(fā)總數(shù)是 worker_processes 和 worker_connections 的乘積
}
http {
#設(shè)定mime類型,類型由mime.type文件定義
include mime.types;
default_type application/octet-stream;
#sendfile 指令指定 nginx 是否調(diào)用 sendfile 函數(shù)(zero copy 方式)來輸出文件丢烘,
#對于普通應(yīng)用柱宦,必須設(shè)為 on,
#如果用來進行下載等應(yīng)用磁盤IO重負載應(yīng)用,可設(shè)置為 off播瞳,
sendfile on;
#連接超時時間
keepalive_timeout 65;
server {
listen 80;
server_name 127.0.0.01;
location / { #location / 表示處理所有請求
proxy_pass http://192.168.20.1:8080; #代理的服務(wù)端
}
# 定義錯誤提示頁面
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
負載均衡
Nginx支持4種負載均衡算法:
1.輪詢算法:
默認情況下掸刊,nginx使用輪詢算法根據(jù)權(quán)重分發(fā)請求到相應(yīng)的服務(wù)器,可以通過server指令的weight參數(shù)指定權(quán)重赢乓,默認權(quán)重為1
upstream balanceServer{
server localhost:8080 weight=1 max_fails=2 fail_timeout=30s;
server localhost:8888 weight=2 max_fails=2 fail_timeout=30s;
# 即在 30s 內(nèi)嘗試 2 次失敗即認為主機不可用
}
# weight表示權(quán)重忧侧,值越大,被分配到的幾率越大牌芋。
#可以為每個 backserver 指定最大的重試次數(shù)蚓炬,
#和重試時間間隔,所使用的關(guān)鍵字是 max_fails 和 fail_timeout。
# 代理
location / {
proxy_pass http://balanceServer;
}
2.ip_hash:
每個請求按訪問IP的hash結(jié)果分配躺屁,同一個IP客戶端固定訪問一個后端服務(wù)器肯夏。可以保證來自同一ip的請求被打到固定的機器上犀暑,可以解決session問題驯击。
upstream ipServer {
server 10.3.134.99;
server 10.3.134.111;
ip_hash;
}
location / {
proxy_pass http://ipServer ;
}
3.url_hash:
按訪問url的hash結(jié)果來分配請求,使每個url定向到同一個后端服務(wù)器耐亏。
upstream backend {
server squid1:3128;
server squid2:3128;
hash $request_uri;
hash_method crc32;
}
4.fair:
這是比上面兩個更加智能的負載均衡算法徊都。此種算法可以依據(jù)頁面大小和加載時間長短智能地進行負載均衡,也就是根據(jù)后端服務(wù)器的響應(yīng)時間來分配請求广辰,響應(yīng)時間短的優(yōu)先分配暇矫。Nginx本身是不支持 fair的,如果需要使用這種調(diào)度算法择吊,必須下載Nginx的 upstream_fair模塊
upstream ipServer {
server 10.3.134.99;
server 10.3.134.111;
fair;
}
思考:Nginx如何做到高并發(fā)下的高效處理袱耽?
Nginx采用了Linux的epoll模型,epoll模型基于事件驅(qū)動機制干发,它可以監(jiān)控多個事件是否準備完畢朱巨,如果OK,那么放入epoll隊列中枉长,這個過程是異步的冀续。worker只需要從epoll隊列循環(huán)處理即可。