https+nginx1.8+tomcat7+Memcached1.4.4集群session共享以及负载均衡环境搭建(window版本)

来源:互联网 发布:vgn p17h装linux 编辑:程序博客网 时间:2024/06/07 13:01

      上学的时候一直有个梦想,就是拥有自己的网站,这个梦想在2015年10份经过自己的学习和在同事的帮助下已经实现了,同时部署阿里云ECS服务器完成备案,现在已经正式上线,后来一直听同事说nginx负载均衡能实现高并发。 于是利用下班时间搭建了Nginx和tomcat集群服务器,利用Memcached实现session共享,同时支持HTTP请求和HTTPS请求,整理了一下,分享给大家,如果存在问题,希望大家多多指点。( nginx指向两个tomcat )

        一.搭建服务器环境前期准备:
               1.1 安装jdk(如果没有安装包自己可以在网上下载)。
               1.2需要下载 Tomcat7(win64位)  《点击下载》
               1.3 需要下载 Nginx1.8.0(win64位)   《点击下载》 
               1.4 需要下载  Memcached1.4 (win64位) 《点击下载》

        二.jdk配置环境变量 :

                2.1 把jdk安装在 C:\Java\jdk1.7.0

                        2.1.1.新建环境变量 JAVA_HOME 值  C:\Java\jdk1.7.0
                        2.1.2.新建环境变量 classpath 值  .;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar  
(注意不要丢失"  .  " 符号) 
                        2.1.3.在path环境变量后面加  ;%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;%CATALINA_HOME%\lib;%CATALINA_HOME%\bin

       三.tomcat7配置安装 :

                         3.1 对于tomcat大家都很熟悉,只需要修改server.xml配置文件即可,这里我们以apache-tomcat-7.0.40为例,分别在server目录,解压缩并命名为:apache-tomcat-7.0.40_1、apache-tomcat-7.0.40_2。
                          第一处端口修改: 
                  <!--  修改port端口:18002  俩个tomcat不能重复,端口随意,别太小- -->                  <Server port="18002" shutdown="SHUTDOWN">
                           第二处端口修改: 
                  <!-- port="8082" tomcat监听端口,随意设置,别太小 -->                    <Connector port="8082" protocol="HTTP/1.1" connectionTimeout="20000"  redirectPort="8443" /> 
                           第三处端口修改:
                  <Connector port="28002" protocol="AJP/1.3" redirectPort="8443" />  
                            第四处 Engine元素增加jvmRoute属性:
                  <Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm2">  
                     两个tomcat的端口别重复,保证能启动起来,tomcat端口分别位 8082(jvm2) 和8081(jvm1)
                           访问8082端口  如下图

                             访问8081端口如下图


                 3.2使用memcached-session-manager这个开源项目(http://download.csdn.net/detail/lhl18330580828/9502743,下面简称msm) 配置Tomcat和memcached实现session共享。
                     首先将下面的包下载到Tomcat的lib目录下,这些包都是msm所依赖的包。
                             javolution-5.5.1.jar
                             kryo-1.03.jar
                             kryo-serializers-0.10.jar
                             memcached-2.5.jar
                             memcached-session-manager-1.5.1.jar
                             memcached-session-manager-tc7-1.5.1.jar
                             minlog-1.2.jar
                             msm-javolution-serializer-1.5.1.jar
                             msm-kryo-serializer-1.6.4.jar
                             reflectasm-0.9.jar
                             spymemcached-2.7.3.jar 
                     把上述jar包放到tomcat/lib 目录下,修改每个tomcat的配置文件tomcat\conf\context.xml
                 <!-- 在<context>...</context>标签之间加入如下代码: -->                     <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"                          memcachedNodes="n1:127.0.0.1:11211"                          sticky="false"                          sessionBackupAsync="false"                          lockingMode="uriPattern:/path1|/path2"                          requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"                          transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory" />
                   说明: 这里的memcachedNodes是填写memcached节点,多个节点时可以以空隔分开,如: 
                                                n1:localhost:11211 n2:localhost:11212     
                                                /localhost改为安装memcached的服务器的IP  

         四.Memcached 配置安装 :

                 4.1 cmd控制台切换到memcached.exe所在目录,我的是在C:\memcached 
                  4.2 输入命令memcached.exe -d install,enter后,即可完成memcached 安装 如下图:
                          
                 4.3  我习惯在服务里启动并把memcached 设为手动
   
                 4.4  右键开启 memcached 后重新启动两个 tomcat,至此tomcat+memcached 搭建完毕。

        五.Nginx1.8.0 配置 :

                 5.1通过我的域名指定到nginx 端口上,分发到上面配置好的两个tomcat 端口 8081和8082上实现负载均衡  
                 5.2  实现https 需要开启 nginx 的443端口,我实现的是域名证书单向认证,如果是为了学习可以在沃通可以申请免费 域名证书 ,如果你想申请的话,我可以帮你(前提是自己得购买域名和服务器)。 
#user  nobody;worker_processes  1;#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;    #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;    #gzip  on;    upstream localhost {        #根据ip计算将请求分配各那个后端tomcat,许多人误认为可以解决session问题,其实并不能。        #同一机器在多网情况下,路由切换,ip可能不同        # ip_hash;         server localhost:8081  ;        server localhost:8082  ;        }      server {        listen       80;        server_name  localhost;        #charset koi8-r;        #access_log  logs/host.access.log  main;        #location / {        #    root   html;        #    index  index.html index.htm;        #}    rewrite ^(.*$) https://$host$1 permanent; location /ngx_status         {        stub_status on;        access_log off;        #allow 127.0.0.1;        #deny all;        }        #error_page  404              /404.html;        # redirect server error pages to the static page /50x.html        #        error_page   500 502 503 504  /50x.html;        location = /50x.html {            root   html;        }        # proxy the PHP scripts to Apache listening on 127.0.0.1:80        #        #location ~ \.php$ {        #    proxy_pass   http://127.0.0.1;        #}        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000        #        #location ~ \.php$ {        #    root           html;        #    fastcgi_pass   127.0.0.1:9000;        #    fastcgi_index  index.php;        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;        #    include        fastcgi_params;        #}        # deny access to .htaccess files, if Apache's document root        # concurs with nginx's one        #        #location ~ /\.ht {        #    deny  all;        #}    }    # another virtual host using mix of IP-, name-, and port-based configuration    #    #server {    #    listen       8000;    #    listen       somename:8080;    #    server_name  somename  alias  another.alias;    #    location / {    #        root   html;    #        index  index.html index.htm;    #    }    #}    # HTTPS server    #      server {          listen 443;  server_name localhost;  ssl on;  ssl_certificate sslkey/1_www.tslhl.com_bundle.crt;     ssl_certificate_key sslkey/2_www.tslhl.com.key;     ssl_session_timeout 5m;  ssl_protocols TLSv1 TLSv1.1 TLSv1.2;   ssl_ciphers ALL:!DH:!EXPORT:!RC4:+HIGH:+MEDIUM:-LOW:!aNULL:!eNULL;  ssl_prefer_server_ciphers on;          location / {                proxy_connect_timeout   1;                      proxy_send_timeout      30;                      proxy_read_timeout      30;                         proxy_pass http://localhost;    }      } }
                           5.2 该项目下新建一个index.jsp文件,编辑该文件内容如下:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>  <%  String path = request.getContextPath();  String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";  %>  <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  <html>    <head>      <base href="<%=basePath%>">        <title>My JSP 'session.jsp' starting page</title>      <meta http-equiv="pragma" content="no-cache">      <meta http-equiv="cache-control" content="no-cache">      <meta http-equiv="expires" content="0">          <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">      <meta http-equiv="description" content="This is my page">      <!--     <link rel="stylesheet" type="text/css" href="styles.css">     -->    </head>    <body>      <%       System.out.println(session.getId());       out.println("<br> This is (TOMCAT1|TOMCAT2), SESSION ID:" + session.getId()+"<br>");      %>    </body>  </html> 
                          5.3 双击nginx.exe 开启nginx 服务,这时我可以访问我的 域名 
            5.4 重复刷新发现session的值不变如下所示,session共享成功

            5.5 我把关闭nginx做成了批处理closeNginx.bat 这样更方便内容为 ( taskkill /f /im nginx.exe)。
                        
                          
                           如果你学到了知识请为我点赞! 
        最后谢谢大家欣赏我的 博客,如果哪里 你发现了 问题,请多多指出,我也是菜鸟,我们共同进步!!!










0 0