首页 > 代码库 > windows使用nginx+memcached实现负载均衡和session或者缓存共享

windows使用nginx+memcached实现负载均衡和session或者缓存共享

windows使用nginx+memcached实现负载均衡和session或者缓存共享

 

两台服务器

 服务器1115.29.186.215 windows2008 64位操作系统

 服务器2114.215.193.64 windows2008 32位操作系统

其中服务器1同时做nginx负载均衡服务器

使用概要:由于两台服务器;所以数据库连接可以使用一台服务器;

由于本人使用的ibatis框架;所以在数据库层使用ibatis Cache

这样就可以使用一台sql服务器;两台服务器访问都是缓存数据;

只是要解决一台缓存清空 另外一台服务器缓存也需要及时更新的问题,目前我们是使用webservice进行相关远程服务器进行缓存清空;

 

或者是使用sql订阅与发布的方式进行同步数据;具体可以看业务需求

但是这个时候会照成session不共享:我使用了sqlserverstateserverd的方式保存session都不行;最后使用memcahed的方式进行session共享

 

需要下载的资源有:

1:Nginx:首先去nginx官方网站下载http://nginx.org/en/download.html

我下载的是稳定版本Stable version  nginx/Windows-1.6.0  pgp 

 

2:memcached

我放到了我的百度云盘;大家可以下载使用



32位 memcached

http://pan.baidu.com/s/1nMej8

 

 

64位memcached

http://pan.baidu.com/s/1kTJrRa3

 

Memcached Session共享组件+Sql 

http://pan.baidu.com/s/1ntBMo5r 

 

 

服务器一:

1:安装nginx

由于要使用域名直接访问nginxww.kth.hk;

所以nginx需要使用80端口;请将80端口添加到防火墙过滤;所以系统里面使用80端口的都需要换

否则nginx.exe执行会报错下面操作;

一般系统用到了80端口的有:(1)iis里面的网站的端口

然后cmd->iisreset2mssql

 

我将这个服务关掉 或者

 

如果还是不行 则使用cmd命令看下那些东西有用80端口 这个可以百度下

 

本次将下载文件解压到E盘 重新命名为nginx

 

其中vhosts是自己添加的文件 后面讲解用途

解压后 使用cmd命令

进入到nginx目录

 

然后就可以使用nginx的命令:我用的比较多的命令式

Nginx -s stop停止nginx

Nginx.exe 执行ngxin

 

执行nginx.exe 命令后 光标没有任何反应即按照成功

打开资源管理器 就会多出nginx的进程

由于nginx服务所以不能开机自动启动(可以网上百度方法让开机自启动)

所以每次关机开机后 都需要执行上面的开启nginx的命令

那么我们先来看配置文件

进入

 

吧这个文件可以自行先备份一个以防还原

 

我的配置内容是 都有注释

 

 

#user  nobody;

worker_processes 2;

 

#error_log  logs/error.log;

#error_log  logs/error.log  notice;

#error_log  logs/error.log  info;

 

#pid        logs/nginx.pid;

 

 

events {

    worker_connections  1024;

}

 

 

http {

    include       mime.types;

    default_type  application/octet-stream;

 

    #设定请求缓冲 设置开始 

    #server_names_hash_bucket_size 128;

    #client_header_buffer_size 32k;

    #large_client_header_buffers 4 32k;

    #client_max_body_size 8m; #允许客户端请求的最大单文件字节数

    #client_body_buffer_size 128k;  #缓冲区代理缓冲用户端请求的最大字节数

    #设定请求缓冲 设置结束

 

    #log_format  main  ‘$remote_addr - $remote_user [$time_local] "$request" ‘

    #                  ‘$status $body_bytes_sent "$http_referer" ‘

    #                  ‘"$http_user_agent" "$http_x_forwarded_for"‘;

 

    #access_log  logs/access.log  main;

 

    sendfile        on;

    tcp_nopush     on;

 

    #keepalive_timeout  0;

    keepalive_timeout  65;

    tcp_nodelay on;

 

    

    fastcgi_connect_timeout 300;

    fastcgi_send_timeout 300;

    fastcgi_read_timeout 300;

    fastcgi_buffer_size 64k;

    fastcgi_buffers 4 64k;

    fastcgi_busy_buffers_size 128k;

    fastcgi_temp_file_write_size 128k;

 

    ##cache配置##

    proxy_connect_timeout 5;#nginx跟后端服务器连接超时时间(代理连接超时)

    proxy_read_timeout 60;#连接成功后,后端服务器响应时间(代理接收超时)

    proxy_send_timeout 5; #后端服务器数据回传时间(代理发送超时)

    proxy_buffer_size 16k;  #设置代理服务器(nginx)保存用户头信息的缓冲区大小

    proxy_buffers 4 64k;  #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置

    proxy_busy_buffers_size 128k;#高负荷下缓冲大小(proxy_buffers*2

    proxy_temp_file_write_size 128k;#设定缓存文件夹大小,大于这个值,将从upstream服务器传

   

    ##cache结束##

 

 

    #gzip压缩开始

    gzip  on;

    gzip_min_length   1k;

    gzip_buffers   4 8k;

    gzip_http_version  1.1;

    gzip_types   text/plain application/x-javascript text/css  application/xml;

    gzip_disable "MSIE [1-6]\.";

    #gzip压缩结束

 

    #分发服务器配置开始

upstream myCluster {   

#将要跳转的两台服务器的域名端口或者是ip和端口 

#weight是权重 越大 访问到的概率就越大 还有其他的配置

#具体可以百度

server 115.29.186.215:811  max_fails=2 fail_timeout=5s weight=2; 

server 114.215.193.64:801  max_fails=2 fail_timeout=5s weight=1; 

    } 

    #分发服务器配置结束

    # 包含所有的虚拟主机的配置文件

    include E:/nginx/vhosts/*.conf;

}

 

以上是我的配置内容

其中最后的

 # 包含所有的虚拟主机的配置文件

    include E:/nginx/vhosts/*.conf;

是由于我有很多网站 所以每个网站的配置内容都不一样

所以我就分开分布配置

我选择其中一个进行讲解

 

 

server {

#监听80端口

        listen       80;

#将要监听的域名 可以使用正在表达式

        server_name  *.ktf.hk ktf.hk *.kingtaifook.com kingtaifook.com;

 

        #charset koi8-r;

 

        #access_log  logs/host.access.log  main;

 

        # redirect server error pages to the static page /50x.html

        #错误页面配置

        error_page  404 403 500 502 503 504  /Page/Wrong.htm;

     

        # deny access to .htaccess files, if Apache‘s document root

        # concurs with nginx‘s one

        #不允许进入的页面 以Maps开头的eg:www.ktf.hk/Maps/.....

        location /Maps{

            deny  all;

        }

 

#请求所有文件

        location / {

           #请求动态文件设置 不进行缓存,直接转到后端服务器

   proxy_pass http://myCluster/; #这里的名字和上面的cluster的名字相同 

           proxy_redirect  off;

           proxy_set_header Host $host;

           #缓存设置 如果下面设置了 那么页面访问会有缓存 如果是动态页面最好不设置或者使用proxy_cache key给页面传递参数作为不同缓存页面 具体可以百度下

           #proxy_cache_valid 200 302 1h;#设置http状态码为200,302缓存时间为1小时

           #proxy_cache_valid 301 1d;#设置失期时间,为30

           #proxy_cache_valid any 1m;

           #expires 30d;

       #传递真实ip给分发服务器 获取真实访问用户ip

           #在后台可以使用HttpContext.Current.Request.Headers["X-Real-IP"]

         proxy_set_header X-Real-IP $remote_addr;

        }

#请求包含Admin带头的所有文件

        location /Admin {

   proxy_pass http://115.29.186.215:811; 

           proxy_redirect  off;

           proxy_set_header Host $host;

           #请求静态文件设置

           #proxy_cache_valid 200 302 1h;#设置http状态码为200,302缓存时间为1小时

           #proxy_cache_valid 301 1d;#设置失期时间,为30

           #proxy_cache_valid any 1m;

           #expires 30d;

   #传递真实ip给分发服务器

         proxy_set_header X-Real-IP $remote_addr;

        }

 

       #请求包含Resource带头的所有文件

       location /Resource {

   proxy_pass http://115.29.186.215:811;  

           proxy_redirect  off;

           proxy_set_header Host $host;

           #请求静态文件设置

           proxy_cache_valid 200 302 1h;#设置http状态码为200,302缓存时间为1小时

           proxy_cache_valid 301 1d;#设置失期时间,为30

           proxy_cache_valid any 1m;

           expires 30d;

        }

       #请求包含/Scripts/kindeditor-4.1.7/attached带头的所有文件

       location /Scripts/kindeditor-4.1.7/attached {

   proxy_pass http://115.29.186.215:811;  

           proxy_redirect  off;

           proxy_set_header Host $host;

           #请求静态文件设置

           proxy_cache_valid 200 302 1h;#设置http状态码为200,302缓存时间为1小时

           proxy_cache_valid 301 1d;#设置失期时间,为30

           proxy_cache_valid any 1m;

           expires 30d;

        }

 

       #请求后缀为ashx的所有文件

       location ~* \.ashx$ {

   proxy_pass http://115.29.186.215:811;  

           proxy_redirect  off;

           proxy_set_header Host $host;

           #请求静态文件设置

           proxy_cache_valid 200 302 1h;#设置http状态码为200,302缓存时间为1小时

           proxy_cache_valid 301 1d;#设置失期时间,为30

           proxy_cache_valid any 1m;

           expires 30d;

        }

    }

    

由于图片没有单独做图片服务器;所以我就重定向后台只能跳转到

http://115.29.186.215:811这台服务器上面及配置文件

#请求包含Admin带头的所有文件

location /Admin 

同理;前台获取页面的时候 也强制跳转到http://115.29.186.215:811这台服务器上面

及配置文件

#请求包含Resource带头的所有文件

location /Resource {proxy_pass http://115.29.186.215:811;

 

 以上是nginx配置 更加详细的可以百度

 

下面配置memcached

同上 也是将64位解压到E

更名为memcached

 

 

同理进入cmd :输入

1E:

2:Cd: memcached

3:memcached.exe -d install 

安装好服务后 开启服务

4:memcached.exe -d start

如果需要关闭则执行

memcached.exe -d stop|shutdown 进行关闭

 

设置memcached,启动该服务后,memcached服务默认占用的端口是11211,

请将11211添加到防火墙过滤占用的最大内存默认是64M。

如果需要修改这两个参数,比如修改端口为10000,内存为512,则输入: 

memcached.exe -p 10000 -m 512 -d start  ,  -p 表示要修改的端口, -m表示占用的最大内存(单位为M)。

 

好 memcache配置好了,那么我们将要使用memcachesession模块;下载上面的资源文件Memcached Session共享组件+Sql 

 

只需要用到1:Sql Server 2005 2:Enyim.Caching 3: MemcachedProviders

去数据库建立一张给缓存使用的数据库表:memcache会根据用户asp.net生成的cookie去获取缓存是否存在;否则还会去数据库中去查找是否过期并且存在;双重机制保证缓存的的稳定

然后只需sql建表语句

 

由于每次缓存都会添加一条记录到数据库;所以需要定期清理数据库

可以设置一个定时器定期执行Store Procs里面的

 

 

好接下来使用Memched

如果只是使用session的话;只需要配置webconfig就行;

如果是想自定义使用缓存;则需要自己新建一个操作缓存的类;调用2:Enyim.Caching dll里面封装的方法即可

 

我们看session机制的配置

打开网站的web.config

在 

  <configSections>

下面添加

 

 <!--memcached配置1开始-->

    <section name="cacheProvider" type="MemcachedProviders.Cache.CacheProviderSection, MemcachedProviders" allowDefinition="MachineToApplication" restartOnExternalChanges="true"/>

    <sectionGroup name="enyim.com">

      <section name="memcached" type="Enyim.Caching.Configuration.MemcachedClientSection, Enyim.Caching"/>

    </sectionGroup>

<!--memcached配置1结束-->

 

<configuration>

下面添加

 <!--memcached配置2开始-->

  <enyim.com>

    <memcached>

      <servers>

        <!-- put your own server(s) here-->

        <add address="115.29.186.215" port="11211"/>

        <add address="114.215.193.64" port="11211"/>

      </servers>

      <socketPool minPoolSize="10" maxPoolSize="100" connectionTimeout="00:00:10" deadTimeout="00:02:00"/>

    </memcached>

  </enyim.com>

  <cacheProvider defaultProvider="MemcachedCacheProvider">

    <providers>

      <add name="MemcachedCacheProvider" type="MemcachedProviders.Cache.MemcachedCacheProvider, MemcachedProviders" keySuffix="_MySuffix_" defaultExpireTime="1000"/>

    </providers>

  </cacheProvider>

 

  <connectionStrings>

    <add name="SqlSessionServices" connectionString="Data Source=115.29.186.215,1128;Initial Catalog = JDF_Memcached;User Id =sa;Password =JDF@123!!;"/>

  </connectionStrings>

  <!--memcached配置2结束-->

 

在 <system.web>下面添加sessionState

      <sessionState cookieless="false" timeout="10" regenerateExpiredSessionId="true" mode="Custom" customProvider="MemcachedSessionProvider">

      <providers>

        <add name="MemcachedSessionProvider" type="MemcachedProviders.Session.SessionStateProvider,MemcachedProviders" connectionStringName="SqlSessionServices" dbType="SQL"

        writeExceptionsToEventLog="false"  socketConnectTimeout="1000" socketTimeout="1000" />

      </providers>

    </sessionState>

 

 

以上就可以使用memcachesession模块了

使用的方式还是像以前一样

Session[“XXX”]

这样就实现了多台服务器共享session

服务器二:

   不需要安装nginx;只需要nginx服务器需要安装;其他的负载均衡服务器不需要

 由于是32位的

  安装1中的 流程一样安装

至此  配置完成

使用到现在暂时没有发现什么问题