代理
buffer 寫(xiě)緩存
cache 讀緩存
反向代理
訪問(wèn)代理服務(wù)器時(shí)會(huì)返回webserver的內(nèi)容
在app.conf中
server {
listen 192.168.122.101:80;
server_name www.app1.com;
root /usr/share/nginx/app1;
access_log /var/log/www.app1.com.log main;
error_log /var/log/www.app1.com.error.log;
set_real_ip_from 192.168.122.105; #誰(shuí)代理了我
location / {
index index.html;
}
}
在proxy.conf中
server {
listen 192.168.122.105:80;
server_name proxy3;
root /usr/share/nginx/proxy3;
access_log /var/log/proxy3.log main;
error_log /var/log/proxy3.error.log;
location / {
proxy_pass http://192.168.122.101:80; #我代理了誰(shuí)
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-NginX-Proxy true;
proxy_connect_timeout 30;
proxy_send_timeout 60;
proxy_read_timeout 60;
proxy_buffering on;
proxy_buffer_size 32k;
proxy_buffers 4 128k;
proxy_busy_buffers_size 256k;
proxy_max_temp_file_size 256k;
}
}
在app.conf的日志中
10.0.122.109 - - [09/Oct/2019:12:09:18 +0800] "GET / HTTP/1.0" 304 0 "-" "Mozilla/5.0 (X11; Linux x86_64)
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36" "10.0.122.188, 10.0.122.109"
第一個(gè)ip地址為客戶端的ip,后面的ip為經(jīng)過(guò)的ip,因此,后邊的ip是不會(huì)出現(xiàn)webserver緊臨的代理服務(wù)器的ip
雙層代理:另一個(gè)服務(wù)器代理了代理服務(wù)器,配置與服務(wù)器代理相同
負(fù)載均衡
基于7層模型的負(fù)載均衡
#在proxy.conf中(反向代理的主機(jī)同時(shí)負(fù)責(zé)負(fù)載均衡)
upstream myapp{
server 192.168.122.101 weight=1; (加權(quán)輪詢,權(quán)重越大,
server 192.168.122.102 weight=1; 被分配的請(qǐng)求越多)
server 192.168.122.103 weight=2;
server 192.168.122.104 backup; (熱備,當(dāng)其他的機(jī)器宕掉才會(huì)使用)
}
server {
listen 192.168.122.105:80;
server_name proxy1;
root /usr/share/nginx/proxy1;
access_log /var/log/proxy1.log main;
error_log /var/log/proxy1.error.log;
location / {
proxy_pass http://myapp;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-NginX-Proxy true;
proxy_connect_timeout 30;
proxy_send_timeout 60;
proxy_read_timeout 60;
proxy_buffering on;
proxy_buffer_size 32k;
proxy_buffers 4 128k;
proxy_busy_buffers_size 256k;
proxy_max_temp_file_size 256k;
}
}
webserver是正常配置
upstream 支持4種負(fù)載均衡調(diào)度算法:
A、輪詢(默認(rèn)):每個(gè)請(qǐng)求按時(shí)間順序逐一分配到不同的后端服務(wù)器; 加權(quán)論詢
B、ip_hash:每個(gè)請(qǐng)求按訪問(wèn)IP的hash結(jié)果分配,同一個(gè)IP客戶端固定訪問(wèn)一個(gè)后端服務(wù)器。可以保證來(lái)自同一ip的請(qǐng)求被打到固定的機(jī)器上,可以解決session問(wèn)題。
C、url_hash 按訪問(wèn)url的hash結(jié)果來(lái)分配請(qǐng)求,使每個(gè)url 定向到同一個(gè)后端服務(wù)器。后臺(tái)服務(wù)器為緩存的時(shí)候效率。
D、fair:這是比上面兩個(gè)更加智能的負(fù)載均衡算法。此種算法可以依據(jù)頁(yè)面大小和加載時(shí)間長(zhǎng)短智能地進(jìn)行負(fù)載均衡,也就是根據(jù)后端服務(wù)器的響應(yīng)時(shí)間來(lái)分配請(qǐng)求,響應(yīng)時(shí)間短的優(yōu)先分配。Nginx本身是不支持 fair的,如果需要使用這種調(diào)度算法,必須下載Nginx的 upstream_fair模塊。
nginx負(fù)載均衡配置狀態(tài)參數(shù):
down,表示當(dāng)前的server暫時(shí)不參與負(fù)載均衡。
backup,預(yù)留的備份機(jī)器。當(dāng)其他所有的非backup機(jī)器出現(xiàn)故障或者忙的時(shí)候,才會(huì)請(qǐng)求backup機(jī)器,因此這臺(tái)機(jī)器的壓力最輕。
max_fails,允許請(qǐng)求失敗的次數(shù),默認(rèn)為1。當(dāng)超過(guò)最大次數(shù)時(shí),返回 proxy_next_upstream 模塊定義的錯(cuò)誤。
fail_timeout,在經(jīng)歷了max_fails次失敗后,暫停服務(wù)的時(shí)間。max_fails 可以和 fail_timeout一起使用。
ip_hash 簡(jiǎn)單易用,但有如下問(wèn)題:
當(dāng)后端服務(wù)器宕機(jī)后,session會(huì)丟失;
來(lái)自同一局域網(wǎng)的客戶端
會(huì)被轉(zhuǎn)發(fā)到同一個(gè)后端服務(wù)器,可能導(dǎo)致負(fù)載失衡;
不適用于CDN網(wǎng)絡(luò),不適用于前段還有代理的情況(這樣來(lái)源ip只會(huì)是外層代理服務(wù)器的ip因此會(huì)無(wú)法負(fù)載)。
基于四層的負(fù)載均衡
在nginx.conf中,與http平級(jí)
stream {
upstream mytest1 {
server 192.168.152.100:80;
server 192.168.152.101:80;
}
server {
listen 192.168.152.192:80;
proxy_connect_timeout 10s;
proxy_timeout 30s;
proxy_pass mytest1;
}
upstream mytest2 {
server 192.168.152.102:80;
server 192.168.152.103:80;
}
server {
listen 192.168.152.192:8080;
proxy_connect_timeout 10s;
proxy_timeout 30s;
proxy_pass mytest2;
}
}
nginx 會(huì)話保持:
1、ip_hash
使用源地址哈希算法,將同一客戶端的請(qǐng)求總是發(fā)往同一個(gè)后端服務(wù)器,除非該服務(wù)器不可用。
2、sticky_cookie_insert
使用 sticky_cookie_insert 啟用會(huì)話親緣關(guān)系,這會(huì)導(dǎo)致來(lái)自同一客戶端的請(qǐng)求被傳遞到一組服務(wù)器的同一臺(tái)服務(wù)器。
與ip_hash不同之處在于,它不是基于IP來(lái)判斷客戶端的,而是基于cookie 來(lái)判斷。
因此可以避免上述 ip_hash 中來(lái)自同一局域網(wǎng)的客戶端和前端代理導(dǎo)致負(fù)載失衡的情況
3、jvm_route 方式
jvm_route是通過(guò) session_cookie 這種方式來(lái)實(shí)現(xiàn) session 粘性。將特定會(huì)話附屬到特定 tomcat 上,
從而解決 session 不同步問(wèn)題,但是無(wú)法解決宕機(jī)后會(huì)話轉(zhuǎn)移問(wèn)題。如果在 cookie 和 url 中并沒(méi)有 session,
則這只是個(gè)簡(jiǎn)單的 round robin (輪巡) 負(fù)載均衡。
jvm_route的原理
一開(kāi)始請(qǐng)求過(guò)來(lái),沒(méi)有帶 session 的信息,jvm_route 就根據(jù) round robin (輪巡)的方法,發(fā)到一臺(tái) Tomcat 上面
Tomcat 添加上 session 信息,并返回給客戶
用戶再次請(qǐng)求,jvm_route 看到 session 中有后端服務(wù)器的名稱,他就把請(qǐng)求轉(zhuǎn)到對(duì)應(yīng)的服務(wù)器上
對(duì)于某個(gè)特定用戶,當(dāng)一直為他服務(wù)的 Tomcat 宕機(jī)后,默認(rèn)情況下它會(huì)重試max_fails 的次數(shù),
如果還是失敗,就重新啟用 round robin 的方式,而這種情況下就會(huì)導(dǎo)致用戶的 session 丟失。
4、使用后端服務(wù)器自身通過(guò)相關(guān)機(jī)制保持 session 同步,如:使用數(shù)據(jù)庫(kù) redis、memcached 等做 session 復(fù)制
http常見(jiàn)狀態(tài)碼
1xx(臨時(shí)響應(yīng))
100 (繼續(xù)) 請(qǐng)求者應(yīng)當(dāng)繼續(xù)提出請(qǐng)求。 服務(wù)器返回此代碼表示已收到請(qǐng)求的第一部分,正在等待其余部分。
101 (切換協(xié)議) 請(qǐng)求者已要求服務(wù)器切換協(xié)議,服務(wù)器已確認(rèn)并準(zhǔn)備切換。
2xx(成功)
200 (成功) 服務(wù)器已成功處理了請(qǐng)求。 通常,這表示服務(wù)器提供了請(qǐng)求的網(wǎng)頁(yè)。
201 (已創(chuàng)建) 請(qǐng)求成功并且服務(wù)器創(chuàng)建了新的資源。
202 (已接受) 服務(wù)器已接受請(qǐng)求,但尚未處理。
203 (非授權(quán)信息) 服務(wù)器已成功處理了請(qǐng)求,但返回的信息可能來(lái)自另一來(lái)源。
204 (無(wú)內(nèi)容) 服務(wù)器成功處理了請(qǐng)求,但沒(méi)有返回任何內(nèi)容。
205 (重置內(nèi)容) 服務(wù)器成功處理了請(qǐng)求,但沒(méi)有返回任何內(nèi)容。
206 (部分內(nèi)容) 服務(wù)器成功處理了部分 GET 請(qǐng)求
3xx(重定向)
300 (多種選擇) 針對(duì)請(qǐng)求,服務(wù)器可執(zhí)行多種操作。 服務(wù)器可根據(jù)請(qǐng)求者 (user agent) 選擇一項(xiàng)操作,或提供操作列表供請(qǐng)求者選擇。
301 (永久移動(dòng)) 請(qǐng)求的網(wǎng)頁(yè)已永久移動(dòng)到新位置。 服務(wù)器返回此響應(yīng)(對(duì) GET 或 HEAD 請(qǐng)求的響應(yīng))時(shí),會(huì)自動(dòng)將請(qǐng)求者轉(zhuǎn)到新位置。
302 (臨時(shí)移動(dòng)) 服務(wù)器目前從不同位置的網(wǎng)頁(yè)響應(yīng)請(qǐng)求,但請(qǐng)求者應(yīng)繼續(xù)使用原有位置來(lái)進(jìn)行以后的請(qǐng)求。
303 (查看其他位置) 請(qǐng)求者應(yīng)當(dāng)對(duì)不同的位置使用單獨(dú)的 GET 請(qǐng)求來(lái)檢索響應(yīng)時(shí),服務(wù)器返回此代碼。
304 (未修改) 自從上次請(qǐng)求后,請(qǐng)求的網(wǎng)頁(yè)未修改過(guò)。 服務(wù)器返回此響應(yīng)時(shí),不會(huì)返回網(wǎng)頁(yè)內(nèi)容。
305 (使用代理) 請(qǐng)求者只能使用代理訪問(wèn)請(qǐng)求的網(wǎng)頁(yè)。 如果服務(wù)器返回此響應(yīng),還表示請(qǐng)求者應(yīng)使用代理。
307 (臨時(shí)重定向) 服務(wù)器目前從不同位置的網(wǎng)頁(yè)響應(yīng)請(qǐng)求,但請(qǐng)求者應(yīng)繼續(xù)使用原有位置來(lái)進(jìn)行以后的請(qǐng)求
4xx(請(qǐng)求錯(cuò)誤)
400 (錯(cuò)誤請(qǐng)求) 服務(wù)器不理解請(qǐng)求的語(yǔ)法。
401 (未授權(quán)) 請(qǐng)求要求身份驗(yàn)證。 對(duì)于需要登錄的網(wǎng)頁(yè),服務(wù)器可能返回此響應(yīng)。
403 (禁止) 服務(wù)器拒絕請(qǐng)求。
404 (未找到) 服務(wù)器找不到請(qǐng)求的網(wǎng)頁(yè)。
405 (方法禁用) 禁用請(qǐng)求中指定的方法。
5xx(服務(wù)器錯(cuò)誤)
500 (服務(wù)器內(nèi)部錯(cuò)誤) 服務(wù)器遇到錯(cuò)誤,無(wú)法完成請(qǐng)求。
501 (尚未實(shí)施) 服務(wù)器不具備完成請(qǐng)求的功能。 例如,服務(wù)器無(wú)法識(shí)別請(qǐng)求方法時(shí)可能會(huì)返回此代碼。
502 (錯(cuò)誤網(wǎng)關(guān)) 服務(wù)器作為網(wǎng)關(guān)或代理,從上游服務(wù)器收到無(wú)效響應(yīng)。
503 (服務(wù)不可用) 服務(wù)器目前無(wú)法使用(由于超載或停機(jī)維護(hù))。 通常,這只是暫時(shí)狀態(tài)。
504 (網(wǎng)關(guān)超時(shí)) 服務(wù)器作為網(wǎng)關(guān)或代理,但是沒(méi)有及時(shí)從上游服務(wù)器收到請(qǐng)求。
505 (HTTP 版本不受支持) 服務(wù)器不支持請(qǐng)求中所用的 HTTP 協(xié)議版本
計(jì)算機(jī)常見(jiàn)端口
HTTP:80:www服務(wù)
DHCP:服務(wù)器端的端口號(hào)是67,客戶機(jī)端的端口號(hào)是68
POP3:POP3僅僅是接收協(xié)議,POP3客戶端使用SMTP向服務(wù)器發(fā)送郵件。端口號(hào)是110。
SMTP:端口號(hào)是25。
Telnet:端口號(hào)是23?!半娦啪W(wǎng)絡(luò)協(xié)議(Telecommunication Network Protocol)”
FTP:20端口用于數(shù)據(jù)傳輸,21端口用于控制信令的傳輸,F(xiàn)TP采用的是TCP連接。
TFTP:端口號(hào)69,使用的是UDP的連接。
DNS:53,名稱服務(wù)
SNMP(簡(jiǎn)單網(wǎng)絡(luò)管理協(xié)議):161端口
HTTPS:端口號(hào)是443
遠(yuǎn)程桌面 :3389端口