nginx反向代理
參考博客:
https://www.cnblogs.com/anruy/p/4989161.html
https://www.cnblogs.com/pyyu/p/9468680.html
1. 概述
反向代理(Reverse Proxy)方式是指 以代理服務器來接受internet上的連接請求, 然后將請求轉發給內部網絡上的服務器, 並將從服務器上得到的結果返回給internet上請求連接的客戶端, 此時代理服務器對外就表現為一個服務器.
通常的代理服務器, 只用於代理內部網絡對Internet的連接請求, 客戶機必須指定代理服務器, 並將本來要直接發送到web服務器上的http請求發送到代理服務器中. 當一個代理服務器能夠代理外部網絡上的主機, 訪問內部網絡時, 這種代理服務的方式就稱為反向代理.
2. 反向代理服務器的工作原理
反向代理服務器通常有兩種模型, 它可以作為內容服務器的替身, 也可以作為內容服務器集群的負載均衡器.
(1)作為內容服務器的替身
如果您的內容服務器具有必須保持安全的敏感信息, 如信用卡號數據庫, 可在防火牆外部設置一個代理服務器作為內容服務器的替身. 當外部客戶機嘗試訪問內容服務器時, 會將其送到代理服務器. 實際內容位於內容服務器上, 在防火牆內部受到安全保護. 代理服務器位於防火牆外部, 在客戶機看來就像是內容服務器.
當客戶機向站點提出請求時, 請求將轉到代理服務器. 然后, 代理服務器通過防火牆中的特定通路, 將客戶機的請求發送到內容服務器. 內容服務器再通過該通道將結果回傳給代理服務器. 代理服務器將檢索到的信息發送給客戶機, 好像代理服務器就是實際的內容服務器. 如果內容服務器返回錯誤消息, 代理服務器會先行截取該消息並更改標頭中列出的任何 URL, 然后再將消息發送給客戶機. 如此可防止外部客戶機獲取內部內容服務器的重定向 URL.
這樣, 代理服務器就在安全數據庫和可能的惡意攻擊之間提供了又一道屏障. 與有權訪問整個數據庫的情況相對比, 就算是僥幸攻擊成功, 作惡者充其量也僅限於訪問單個事務中所涉及的信息. 未經授權的用戶無法訪問到真正的內容服務器, 因為防火牆通路只允許代理服務器有權進行訪問.
(2)作為內容服務器的負載均衡器
可以在一個組織內使用多個代理服務器來平衡各 Web 服務器間的網絡負載. 在此模型中, 可以利用代理服務器的高速緩存特性, 創建一個用於負載平衡的服務器池. 此時, 代理服務器可以位於防火牆的任意一側. 如果 Web 服務器每天都會接收大量的請求, 則可以使用代理服務器分擔 Web 服務器的負載並提高網絡訪問效率.
對於客戶機發往真正服務器的請求, 代理服務器起着中間調停者的作用. 代理服務器會將所請求的文檔存入高速緩存. 如果有不止一個代理服務器, DNS 可以采用“循環復用法”選擇其 IP 地址, 隨機地為請求選擇路由. 客戶機每次都使用同一個 URL, 但請求所采取的路由每次都可能經過不同的代理服務器.
可以使用多個代理服務器來處理對一個高用量內容服務器的請求, 這樣做的好處是內容服務器可以處理更高的負載, 並且比其獨自工作時更有效率. 在初始啟動期間, 代理服務器首次從內容服務器檢索文檔, 此后, 對內容服務器的請求數會大大下降.
二. nginx反向代理實例
1.前期准備
- 准備兩台或兩台以上的服務器
- 代理服務器:
192.168.15.109
- 資源服務器:
192.168.15.135
- 代理服務器:
- 兩台服務器上都安裝好nginx
2.代理服務器配置
cd /opt/nginx112/conf
ls
vim nginx.conf #編輯nginx.conf文件
# 在nginx.conf中寫入如下信息:
server {
listen 80;
server_name lihaitao.com; #注意修改windows操作系統中hosts文件
location / {
#proxy_pass參數: 當我的請求是lihaitao.com時,該nginx不做處理,只是轉發請求給另一台服務器192.168.15.135:8000
proxy_pass http://192.168.15.135:8000;
}
}
nginx # 啟動nginx
nginx -s reload # 平滑重啟nginx
3.資源服務器配置
cd /opt/nginx112/conf
ls
vim nginx.conf #編輯nginx.conf文件
server {
listen 8000; #監聽的端口
server_name localhost; #監聽的域名,localhost表示本機ip
location / {
root /opt/fanxiangdaili_static; #存放靜態資源的路徑
index index.html; #靜態文件
}
}
mkdir /opt/fanxiangdaili_static
cd /opt/fanxiangdaili_static
touch index.html
vim index.html # 編輯index.html文件,內容隨意,例如:
<h1>hello world!</h1>
nginx # 啟動nginx
nginx -s reload # 平滑重啟nginx
4.瀏覽器訪問代理服務器
三. nginx負載均衡實例
1.前期准備
- 准備三台或三台以上的服務器
- 服務器1(負載均衡器):
192.168.15.109
- 服務器2(web應用資源1):
192.168.15.135
- 服務器3(web應用資源2):
192.168.15.25
- 服務器1(負載均衡器):
- 三台服務器上都安裝好nginx
2.配置服務器1(負載均衡器)
vim /opt/nginx112/conf/nginx.conf #編輯nginx.conf文件
# upstream: 地址池, 該參數寫在http{}內部,server{}上部
upstream s16backup {
server 192.168.15.135;
server 192.168.15.25;
}
# server: 虛擬主機,配置修改如下
server {
listen 80;
server_name chiji.com;
location / {
#proxy_pass參數: 轉發給地址池 s16backup
proxy_pass http://s16backup;
}
}
nginx # 啟動nginx
nginx -s reload # 平滑重啟nginx
3.配置服務器2(web應用資源1)
vim /opt/nginx112/conf/nginx.conf #編輯nginx.conf文件
server {
listen 80;
server_name localhost;
location / {
root /opt/fuzaijunheng1_static;
index index.html;
}
error_page 404 401 400 403 /40x.html;
}
# nginx負載均衡算法
# 默認是輪訓方式,你一次我一次
# 權重算法:
upstream django {
server 192.168.15.135 weight=2;
server 192.168.15.25 weight=8;
}
# 哈希算法: ip哈希和權重不得同時存在
upstream django {
server 192.168.15.135;
server 192.168.15.25;
ip_hash;
}
mkdir /opt/fuzaijunheng1_static
cd /opt/fuzaijunheng1_static
touch index.html 40x.html
vim index.html # 編輯index.html,內容如下:
<h1>This is resource server1!!!</h1>
vim 40x.html # 40x.html,內容如下:
<h1>40x error!!!</h1>
nginx # 啟動nginx
nginx -s reload # 平滑重啟nginx
4.配置服務器3(web應用資源2)
與步驟3類似
5.瀏覽器訪問服務器1
重復刷新chiji.com, 循環出現以上二圖(輪訓方式).