[TOC]
1 為什么叫反向代理衡奥?
關(guān)于反向代理和正向代理的概念,貼出知乎上面的一個(gè)回答,個(gè)人覺得還是很形象的蛾狗。
https://www.zhihu.com/question/24723688 。
正向代理座菠,被代理對(duì)象是客戶端狸眼,服務(wù)端不知道客戶端是誰(shuí),只知道代理對(duì)象.
反向代理浴滴,被代理對(duì)象是服務(wù)端拓萌,客戶端不知道服務(wù)端是誰(shuí),只知道代理對(duì)象
2 Nginx如何處理請(qǐng)求
2.1 基于域名的虛擬主機(jī)
server {
listen 80;
server_name example.org www.example.org;
...
}
server {
listen 80;
server_name example.net www.example.net;
...
}
server {
listen 80;
server_name example.com www.example.com;
...
}
如上面的配置升略,就是使用基于域名的配置微王,請(qǐng)求會(huì)對(duì)應(yīng)到對(duì)應(yīng)server_name的主機(jī)上面,如果沒有匹配的主機(jī)品嚣,這個(gè)時(shí)候nginx會(huì)默認(rèn)把第一當(dāng)做默認(rèn)處理主機(jī)炕倘,當(dāng)然也可以使用如下配置(default_server)指定默認(rèn)處理主機(jī):
server {
listen 80 default_server;
server_name example.net www.example.net;
...
}
2.2 基于域名和IP的虛擬主機(jī)
接下來(lái)看看不同主機(jī)listen on 不同的IP地址
server {
listen 192.168.1.1:80;
server_name example.org www.example.org;
...
}
server {
listen 192.168.1.1:80;
server_name example.net www.example.net;
...
}
server {
listen 192.168.1.2:80;
server_name example.com www.example.com;
...
}
對(duì)于這種情況,Nginx會(huì)先檢測(cè)IP和端口翰撑,再去檢測(cè)server_name是否匹配罩旋,如果IP匹配了,但是server_name 沒有匹配眶诈,就是使用當(dāng)前匹配的ip+port的default_server 瘸恼,如果沒有配置default_server就是默認(rèn)使用第一個(gè)作為default_server.
關(guān)于server_name的幾種形式
- 字符串或者IP地址
- 通配符,*
- 正則表達(dá)式
- 多個(gè)一起組合而成(上例中server_name每個(gè)配置了多個(gè)name)
- 一些特殊字符册养,例如: "","-","--"等
3 負(fù)載均衡(load balance)
3.1 負(fù)載均衡算法(Load balancing methods)
使用Nginx作為http負(fù)載均衡實(shí)現(xiàn)东帅。Nginx負(fù)載均衡算法有如下幾種:
- Round-Robin,輪詢調(diào)度算法球拦,當(dāng)配置未指明的時(shí)候靠闭,默認(rèn)就是輪詢算法
- least-connected,下一次鏈接將被鏈接到活躍鏈接最少的機(jī)器上
- ip-hash坎炼,利用IP地址哈希進(jìn)行分配
- weight-balancing愧膀,按照權(quán)重分配
需要說(shuō)明的是,很多時(shí)候谣光,weight-balancing都是和least-connected或者ip-hash算法一起使用檩淋,在官方文檔中,都沒有把他算做load balancing methods中的一種萄金。
3.2 常見配置示例
- 最常見的配置,默認(rèn)輪詢算法
http {
upstream myapp1 {
server srv1.example.com;
server srv2.example.com;
server srv3.example.com;
}
server {
listen 80;
location / {
proxy_pass http://myapp1;
}
}
}
- 使用least-connected
upstream myapp1 {
least_conn;
server srv1.example.com;
server srv2.example.com;
server srv3.example.com;
}
- 使用ip-hash算法
upstream myapp1 {
ip_hash;
server srv1.example.com;
server srv2.example.com;
server srv3.example.com;
}
- 權(quán)重分配
upstream myapp1 {
server srv1.example.com weight=3;
server srv2.example.com;
server srv3.example.com;
}
此種配置蟀悦,srv1占比3/5,srv2,srv3分別占比 1/5
4 關(guān)于健康檢查
簡(jiǎn)單的服務(wù)端示例健康檢查,使用server配置上面的fail_timeout配置氧敢,設(shè)置失敗時(shí)間日戈,在設(shè)置時(shí)間內(nèi)沒回應(yīng),Nginx就會(huì)用不斷的起嘗試孙乖,如果可行就標(biāo)記服務(wù)為live浙炼。如果客戶端返回錯(cuò)誤份氧,Nginx就會(huì)標(biāo)記這個(gè)節(jié)點(diǎn)為failed,然后避免轉(zhuǎn)發(fā)請(qǐng)求到這個(gè)節(jié)點(diǎn)弯屈。
關(guān)于健康監(jiān)測(cè)蜗帜,在后續(xù)總結(jié)中會(huì)有專門的分析使用。
5 ngx_http_upstream_module
更多時(shí)候我們配置都是這個(gè)模塊的一些配置资厉,下面簡(jiǎn)單總結(jié)下此模塊的配置說(shuō)明
先提供一個(gè)示例:
upstream backend {
server backend1.example.com weight=5;
server backend2.example.com:8080;
server unix:/tmp/backend3;
server backup1.example.com:8080 backup;
server backup2.example.com:8080 backup;
}
server {
location / {
proxy_pass http://backend;
}
}
http模塊中比較重要的幾個(gè)節(jié)點(diǎn)
upstream name {....}
在upstream中常見的節(jié)點(diǎn)有 server厅缺,ip_hash,keepalive酌住,least_conn,least_time
分別介紹下這幾個(gè)節(jié)點(diǎn)
5.1 upstream-->server
Syntax: server address [parameters];
Default: —
Context: upstream
server的上下文為upstream店归,后面server地址和配置參數(shù)阎抒,如:server 192.168.0.100 weight=10 max_fails=3 fail_timeout=5
分別介紹下可選的幾個(gè)參數(shù)的含義:
- weight=number: 之前說(shuō)過(guò)的酪我,配置主機(jī)的權(quán)重,配合負(fù)載均衡算法
- max_conns=number: 同時(shí)生效的鏈接數(shù)上線且叁,默認(rèn)為0都哭,表示不限制。如果server group不在共享內(nèi)存中逞带,則次值按每個(gè) worker process 來(lái)工作
- fail_timeout=number: 1.在指定時(shí)間內(nèi)超時(shí)欺矫,任務(wù)服務(wù)不可達(dá)時(shí)候嘗試超時(shí)時(shí)間。2.判斷服務(wù)不可用時(shí)間展氓。默認(rèn)時(shí)間為10s.
- max_fails=number:配合fail_timeout穆趴,做大的嘗試次數(shù),默認(rèn)值為1遇汞,設(shè)置為0表示不統(tǒng)計(jì)嘗試次數(shù)未妹。
- backup:設(shè)置當(dāng)前server 為備份機(jī)器,放主機(jī)器不可達(dá)的時(shí)候空入,請(qǐng)求會(huì)傳遞過(guò)來(lái)
- down:標(biāo)記當(dāng)前節(jié)點(diǎn)宕機(jī)
- resolve:指明解析的IP络它,要使用resolve ,需要先在http幾點(diǎn)下面配置resolver,例如:
http {
resolver 10.0.0.1;
upstream u {
zone ...;
...
server example.com resolve;
}
}
- route:設(shè)置服務(wù)路由名稱
- service:?jiǎn)⒂肈NS解析SRV歪赢,并設(shè)置service名稱
- slow_start:設(shè)置多久之后化戳,server回復(fù)自己的權(quán)重值,設(shè)置server從不可達(dá)到健康之后多久認(rèn)為是可用埋凯。次配置不能用在upstream 為 hash 或者ip_hash的算法中点楼。當(dāng)server Group 中只有一個(gè)server的時(shí)候,max_fails白对、 fail_timeout 盟步、slow_start都會(huì)被忽略。
5.2 upstream-->hash/ip_hash
hash key [consistent]; 使用key值來(lái)做hash負(fù)載均衡躏结,一旦添加個(gè)刪除機(jī)器却盘,需要重新做hash狰域,負(fù)載后的路徑可坑改變
ip_hash; 在upstream 中啟用按照IP進(jìn)行hash的分配策略
5.3 upstream-->keepalive
keepalive 激活服務(wù)器到upstream的緩存,設(shè)置上限的話黄橘,設(shè)置鏈接緩存的最大數(shù)量兆览,如果超出數(shù)量,最少使用的鏈接就會(huì)被關(guān)閉塞关。
例如:
upstream memcached_backend {
server 127.0.0.1:11211;
server 10.0.0.2:11211;
keepalive 32;
}
5.4 upstream-->least_conn/least_time
least_conn: 使用least_conn 的負(fù)載均衡方式,找到鏈接最少的機(jī)器處理抬探,并且結(jié)合權(quán)重來(lái)處理,如果有多臺(tái)候選機(jī)器的話帆赢,會(huì)接著使用輪詢的方式小压。
least_time: 找到平均響應(yīng)時(shí)間最少并且連接數(shù)最少的機(jī)器,并結(jié)合權(quán)重椰于,如何有多臺(tái)候選機(jī)器的話怠益,會(huì)接著使用輪詢的方式。