天天看點

Apache負載均衡與Spring SessionApache web伺服器配置Apache反向代理配置與負載均衡Spring Session配置

  • Apache web伺服器配置
    • 安裝Apache并啟動Apache服務
  • Apache反向代理配置與負載均衡
    • 加載子產品
    • 負載均衡
    • session共享問題
  • Spring Session配置
    • 運作一個sample
    • 整合Apache反向代理與Spring Session

Apache web伺服器配置

安裝Apache并啟動Apache服務

Apache是一個web應用容器,和tomcat,iis等是一類軟體,除了普通web容器的功能,Apache還可以配置反向代理,實作web伺服器的負載均衡。這裡先示範如何通過Apache建立一個普通的web應用。通過apache官網下載下傳apache,我下載下傳的是Apache2.4解壓版,是以還要手動配置一下。

  1. 配置安裝目錄
    Apache負載均衡與Spring SessionApache web伺服器配置Apache反向代理配置與負載均衡Spring Session配置
    在apache的安裝目錄中找到conf檔案夾,其中有一個httpd.conf檔案,打開這個檔案,在大約38行的位置配置一下apache的安裝目錄。
  2. 安裝并啟動服務

    進入指令行界面,執行指令httpd -k install -n Apache2.4。注意,如果上一步安裝目錄配置不正确,這裡會提示找不到目錄。

    Apache負載均衡與Spring SessionApache web伺服器配置Apache反向代理配置與負載均衡Spring Session配置
    安裝成功後,右鍵“計算機”->”管理”->”服務和應用程式”->”服務”,檢視服務是否安裝成功,安裝成功後還要手動啟動服務。
    Apache負載均衡與Spring SessionApache web伺服器配置Apache反向代理配置與負載均衡Spring Session配置
  3. 配置web應用的相關屬性

    首先是ServerName,也就是通路web應用時用的域名,這裡用localhost:80:

    Apache負載均衡與Spring SessionApache web伺服器配置Apache反向代理配置與負載均衡Spring Session配置
    然後是配置web應用所在目錄:
    Apache負載均衡與Spring SessionApache web伺服器配置Apache反向代理配置與負載均衡Spring Session配置
    這裡使用了預設的目錄htdocs,可以将自己的web應用放到這個目錄下,這個目錄自身已經包含一個html檔案:
    Apache負載均衡與Spring SessionApache web伺服器配置Apache反向代理配置與負載均衡Spring Session配置

4.通路web應用,如果修改過配置檔案,需要在指令行中使用httpd -k restart重新開機一下伺服器。

Apache負載均衡與Spring SessionApache web伺服器配置Apache反向代理配置與負載均衡Spring Session配置

Apache反向代理配置與負載均衡

反向代理與正向代理相對,所謂正向代理,就是多個使用者給自己的浏覽器設定一個代理伺服器,這樣代理伺服器就和多個用戶端浏覽器綁定,所有這些使用者發送的請求都會先經過浏覽器包裝成目标位址為代理伺服器的請求,這樣就可以繞過一些通路限制。反向代理是指通過配置代理伺服器,使代理伺服器與多個web伺服器綁定,然後僅對使用者提供代理伺服器的域名,代理伺服器根據配置的映射關系将使用者的通路轉發到不同的web伺服器中,這些web應用往往屬于同一個系統,用來負載均衡,分流使用者的請求。配置反向代理隻需要兩部,第一步為配置加載子產品,第二部為配置映射。

加載子產品

打開httpd.conf,分别找到如下兩行,并将#注釋去掉,這樣Apache就會加載相關子產品

#LoadModule proxy_module modules/mod_proxy.so
#LoadModule proxy_http_module modules/mod_proxy_http.so
           
ProxyPass                  /proxy2 http://target2:port/url
ProxyPass                  /proxy3 http://target3:port/url
......
           

負載均衡

上面反向代理的作用是可以将一個位址/proxyX映射到另一個址http://targetX:port/url,這種映射關系是一對一的,實際應用中可能更多的是出于隐藏位址和網絡安全方面的作用。負載均衡在反向代理的基礎上,可以實作一對多的位址映射,這裡“一”是統一的共使用者通路的位址,“多”是多個完全相同的web應用,使用者通過統一的位址通路應用,Apache根據負載均衡算法決定将使用者的請求配置設定給哪一個web應用伺服器,實作負載均衡的效果。

下面是一個配置執行個體:

LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
LoadModule lbmethod_byrequests_module modules/mod_lbmethod_byrequests.so

<Proxy "balancer://mycluster">  
BalancerMember http://localhost:8080/firstapp
BalancerMember http://localhost:8080/secondapp
</Proxy>   
ProxyPass "/proxy" "balancer://mycluster" 
ProxyPassReverse "/proxy" "/firstapp"
ProxyPassReverse "/proxy" "/secondapp"
ProxyPassReverseCookiePath "/firstapp" "/proxy"
ProxyPassReverseCookiePath "/secondapp" "/proxy" 
           

可以看到,與反向代理不同的是,這裡将位址映射到了”balancer://mycluster”,BalancerMember即為背景的web應用。Apache根據配置的負載均衡算法(注意第2行我們加載了byrequest類型的算法,它将按照BalancerMember聲明的順序轉發使用者的http請求),将請求轉發給BalancerMember,這裡firstapp和secondapp都是完全相同的web應用,這樣就減輕了單台web伺服器的壓力,而對使用者來說這一切都是透明的。

session共享問題

當使用負載均衡時會有session共享的問題。我們知道,web容器的session是通過向cookie中添加sessionid達到有狀态的效果的。

使用反向代理時,假設:

使用者第一次通路的位址是http://localhost/proxy/a.html ,該請求被Apache轉發到http://target:port/url/a.html ,web伺服器target1查詢sessionid發現沒有,則建立一個session,并把sessionid随響應封包一并傳送回去。

當使用者再次通路localhost時,如http://localhost/proxy/a.html ,浏覽器會在請求封包中添加相同的sessionid,但此時封包被轉發到了另一台web應用伺服器target2,target2中查詢後發現不存在這個sessionid,這就出現了錯誤。

Spring Session配置

Spring Session是解決多web伺服器session共享的一個開源方案,通過Spring Session可以解決上面提到的問題。Spring Session的介紹這裡不再重複,網上可以查到。這裡主要利用官網的下載下傳的sample結合Apache驗證一下效果。

運作一個sample

官方的源碼中有寫好的sample,我們可以直接拿來體驗一下,注意,這個sample并沒有整合Apache反向代理。

  1. 下載下傳samples,url為https://github.com/spring-projects/spring-session/
    Apache負載均衡與Spring SessionApache web伺服器配置Apache反向代理配置與負載均衡Spring Session配置
  2. 搭建項目,選擇httpsession-xml這個demo,
    Apache負載均衡與Spring SessionApache web伺服器配置Apache反向代理配置與負載均衡Spring Session配置
    在eclipse中建立一個項目,伺服器使用tomcat,并将demo中的内容複制過去,注意需要引用的第三方包
    Apache負載均衡與Spring SessionApache web伺服器配置Apache反向代理配置與負載均衡Spring Session配置
  3. 安裝redis資料庫,我安裝的是ms提供的window64位版,安裝完服務會自動啟用,不必手動配置。
  4. 運作項目
    Apache負載均衡與Spring SessionApache web伺服器配置Apache反向代理配置與負載均衡Spring Session配置
    這個程式的作用就是設定并檢視session的值,這個session是經過Spring Session定義的,不是tomcat自己的session 。下面,我們還是用這個sample,但是會整合Apache反向代理。

整合Apache反向代理與Spring Session

  1. 在tomcat的釋出目錄下建立兩個項目,firstapp和secondapp,這兩個項目的内容是一模一樣的,都是上面httpsession-xml這個sample的内容。建立完後啟動tomcat。
    Apache負載均衡與Spring SessionApache web伺服器配置Apache反向代理配置與負載均衡Spring Session配置
  2. 在Apache的httpd.config中設定映射
    Apache負載均衡與Spring SessionApache web伺服器配置Apache反向代理配置與負載均衡Spring Session配置
    注意ProxyPassReverseCookiePath這條設定,由于tomcat可以在同一域名下建立多個web應用,是以浏覽器在傳遞sessionid時并不能僅靠域名選擇要上傳的cookie,還需要域名後的一級路徑。當使用者第一次通路站點時,站點傳回的資訊包含cookie(包含sessionid),域名,一級路徑,浏覽器将cookie(包含sessionid)和域名/一級路徑對應起來,當使用者再次通路相同的域名/一級路徑時會上傳這個cookie。使用反向代理時,web伺服器傳回的一級路徑和域名都是web伺服器而非Apache中映射的那個,比如使用者第一次通路http://localhost/proxy/index.jsp ,web伺服器傳回的一級路徑為/firstapp
    Apache負載均衡與Spring SessionApache web伺服器配置Apache反向代理配置與負載均衡Spring Session配置
    ,這樣當使用者再次通路http://localhost/proxy/index.jsp 時浏覽器不會上傳cookie ,因為浏覽器将cookie綁定到了localhost/firstapp上了,是以我們要設定ProxyPassReverseCookiePath,将web伺服器傳回的一級路徑進行轉換。
    Apache負載均衡與Spring SessionApache web伺服器配置Apache反向代理配置與負載均衡Spring Session配置

3.通路http://localhost/proxy/index.jsp , 設定一個session值

Apache負載均衡與Spring SessionApache web伺服器配置Apache反向代理配置與負載均衡Spring Session配置

可以看到Apache将請求轉發到了firstapp(這裡我把sample裡的jsp檔案改了一下<title>标簽,用來區分傳回的是哪一個頁面,實際應用中多個web應用的内容是完全相同的) ,我設定了一條session,key:proxy value:1

接下來點選“Set Attribute”按鈕,請求會被送出到http://localhost/proxy/session(這是一個servlet)

Apache負載均衡與Spring SessionApache web伺服器配置Apache反向代理配置與負載均衡Spring Session配置

可以看到雖然這次請求的是另一個web應用secondapp,但是它卻獲得了剛才firstapp設定的session值,這是因為Spring Session将session存儲在獨立的Redis資料庫中而不是web容器内,這就實作了session共享。

最後是一幅圖總結内容:

Apache負載均衡與Spring SessionApache web伺服器配置Apache反向代理配置與負載均衡Spring Session配置