一:反向代理:
1:正向代理與反向代理簡介:
正向代理代理客戶端,反向代理代理服務(wù)器。
簡單來說 ,代理就是隱藏自己的真實位置,由其他代理來訪問。
既然都這樣,為什么分正反呢,區(qū)別在于,正向在于主動,有目的性的指向哪里,而反向在于被動方,無法知道來訪問的真正客戶端是誰。
打個比方:雙方買賣雙方,買家(用戶客戶端)指定去某某商店(某網(wǎng)站),買家可以自己去,也可以叫別人(正向代理)去。到達(dá)賣家商店(網(wǎng)站域名)時,肯定可以看到一個收銀的人(服務(wù)器IP),這時,真正的老板也不知道來的具體是哪個人(用戶客戶端真實IP或者是代理IP),為了安全,所以老板(web服務(wù)器)就請一個收銀員(nginx代理)假裝老板坐那里,不管誰來,都找不著真正的老板(web服務(wù)器),拿貨時,只有收銀員(nginx)去后面(反向代理)找老板(web)拿貨給買家。交易完成,誰也沒見到誰,各自安好……
如下圖:用戶通過正向代理,原本IP106.52.xxx.xx,通過67.229.xxx.xx這個代理去訪問。用戶訪問到看到的只是172.16.2.50這個代理服務(wù)器,代理服務(wù)器里面沒東西,只有反向代理到web服務(wù)器拿出數(shù)據(jù)給用戶。用戶只能訪問看到的只有172.16.2.50這個IP,無法知曉真實的web服務(wù)器IP。
2:nginx反向代理作用:
主要兩種模式:
- 1:安全 ,保護(hù)了真實的web服務(wù)器,web服務(wù)器對外不可見,外網(wǎng)只能看到反向代理服務(wù)器,而反向代理服務(wù)器上并沒有真實數(shù)據(jù),因此,保證了web服務(wù)器的資源安全。
- 2:負(fù)載均衡 ,web服務(wù)器往往不是一個單獨服務(wù)器,是一個集群,所以需要負(fù)載均衡來分擔(dān)每臺服務(wù)器壓力,增加效率及利用率。
3:nginx反向代理服務(wù)器搭建:
搭建環(huán)境:兩臺(或多臺web)機(jī)器Linux(centos7)
nginx代理服務(wù)器,內(nèi)網(wǎng)IP:172.168.2.50 (已安裝nginx)
外網(wǎng)ip:192.168.200.150 (這里只用到外網(wǎng)IP訪問即可)
web1服務(wù)器,ip:172.168.2.20(已安裝php,nginx)
web2服務(wù)器,ip:172.168.2.21(已安裝php,nginx)(可選)
目標(biāo):用戶訪問nginx服務(wù)器IP時,返回的數(shù)據(jù)是web的數(shù)據(jù)。
nginx安裝參考:yum安裝nginx最新版
web服務(wù)搭建參考:Linux手動搭建LNMP
3.1):在Nginx反向代理服務(wù)器中更改配置文件
vim /etc/nginx/nginx.conf
主要配置是upstream 選項以及在location加上 proxy_pass參數(shù)兩部分;
upstream 為真實web服務(wù)器IP,proxy_pass里面則為nginx代理服務(wù)器IP。
注:upstream位置應(yīng)該放在http模塊里面 但必須是在server模塊的外面。server模塊也在http模塊中。
本人web1訪問端口已改為9091,web2訪問端口已改為9092。所以加上配置如下:
upstream phpserver1 {
server 172.16.2.20:9091;
}
upstream phpserver2 {
server 172.16.2.21:9092;
}
server {
listen 80;
server_name 192.168.200.150;
location / {
proxy_pass http://phpserver1;
index index.html index.htm;
}
}
server {
listen 8080;
server_name 192.168.200.150;
location / {
proxy_pass http://phpserver2;
index index.html index.htm;
}
}
upstream:反向代理的關(guān)鍵字,后面名稱可自取,但要玩后面proxy_pass后面名稱一致。
server: 后臺真實的服務(wù)器地址,可以是IP或者FQDN(如果是FQDN,別忘記解析)。
listen:監(jiān)聽的端口,如果沒有把原來nginx做web服務(wù)器的配置內(nèi)容注銷掉,建議改為其他端口。
proxy_pass:后面名稱,此一定要和upstream后面(服務(wù)器組名稱)的名稱保持一致。
3.2):在web服務(wù)器中,更改站點測試首頁。
確保已正確搭建好web服務(wù)器,如本人站點目錄為/www。在站點創(chuàng)建測試首頁區(qū)分web服務(wù)器。
vim /www/index.php
web1輸入簡單測試頁面,web2同理改文字 這是172.16.2.21 web2服務(wù)器 即可。
<html>
<head>
<title>PHP 測試</title>
</head>
<body>
<?php echo '<p>這是172.16.2.20 web1服務(wù)器</p>'; ?>
</body>
</html>
3.3):在瀏覽器輸入nginx代理服務(wù)器的地址測試
第一次測試輸入192.168.200.150,不加端口,默認(rèn)80.
測試成功,代理服務(wù)器已獲取web1的數(shù)據(jù)。
第二次測試輸入192.168.200.150:8080。
測試成功,代理服務(wù)器已獲取web2服務(wù)器的數(shù)據(jù)。
以上就是代理服務(wù)器的簡單設(shè)置。
二:負(fù)載均衡:
負(fù)載均衡之前,需要先了解反向代理,了解后就可以這樣理解負(fù)載均衡了:將多臺服務(wù)器寫在一個 upstream 模塊中,根據(jù)相關(guān)參數(shù)策略,依次反向代理個多臺服務(wù)器,實現(xiàn)負(fù)載均衡。
防止服務(wù)器斷開連接或者服務(wù)器宕機(jī)、某一臺服務(wù)器過載壓力大。
官網(wǎng)負(fù)載均衡配置說明:
http://nginx.org/en/docs/http/load_balancing.html
根據(jù)參考文檔,官方提供了三個內(nèi)置策略:
1:round-robin(輪詢):
默認(rèn)策略,將請求依次分配給每個服務(wù)器。
配置如下:
http {
upstream phpserver1 {
server 171.16.2.20;
server 171.16.2.21;
server 171.16.2.22;
}
server {
listen 80;
location / {
proxy_pass http://phpserver1;
}
}
}
假如有10個請求,則:
這種策略常常和加權(quán)輪詢(weight)一起使用(生活中服務(wù)器配置有優(yōu)劣的情況采用):
upstream phpserver1 {
server 171.16.2.20 weight=3; # 3/6次
server 171.16.2.21 weight=2; # 2/6次
server 171.16.2.22 weight=1; # 1/6次
}
10個請求,則:
2:least-connected (最少連接):
由于請求時間長短的關(guān)系,有些服務(wù)器處理快,有些服務(wù)器處理慢,導(dǎo)致有些服務(wù)器連接一直存在。則將新來的請求分配給連接最少的那臺服務(wù)器:
upstream phpserver1 {
least_conn;
server 171.16.2.21;
server 171.16.2.22;
server 171.16.2.23;
}
3:ip-hash(ip-hash算法):
根據(jù)用戶訪問的IP來分配服務(wù)器,每臺服務(wù)器只處理某一條IP的請求:
upstream phpserver1 {
ip_hash;
server 171.16.2.21;
server 171.16.2.22;
server 171.16.2.23;
}
三個IP,無論每個IP多少請求:
4:擴(kuò)展策略:
如加權(quán)輪詢的參數(shù) weight 也屬于一種擴(kuò)展策略:
可參考官方upstream_module文檔:
http://nginx.org/en/docs/http/ngx_http_upstream_module.html#server
常見參數(shù):
- down,表示當(dāng)前的server暫時不參與負(fù)載均衡。
- backup,預(yù)留的備份機(jī)器。當(dāng)其他所有的非backup機(jī)器出現(xiàn)故障或者忙的時候,才會請求backup機(jī)器,因此這臺機(jī)器的壓力最輕。
- max_fails,允許請求失敗的次數(shù),默認(rèn)為1。當(dāng)超過最大次數(shù)時,返回proxy_next_upstream 模塊定義的錯誤。
- fail_timeout,在經(jīng)歷了max_fails次失敗后,暫停服務(wù)的時間。max_fails可以和fail_timeout一起使用。
- slow_start,當(dāng)一臺有問題服務(wù)器恢復(fù)正常使用時,或由不可用恢復(fù)可用狀態(tài),服務(wù)器權(quán)重從0恢復(fù)到正常值的時間。默認(rèn)值為0,默認(rèn)禁止。注:該參數(shù)不能與 hash 、 ip_hash 和 random 參數(shù)一起使用。
配合內(nèi)置策略使用舉例:
upstream phpserver1 {
server 171.16.2.20 weight=5;
#權(quán)重最高,處理請求最多
server 171.16.2.21:8080 fail_timeout=5s slow_start=30s;
#暫停5秒服務(wù),30秒后啟動服務(wù)
server 171.16.2.22 max_fails=3;
#失敗連接最大數(shù)為3,失敗后返回proxy_next_upstream
server 171.16.2.23 down;
#不啟用負(fù)載均衡策略
server 171.16.2.24:8080 backup;
#其他所有服務(wù)器宕機(jī)后,啟動的備份服務(wù)器
}
server {
location / {
proxy_pass http://phpserver1;
health_check;
}
}
4:代理配置的部分配置文件說明(僅供參考):
更多詳見http_proxy_module模塊官方文檔:
https://nginx.org/en/docs/http/ngx_http_proxy_module.html
參數(shù) : 解釋
- include mime.types; #文件擴(kuò)展名與文件類型映射表
- default_type Application/octet-stream; #默認(rèn)文件類型,默認(rèn)為text/plain
- access_log off; #取消服務(wù)日志
- log_format myFormat ' $remote_addr–$remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for'; #自定義格式
- access_log log/access.log myFormat; #combined為日志格式的默認(rèn)值
- sendfile on; #允許sendfile方式傳輸文件,默認(rèn)為off,可以在http塊,server塊,location塊。
- sendfile_max_chunk 100k; #每個進(jìn)程每次調(diào)用傳輸數(shù)量不能大于設(shè)定的值,默認(rèn)為0,即不設(shè)上限。
- keepalive_timeout 65; #連接超時時間,默認(rèn)為75s,可以在http,server,location塊。
- proxy_connect_timeout 1; #nginx服務(wù)器與被代理的服務(wù)器建立連接的超時時間,默認(rèn)60秒
- proxy_read_timeout 1; #nginx服務(wù)器想被代理服務(wù)器組發(fā)出read請求后,等待響應(yīng)的超時間,默認(rèn)為60秒。
- proxy_send_timeout 1; #nginx服務(wù)器想被代理服務(wù)器組發(fā)出write請求后,等待響應(yīng)的超時間,默認(rèn)為60秒。
- proxy_http_version 1.0 ; #Nginx服務(wù)器提供代理服務(wù)的http協(xié)議版本1.0,1.1,默認(rèn)設(shè)置為1.0版本。
- proxy_method get; #支持客戶端的請求方法。post/get;
- proxy_ignore_client_abort on; #客戶端斷網(wǎng)時,nginx服務(wù)器是否終端對被代理服務(wù)器的請求。默認(rèn)為off。
- proxy_ignore_headers "Expires" "Set-Cookie"; #Nginx服務(wù)器不處理設(shè)置的http相應(yīng)投中的頭域,這里空格隔開可以設(shè)置多個。
- proxy_intercept_errors on; #如果被代理服務(wù)器返回的狀態(tài)碼為400或者大于400,設(shè)置的error_page配置起作用。默認(rèn)為off。
- proxy_headers_hash_max_size 1024; #存放http報文頭的哈希表容量上限,默認(rèn)為512個字符。
- proxy_headers_hash_bucket_size 128; #nginx服務(wù)器申請存放http報文頭的哈希表容量大小。默認(rèn)為64個字符。
- proxy_next_upstream timeout ; #反向代理upstream中設(shè)置的服務(wù)器組,出現(xiàn)故障時,被代理服務(wù)器返回的狀態(tài)值。error/timeout/invalid_header/http_500/http_502/http_503/http_504/http_404/off
- proxy_ssl_session_reuse on; #默認(rèn)為on,如果我們在錯誤日志中發(fā)現(xiàn)“SSL3_GET_FINSHED:digest check failed”的情況時,可以將該指令設(shè)置為off。






