1. 程式人生 > >Apache反向代理負載均衡和會話保持配置

Apache反向代理負載均衡和會話保持配置

Apache從1.2版本起,代理模組就已經加入到Apache原始碼中,可惜當時的代理模組有很多問題,比如:與較新的http規範不相容等等,從Apache2.0起mod_proxy模組不但被重新改寫,還分割成4部分模組:mod_proxy、mod_proxy_http、mod_proxy_ftp、mod_proxy_connect,並且能夠使用http規範較新的特徵,這意味著速度更快,而從Apache2.2版本以後更進一步加入mod_proxy_ajp、mod_proxy_balancer這兩個模組。而最新的Apache版本httpd2.4.33(2018-03-18更新的)支援如下代理模組:
mod_proxy、mod_proxy_connect、mod_proxy_ftp、mod_proxy_http


mod_proxy_ajp、mod_proxy_balancer
mod_proxy_express、mod_proxy_fcgi、mod_proxy_fdpass、mod_proxy_hcheck、mod_proxy_scgi、mod_proxy_uwsgi、mod_proxy_wstunnel
其他輔助模組功能介紹:
mod_proxy_http:提供代理http請求的功能,它支援http/0.9、http/1.0、http1.1標準協議。
mod_proxy_ftp:提供對ftp功能的支援,但是這種支援僅限於get方式,即只能取回ftp站點上檔案,卻無法上傳檔案。

mod_proxy_connect:提供對http connect方法的支援,這種支援主要應用於處理通過代理伺服器的ssl連線請求。
mod_proxy_ajp:提供Apache JServ Protocol Version1.3的支援。
mod_proxy_balancer:為Apache提供負載均衡支援,它支援http、ftp、ajp13協議的負載均衡支援。

正向代理:
正向代理伺服器如下圖所示,它的原理:代理伺服器通常是直接或者間接地連線到客戶端和目標網路(他們之間可能會有防火牆或者是路由器,但是必須保證代理伺服器的資料到客戶端或者目標網路,否則無法代理完成)它將轉發客戶端的請求資料到伺服器,伺服器響應後傳送客戶端資料到代理伺服器,再由代理伺服器轉發給客戶端。


反向代理(逆向代理):
反向代理和正向代理正好相反,反向代理如下圖所示,客戶端並不需要進行任何特別的設定就可以直接訪問目的網路,反向代最常見的方式就是將防火牆後面的伺服器提供給外網使用者訪問,這點有點像閘道器服務的埠對映功能,將客戶端請求轉發到相應的主機埠上,只不過反向代理伺服器還可以提供更多的功能,例如:負載均衡、緩衝服務、URL策略等。另外這種反向代理伺服器還能保護伺服器的安全,使內部的資料在傳輸時能得到控制。


mod_proxy模組是Apache實現代理或閘道器的關鍵模組,其他模組都是需要它的支援才能執行,如果需要使用一個或者多個代理服務,就需要載入mod_proxy模組.
※Apache的代理模組不提供緩衝支援,如要緩衝支援,還需要載入mod_cache和器相關的模組。

使用代理伺服器需要先載入http.conf的mod_proxy模組,將其#去除(還有其他輔助模組等等)

常用需要載入的輔助模組:
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_connect_module modules/mod_proxy_connect.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
LoadModule slotmem_shm_module modules/mod_slotmem_shm.so
LoadModule lbmethod_byrequests_module modules/mod_lbmethod_byrequests.so
LoadModule lbmethod_bytraffic_module modules/mod_lbmethod_bytraffic.so
LoadModule lbmethod_bybusyness_module modules/mod_lbmethod_bybusyness.so

叢集反向代理設定:

在http.conf配置檔案中修改或者增加如下內容:
<IfModule proxy_module>     
Include /etc/httpd/extra/proxy-html.conf
</IfModule>
#IfModule是表示如果載入了此模組,才會執行IfModule容器中內部的命令否則不會執行。或者直接Include也可以。

vim /etc/httpd/extra/proxy-html.conf
ProxyVia On
#關閉正向代理
ProxyRequests Off
ProxyPreserveHost Off
<Proxy>
#設定叢集組,以balancer://開頭,即用於負載均衡叢集,叢集配置還可以指定下列引數
1、lbmethod:apache實現負載均衡的排程方法,預設是byrequests,即基於權重將統計請求個數進行排程,bytraffic則執行基於權重的流量計數排程,bybusyness通過考量每個後端伺服器的當前負載進行排程。
2、 maxattempts:放棄請求之前實現故障轉移的次數,預設為1,其最大值不應該大於總的節點數。
3、 nofailover:取值為On或Off,設定為On時表示後端伺服器故障時,使用者的session將損壞;因此,在後端伺服器不支援session複製時可將其設定為On。
4、stickysession:排程器的sticky session的名字,根據web程式語言的不同,其值為JSESSIONID(java)PHPSESSIONID(php)
上述指令除了能在banlancer://或ProxyPass中設定之外,也可使用ProxySet指令直接進行設定,如:
<Proxy balancer://hotcluster>
BalancerMember  http://www1.xiaofeng.com:8080 loadfactor=1
BalancerMember  http://www2.xiaofeng.com:8080 loadfactor=2
ProxySet  lbmethod=bytraffic
</Proxy>
==============================================================
#設定叢集組,mycluster名稱可以隨意取
Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED
<Proxy "balancer://mycluster/">
#配置http方式的請求
     #BalancerMember http://192.168.0.103:8080  
     #BalancerMember http://192.168.0.104:8080
#配置ajp協議方式請求,後端為tomcat服務,建議使用ajp協議

#下邊route引數是在tomcat節點上配置了jvmRoute,<Engine…jvmRoute="tomcat1">才進行配置,否則不用配置      BalancerMember ajp://192.168.0.103:8009 route=tomcat1
      BalancerMember ajp://192.168.0.104:8009 route=tomcat2
      ProxySet lbmethod=bybusyness
</Proxy>
#使用叢集組,mycluster名稱需與上面配置相同
#/ --下邊ProxyPass引數的斜槓必須有,否則伺服器會返回500錯誤標識
ProxyPass / "balancer://mycluster/" stickysession=JSESSIONID|jsessionid nofailover=Off  
ProxyPassReverse / "balancer://cluster/"
<Location /balancer-manager>
    SetHandler balancer-manager
    #Order Deny,Allow
    #Allow from all
    #Require是httpd2.4版本的語法,該版本向下相容也支援Order的語法格式
    Require all granted
</Location>
#配置balancer-manager控制檯監控
<Location /balancer-manager>
    SetHandler balancer-manager
    Require all granted
    ProxyPass !
</Location>
這樣使用代理服務IP和埠可以訪問balancer-manager

AJP協議介紹:
AJP是Apache提供的完成與其它伺服器通訊的一種協議。在Apache中通過mod_proxy_ajp模組傳送AJP資料,另外一端的伺服器需要實現AJP協議,能夠接受mod_proxy_ajp模組傳送的AJP協議資料,在接受到AJP協議資料後做適當處理,並能夠將處理結果以AJP協議方式傳送回給mod_proxy_ajp模組。
當使用單獨的伺服器,在Tomcat例項前端使用本地的Web伺服器時,效能要比單獨使用Tomcat及其預設的HTTP連線糟得多,即使web應用程式本身相當一部分是由靜態檔案構成。如果需要將Tomcat同本地的Web伺服器整合,AJP連線優於代理HTTP,將提供更好的效能。從Tomcat角度來看,AJP是最有效的。它同時具有HTTP相同的功能(When using a single server, the performance when using a native webserver in front of the Tomcat instance is most of the time significantly worse than a standalone Tomcat with its default HTTP connector, even if a large part of the web application is made of static files. If integration with the native webserver is needed for any reason, an AJP connector will provide faster performance than proxied HTTP. AJP clustering is the most efficient from the Tomcat perspective. It is otherwise functionally equivalent to HTTP clustering.)
使用這種協議,具有更高的效能,因為它採用的是二進位制傳輸。比HTTP的文字傳輸要有更高的效率。在Apache中要使用mod_proxy和mod_proxy_ajp,在Tomcat中則要開啟ajp服務。

代理指令介紹:
    1、ProxyRequests指令:可以使用ProxyRequests來啟用或禁止Apache作為正向代理伺服器的功能,off-關閉,預設Apache是開啟的。使用Apache反向代理功能必須將其設定為off
      2、<ProxyMatch>和<Proxy>容器:<Proxy>容器的作用是用來存放作用於代理伺服器指令,在這個容器中,你可以控制使用者的訪問許可權,而<ProxyMatch>容器則多了正則表示式的支援,可以在這兩個容器內使用shell風格的萬用字元來進行的控制。
        3、ProxyPass指令:ProxyPass指令的作用是將一個遠端伺服器對映到本地伺服器
     4、ProxyVia指令:{On|Off|Full|Block},預設off,即不啟用此功能;ProxyVia指令用於控制代理伺服器對Via:頭的使用,根據http1.1協議。在所有的遵守的http1.1協議的原理的出入連線中都必須有一個Via:頭以說明的身份或表示伺服器軟體的版本,而通過Via:頭管理員可以記錄代理請求的流向,從而最大程度避免迴圈。

On表示每個請求和響應報文均新增Via:;
Full表示每個Via:行都會添加當前apache伺服器的版本號資訊;
Block表示每個代理請求報文中的Via:都會被移除。
    5、ProxyPassReverse指令:用於讓apache調整HTTP重定向響應報文中的Location、Content-Location及URI標籤所對應的URL,在反向代理環境中必須使用此指令避免重定向報文繞過proxy伺服器。