經(jīng)常聽人說到一些術(shù)語汇跨,如反向代理务荆,那么什么是反向代理,如果有反向那是不是也有正向? 什么又是正向代理呢穷遂?
什么是正向和反向代理
正向代理
先理解下正向代理
所謂正向代理類似一個跳板機, 知道自己想要訪問的資源是什么 只不過先連接一個跳板機, 然后通過跳板機連接資源, 最后原路返回得到結(jié)果.
反向代理
反向代理就是將客戶端請求到一個代理服務(wù)器, 客戶端對代理是透明的, 客戶端也不知道訪問的是一個代理服務(wù)器.
代理服務(wù)器來接受internet請求, 然后分發(fā)到內(nèi)部網(wǎng)絡(luò)上的服務(wù)器, 并將內(nèi)部網(wǎng)絡(luò)服務(wù)器得到的結(jié)果返回給internet請求連接的客戶端, 雖然后端可能有很多機器在支撐 但是對外表現(xiàn)只有一個服務(wù)器.
總結(jié)一句話 正向代理隱藏真實客戶端函匕,反向代理隱藏真實服務(wù)端.
反向代理的作用
PS: 摘自wiki
對客戶端隱藏伺服器(叢集)的IP位址
安全:作為應(yīng)用層防火墻,為網(wǎng)站提供對基于Web的攻擊行為(例如DoS/DDoS)的防護蚪黑,更容易排查惡意軟體等
為后端伺服器(叢集)統(tǒng)一提供加密和SSL加速(如SSL終端代理)
負載均衡盅惜,若伺服器叢集中有負荷較高者,反向代理通過URL重寫忌穿,根據(jù)連線請求從負荷較低者獲取與所需相同的資源或備援
對于靜態(tài)內(nèi)容及短時間內(nèi)有大量存取請求的動態(tài)內(nèi)容提供快取服務(wù)
對一些內(nèi)容進行壓縮抒寂,以節(jié)約頻寬或為網(wǎng)路頻寬不佳的網(wǎng)路提供服務(wù)
減速上傳
為在私有網(wǎng)路下(如區(qū)域網(wǎng)路)的伺服器叢集提供NAT穿透及外網(wǎng)發(fā)布服務(wù)
提供HTTP存取認證[2]
突破互聯(lián)網(wǎng)封鎖
保證內(nèi)網(wǎng)安全
Nginx可以使用反向代理提供WAF功能,阻止web攻擊.
并且可以只對外暴露一個端口, 讓內(nèi)容不會讓各種服務(wù)對外暴露 減少被攻擊的可能性.
負載均衡
后端服務(wù) 一臺機器能撐住的請求量是有限的 比如百度這種后端有成千上外服務(wù)器 不能讓用戶看心情 指定訪問某一臺 所以由負載均衡統(tǒng)一處理
Nginx提供的負載均衡策略有2種:內(nèi)置策略和擴展策略掠剑。
內(nèi)置策略為輪詢屈芜,加權(quán)輪詢,Ip hash朴译。
擴展策略井佑,就十分奇妙了,只有你想不到的沒有他做不到的眠寿,可以參照所有的負載均衡算法躬翁,給他一一找出來做實現(xiàn)。
web緩存
Nginx可以對不同的文件做不同的緩存處理澜公,配置靈活姆另,并且支持FastCGI_Cache喇肋,主要用于對FastCGI的動態(tài)程序進行緩存。配合著第三方的ngx_cache_purge迹辐,對制定的URL緩存內(nèi)容可以的進行增刪管理蝶防。
簡單配置
幾個注意點
在 nginx.conf 的注釋符號為: #
每個指令必須有分號結(jié)束
如果發(fā)現(xiàn)好多東西都寫在一個配置文件放不下 可以拆開寫 然后使用 include 引入配置文件
nginx 文件結(jié)構(gòu)
#全局塊
...
#events塊
events {
...
}
#http塊
http {
#http全局塊
...
#server塊
server {
#server全局塊
...
#location塊
location [PATTERN]
{
...
}
location [PATTERN]
{
...
}
}
server
{
...
}
}
這里給出一個簡單的代理塊
# 負載均衡 默認輪詢方式 ABABABABAB請求
upstream backend {
server 192.168.0.1:8081;
server 192.168.0.2:8081;
}
server {
# 監(jiān)聽80端口
listen 80;
# 定義名稱
server_name localhost;
# 定義日志地址
access_log logs/host.access.log localhost;
# location可以進行正則匹配,應(yīng)該注意正則的幾種形式以及優(yōu)先級
location / {
# root說明是靜態(tài)資源明吩,可以由Nginx進行返回
root html
index index.html
}
location / {
# root說明是靜態(tài)資源间学,可以由Nginx進行返回
proxy_pass http://backend;
health_check;
}
}
塊描述
- 全局塊: 配置影響nginx全局的指令。一般有運行nginx服務(wù)器的用戶組印荔,nginx進程pid存放路徑低葫,日志存放路徑,配置文件引入仍律,允許生成worker process數(shù)等嘿悬。
- events塊:配置影響nginx服務(wù)器或與用戶的網(wǎng)絡(luò)連接。有每個進程的最大連接數(shù)水泉,選取哪種事件驅(qū)動模型處理連接請求善涨,是否允許同時接受多個網(wǎng)路連接,開啟多個網(wǎng)絡(luò)連接序列化等草则。
- http塊:可以嵌套多個server钢拧,配置代理,緩存炕横,日志定義等絕大多數(shù)功能和第三方模塊的配置源内。如文件引入,mime-type定義份殿,日志自定義膜钓,是否使用sendfile傳輸文件,連接超時時間卿嘲,單連接請求數(shù)等呻此。
- server塊:配置虛擬主機的相關(guān)參數(shù),一個http中可以有多個server腔寡。
- location塊:配置請求的路由,以及各種頁面的處理情況掌唾。
幾個常見配置項:
- $remote_addr與 $http_x_forwarded_for 用以記錄客戶端的ip地址放前;
- $remote_user :用來記錄客戶端用戶名稱;
- $time_local : 用來記錄訪問時間與時區(qū)糯彬;
- $request : 用來記錄請求的url與http協(xié)議凭语;
- $status : 用來記錄請求狀態(tài);成功是200撩扒;
- $body_bytes_s ent :記錄發(fā)送給客戶端文件主體內(nèi)容大兴迫印吨些;
- $http_referer :用來記錄從那個頁面鏈接訪問過來的;
- $http_user_agent :記錄客戶端瀏覽器的相關(guān)信息炒辉;