Haproxy+asp.net +RedisSessionStateProvider 完美实现负载均衡,并且session保持
Posted on 2016-08-16 13:41 漂泊雪狼 阅读(2383) 评论(0) 编辑 收藏 举报.net framework 4.5下测试成功,使用RedisSessionStateProvider 2.2.1保持session数据,通过Haproxy保持会话数据。
首先在PM下安装RedisSessionStateProvider
Install-Package Microsoft.Web.RedisSessionStateProvider,修改web站点 web.config,使两个web站点的Redis配置相同。
<configuration> <appSettings> <add key="val" value="100"/> </appSettings> <system.web> <compilation debug="true" targetFramework="4.5" /> <httpRuntime targetFramework="4.5" /> <sessionState mode="Custom" customProvider="MySessionStateStore"> <providers> <add name="MySessionStateStore" type="Microsoft.Web.Redis.RedisSessionStateProvider" host="localhost" accessKey="" ssl="false" /> </providers> </sessionState> </system.web> </configuration>
测试站点index.aspx页面源码
1 <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Index.aspx.cs" Inherits="WebApp.Index" %> 2 3 <!DOCTYPE html> 4 5 <html xmlns="http://www.w3.org/1999/xhtml"> 6 <head runat="server"> 7 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> 8 <title></title> 9 </head> 10 <body> 11 <form id="form1" runat="server"> 12 <div> 13 <asp:Button ID="btnSet" runat="server" OnClick="btnSet_Click" Text="Set Session" /> 14 </div> 15 </form> 16 </body> 17 </html>
后台代码
1 public partial class Index : System.Web.UI.Page 2 { 3 protected void Page_Load(object sender, EventArgs e) 4 { 5 Response.Write(System.Configuration.ConfigurationManager.AppSettings["val"] + "<br/>"); 6 7 if (Session["a"] != null) 8 { 9 Response.Write(Session["a"]); 10 } 11 else 12 { 13 Response.Write("session empty"); 14 } 15 Response.Write("<br/>" + Request.Url.ToString()); 16 Response.Write("<br/> sessionid=" + Session.SessionID); 17 } 18 19 protected void btnSet_Click(object sender, EventArgs e) 20 { 21 Session["a"] = "Wilson.fu"; 22 } 23 }
将测试站点发布到一台独立服务器,iis中分拨设置(testweb1)81、(testweb2)82两个端口模拟两台web服务器。
CentOS下安装Haproxy,配置如下
1 global 2 log 127.0.0.1 local0 3 # log 127.0.0.1 local1 4 maxconn 4000 5 ulimit-n 8000 6 uid 0 7 gid 0 8 # chroot /tmp 9 # nbproc 2 10 # daemon 11 # debug 12 # quiet 13 14 listen proxy1 192.168.207.128:8000 15 mode http 16 # source 127.0.0.2:0 17 # log 127.0.0.1 local0 18 # log 127.0.0.1 local1 19 log global 20 #mode tcp 21 # cookie SERVERID insert indirect 22 appsession ASP.NET_SessionId len 30 timeout 5h request-learn 23 balance roundrobin 24 #dispatch 127.0.0.1:3130 25 #dispatch 127.0.0.1:31300 26 #dispatch 127.0.0.1:80 27 #dispatch 127.0.0.1:22 28 option httpchk 29 # server test 127.0.0.1:80 cookie cookie1 check inter 300 30 # server web02 192.168.0.104:80 cookie cookie2 check inter 300 31 #server web01 127.0.0.1:80 cookie cookie1 check inter 2000 fall 3 weight 30 #定义的多个后端 32 #server web02 192.168.0.104:80 cookie cookie2 check inter 2000 fall 3 weight 30 #定义的多个后端 33 server web01 192.168.207.130:81 cookie cookie1 check inter 2000 fall 3 weight 30 #定义的多个后端 34 server web02 192.168.207.130:82 cookie cookie2 check inter 2000 fall 3 weight 30 #定义的多个后端 35 36 # server nc 127.0.0.1:8080 cookie cookie1 check inter 300 37 # server tuxlocal0 10.101.23.9:80 cookie cookie1 check 38 # server tuxlocal1 127.0.0.1:80 cookie cookie1 check 39 # server tuxlocal2 127.0.0.1:80 cookie cookie2 check 40 # server tuxlocal3 127.0.0.1:80 cookie cookie3 check 41 # server tuxlocal4 127.0.0.1:80 cookie cookie4 check 42 # server vax 10.101.14.1:80 cookie cookie1 check 43 #server tuxceleron 10.101.0.1:80 cookie cookie2 check 44 #server telnet 127.0.0.1:23 45 #server ssh 127.0.0.1:22 46 #server local 127.0.0.1:3130 cookie cookie3 check 47 #server ko 127.0.0.1:0 cookie cookie3 check 48 #server local 127.0.0.1:8001 cookie cookie3 check 49 #server local 127.0.0.1:3130 50 #server celeron 10.101.0.1:80 cookie srv1 51 #server celeron 10.101.0.1:31300 52 #server local 10.101.23.9:31300 53 contimeout 3000 54 clitimeout 150000 55 srvtimeout 150000 56 maxconn 60000 57 option redispatch 58 retries 3 59 grace 3000 60 #rsprep ^Server.* Server:\ IIS 61 #rspdel ^Server.* 62 #rspadd Set-Cookie:\ mycookie=0;\ path=/ 63 #rsprep ^(Date:\ )([^,]*)(,\ )(.*) LaDate\ est:\ \4\ (\2) 64 # force connection:close 65 #reqidel ^Connection: 66 #rspidel ^Connection: 67 #reqadd Connection:\ close 68 #rspadd Connection:\ close 69 # processing options 70 #option keepalive 71 option forwardfor 72 option httplog 73 option dontlognull 74 # reqirep ^(Test:\ ) \0_toto_\1_toto 75 # reqidel ^X-Forwarded-for: 76 # reqirep ^(GET|POST)\ .* \0 77 # reqirep ^(Host:|Connection:|User-agent:|Cookie:)\ .* \0 78 # reqideny ^
启动Haproxy
[root@localhost sbin]# ./haproxy -f /usr/local/haproxy/haproxy2.cfg
输入代理服务器IP,被分流至82站点
下面在iis中停止端口为82的站点,刷新页面发现自动分流至端口为81的站点,并且session值被保留!
Haproxy马上侦测到82端口的站点被停止(down)