之前一直覺的nginx的反向代理和負載均衡很厲害的樣子,最近有機會接觸了一下公司的這方面的技術,發現技術就是一張窗戶紙呀,捅破了啥都明白了!
接下來先看一下nginx的反向代理:
簡單的來說就是nginx不去自己處理php相關的請求,而是將php的相關的請求轉發給apache來進行處理。
上面就是一個比較簡單的一個反向代理的流程圖,其實我們也可以叫做“動靜分離”,只是反向代理更加的規范。
來看一下它的一個配置:
使用proxy_pass即可進行反向代理,官方給的說明例子:
1 Syntax: proxy_pass URL; 2 Default: — 3 Context: location, if in location, limit_except
我們可以使用類似於下面的這種方法來進行配置:
1 location / { 2 proxy_pass http://127.0.0.1/remote/; --- http是必須要帶的不然的話 是不會生效的 3 }
上面就是反向代理的一個簡單的使用配置。
那接下來我們來看一下負載均衡的一個概念:
其實就是多台服務器進行共同工作,反向代理的后端如果有多台服務器,那自然可以形成負載均衡,但我們考慮一下proxpy_pass如何指向多台服務器?
那我們其實可以將多台的服務器用一個upstream 上游的服務器組指定綁定在一起並起個組名,然后使用proxpy_pass指向該組即可。
我們來看一下upstream的一個簡單的定義:
1 Syntax: upstream name { ... } 2 Default: — 3 Context: http
來看一下下面一個簡單的例子:
1 upstream backend { 2 server backend1.example.com weight=5; //這台機器會承擔5個請求,剩下的機器會承擔剩余的請求壓力 3 server 127.0.0.1:8080 max_fails=3 fail_timeout=30s; 4 server unix:/tmp/backend3; 5 6 server backup1.example.com backup; 7 } 8 9 server { 10 location / { 11 proxy_pass http://backend; 12 } 13 }
默認的均衡的算法很簡單,就是針對后端服務器的順序,逐個請求.
上面就是一個簡單的負載均衡的一個例子。
那我們打開日志發現,$remot_addr變成了nginx的IP,而不是用戶客戶端的原來的IP,那這時候怎么辦?
1 Proxy_set_header X-Forwarded-For $remote_addr;
在每個location中加上這么一句話,就ok了。
再附一張我們之前測試的一個案例: