|  | 
 
| 名词
 jdk (jre,jvm)
 j2ee
 j2se
 j2me
 中间件
 
 j2ee平台由一整套服务,应用程序接口和协议规范组成
 Java 2 Platform,Enterprise Edition
 
 tomcat  (apache软件基金会)
 weblogic  (oracle)
 jboss wildfly  (redhat)
 websphere (IBM)
 resin  (CAUCHO)
 
 tomcat
 
 apache + tomcat
 官网地址:
 http://tomcat.apache.org/
 
 JDK  (java   development  kit)  ,JDK是整个JAVA的核心,包括了JAVA运行环境,JAVA工具和基础类库等。
 
 
 tomcat
 
 apache + tomcat
 官网地址:
 http://tomcat.apache.org/
 
 JDK  (java   development  kit)  ,JDK是整个JAVA的核心,包括了JAVA运行环境,JAVA工具和基础类库等。
 
 
 软件包
 笔记目录/tomcat_soft/
 
 tomcat8.0.20的安装过程
 1,安装jdk
 # java -version  --查看本机默认使用的java版本,这个是本机rpm版的,我下面使用的是新下载的java版本
 java version "1.7.0_45"
 OpenJDK Runtime Environment (rhel-2.4.3.3.el6-x86_64 u45-b15)
 OpenJDK 64-Bit Server VM (build 24.45-b08, mixed mode)
 
 2,解压安装新版本jdk
 tar xf jdk-8u45-linux-x64.tar.gz -C /usr/local/
 mv /usr/local/jdk1.8.0_45/  /usr/local/java/
 
 3,解压安装新版本tomcat
 tar xf apache-tomcat-8.0.20.tar.gz -C /usr/local/
 mv /usr/local/apache-tomcat-8.0.20/ /usr/local/tomcat
 
 tomcat的环境变量的定义
 一种是定义在全局里;如果装有多个JDK的话,定义全局会冲突
 vim /etc/profile
 source /etc/profile
 另一种是定义在单个tomcat的启动和关闭程序里,建议使用这种
 /usr/local/tomcat/bin/startup.sh
 /usr/local/tomcat/bin/shutdown.sh
 把startup.sh和shutdown.sh这两个脚本里的最前面加上下面一段
 export JAVA_HOME=/usr/local/java
 export TOMCAT_HOME=/usr/local/tomcat
 export CATALINA_HOME=/usr/local/tomcat
 export CLASS_PATH=$JAVA_HOME/bin/lib
  JAVA_HOME/jre/lib  JAVA_HOME/lib/tool.jar export PATH=$PATH:/usr/local/java/bin:/usr/local/tomcat/bin
 
 启动方法
 /usr/local/tomcat/bin/startup.sh
 Using CATALINA_BASE:   /usr/local/tomcat
 Using CATALINA_HOME:   /usr/local/tomcat
 Using CATALINA_TMPDIR: /usr/local/tomcat/temp
 Using JRE_HOME:        /usr/local/java
 Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
 Tomcat started.
 
 lsof -i:8080  --端口还是8080
 COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
 java    4224 root   44u  IPv6  40596      0t0  TCP *:webcache (LISTEN)
 
 使用firefox访问
 http://IP:8080
 
 关闭方法
 /usr/local/tomcat/bin/shutdown.sh
 
 家目录路径:
 /usr/local/tomcat/webapps/ROOT/
 
 -------------------------------------
 
 
 修改监听端口
 # vim /usr/local/tomcat/conf/server.xml
 
 <Connector port="80" protocol="HTTP/1.1"  --把8080改成80的话重启后就监听80
 connectionTimeout="20000"
 redirectPort="8443" />
 
 --测试后再改回8080端口
 ---------------------------------------
 
 目录布署
 # mkdir /usr/local/tomcat/webapps/abc
 --把abc目录与ROOT同级或者是在ROOT的下一级都是可行的
 
 # vim /usr/local/tomcat/webapps/abc/time.jsp
 
 <html>
 <body>
 <center>
 <H1><%=new java.util.Date()%></H1>
 </center>
 </body>
 </html>
 
 ----------------------------------------------------------
 
 安装jsprun
 linux +   apache + php   + mysql
 linux +  nginx   +  php(fastcgi) + mysql
 linux +  tomcat  +  jsp + mysql
 软件包:
 mysql-connector-java-5.1.8.tar.gz  --mysql与java连接
 JspRun_v6.0.0_UTF8.zip  --jsprun论坛
 
 解压jsprun论坛程序包,放到$TOMCAT_HOME/webapps/jsprun/
 # unzip  JspRun_v6.0.0_UTF8.zip -d /usr/local/tomcat/webapps/
 --如果你想直接访问域名后(如http://www.xxx.com/)就能访问到你的网站,就把webapps/ROOT干掉,再把jsprun重命名成ROOT就可以了;
 --我这里不干掉webapps/ROOT,那么我们就要用http://www.xxx.com/jsprun的路径来访问了
 mv /usr/local/tomcat/webapps/JspRun\!_6.0.0_UTF8/ /usr/local/tomcat/webapps/jsprun/
 # cd /usr/local/tomcat/webapps/jsprun/
 # mv upload/* .
 # rm upload/ -rf
 解压mysql与java连接工具包
 # tar xvf mysql-connector-java-5.1.8.tar.gz -C /usr/src/
 
 解压后,分别把连接工具拷到JAVA目录和tomcat的网页目录
 
 # cp /usr/src/mysql-connector-java-5.1.8/mysql-connector-java-5.1.8-bin.jar /usr/local/tomcat/webapps/ROOT/WEB-INF/
 
 # cp /usr/src/mysql-connector-java-5.1.8/mysql-connector-java-5.1.8-bin.jar /usr/local/tomcat/webapps/jsprun/WEB-INF/
 
 # yum install mysql* -y
 
 # /etc/init.d/mysqld start
 # mysql
 mysql> create database bbs;
 mysql> grant all on bbs.* to 'bbs'@'localhost' identified by '123';
 mysql> flush privileges;
 # vim /usr/local/tomcat/webapps/jsprun/config.properties
 dbhost = localhost --修改数据库地址
 dbport=3306  --端口
 dbuser = bbs  --连接用户名
 dbpw = 123  --密码
 dbname = bbs  --库名
 pconnect = 0
 tablepre = jrun_
 database = mysql
 dbcharset =
 charset = utf8
 headercharset = 0
 tplrefresh = 1
 version=5.1
 # /usr/local/tomcat/bin/startup.sh --启动tomcat
 
 使用下面的URL去访问,进入到jsprun论坛的中文安装界面;
 http://10.1.1.36:8080/jsprun/install.jsp --注意这里后面的install.jsp也自己输出来
 
 然后就按照图形安装步骤一直安装就可以了
 
 --安装完后,主页可以访问,可以注册和登陆。但是不能发帖,后台进去后也没有任何功能显示(应该还是版本比较老,和现在新的java版本不兼容的问题)
 
 ==================================================================
 
 
 上把讨论的是单机的tomcat加应用的做法,那么如果负载和并发大,那么单机会顶不住压力,下面就讨论架构做法
 apache跑静态页面速度快且稳定,不可以跑java程序
 tomcat也可以跑静态页面,但速度较慢,可以跑java程序
 所以就有了apache+tomcat的整合应用(动静分离)
 方法有:
 1,apache+tomcat+mod_jk+session复制 (对于现在来说,相对较老的方案)
 2,nginx+tomcat+msm(memcached-session-manager) (现在的流行方案)
 
 client
 |
 |  DNS轮循,反向代理(squid,nginx等),LVS
 |
 nginx1 nginx2
 
 tomcat1 tomcat2
 
 =====================================================================
 
 下面就配置nginx+tomcat+msm(memcached-session-manager)做综合应用
 
 关于session的讨论
 方法大概有:
 一,用cookies
 二,用nginx里的ip_hash,做成类似sticky session(粘贴会话在一台服务器上)的做法
 upstream tomcat {
 ip_hash;
 server 1.1.1.128:8080 weight=1;
 server 1.1.1.129:8080 weight=1;
 }
 
 优点:配置简单,方便
 缺点:可能会造成负载不均衡
 
 三,如果是使用tomcat,可以使用tomcat的组播功能(session复制)
 缺点:难配置,组播会影响整个架构性
 
 四,利用nginx插件实现tomcat集群和session同步,nginx-upstream-jvm-route-0.1.tar.gz,是一个 Nginx 的扩展模块,用来实现基于 Cookie 的 Session Sticky 的功能,可通过http://code.google.com/p/nginx-upstream-jvm-route/downloads/list获取。
 
 五,memcache来共享session(memcached-session-manager)
 
 我client
 
 王五memcached
 
 张三  李四
 tomcat1  tomcat2
 
 下图中:
 10.1.1.0/24网络我模拟外网(这里我用vmware的桥接网络来模拟)
 1.1.1.0/24网络我模拟内网(这里我用vmware的hostonly网络来模拟)
 
 
 nginx做反向加解析静态页面
 tomcat解析java动态程序
 client  10.1.1.35
 |
 | 10.1.1.36
 nginx
 |     1.1.1.127
 |
 |----------|
 tomcat1          tomcat2
 1.1.1.128     1.1.1.129
 
 |        |
 |----------------------|
 |
 |
 1.1.1.130  memcached服务器
 
 实验前准备:
 1,主机名三步绑定
 2,时间同步
 3,关闭iptables,selinux
 4,配置yum
 
 第一步:
 1,在1.1.1.127上安装nginx
 软件包在  笔记目录/program/lnmp_soft/
 安装过程参考上一次课的笔记,这里省略
 
 2,配置nginx
 # cat /usr/local/nginx/conf/nginx.conf
 user  nginx nginx;
 worker_processes  8;
 error_log  logs/error.log  info;
 pid        logs/nginx.pid;
 events {
 worker_connections  65534;
 use epoll;
 }
 
 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"';
 sendfile        on;
 keepalive_timeout  65;
 upstream tomcat {
 server 1.1.1.128:8080 weight=1;
 server 1.1.1.129:8080 weight=1;
 }
 server {
 listen       80;
 server_name  10.1.1.36;
 root /nginxroot/;
 index index.jsp index.html;
 access_log  logs/host.access.log  main;
 location ~ .*\.jsp$ {
 proxy_pass   http://tomcat;
 proxy_set_header Host $host;
 proxy_set_header X-Forwarded-For $remote_addr;
 }
 }
 }
 
 # mkdir /nginxroot/
 # ulimit -SHn 65535
 # /usr/local/nginx/sbin/nginx
 # lsof -i:80
 
 
 第二步:
 在1.1.1.128和1.1.1.129上安装两台tomcat(过程省略)
 
 tomcat1和tomcat2上把下面的软件包都scp到/usr/local/tomcat/lib/目录下
 # ls 笔记目录/tomcat_soft/msm/   --这些软件包是针对tomcat8的,如果你是tomcat6或者tomcat7你需要自行网上下载
 asm-3.2.jar                              msm-kryo-serializer-1.8.1.jar
 kryo-1.04.jar                            reflectasm-1.01.jar
 memcached-session-manager-1.8.1.jar      serializers-0.11.jar
 memcached-session-manager-tc8-1.8.1.jar  spymemcached-2.11.1.jar
 minlog-1.2.jar
 
 第三步:
 在tomcat1和tomcat2上操作
 # vim /usr/local/tomcat/conf/context.xml  (在此文件的<Context>和</Context>里面加上下面一段)
 <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
 memcachedNodes="n1:1.1.1.130:11211"    --这里的ip为memcached服务器的IP
 lockingMode="auto"
 sticky="false"
 requestUriIgnorePattern= ".*\.(png|gif|jpg|css|js)$"
 sessionBackupAsync= "false"
 sessionBackupTimeout= "100"
 copyCollectionsForSerialization="true"
 transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory" />
 并把两台tomcat分别启动(如果你先前启动了要重启)
 # /usr/local/tomcat/bin/shutdown.sh
 # /usr/local/tomcat/bin/startup.sh
 # lsof -i:8080
 
 
 第四步:
 在1.1.1.130上安装并启动memcached
 软件包在  笔记目录/program/lnmp_soft/
 # tar xf libevent-1.4.11-stable.tar.gz -C /usr/src/
 # cd /usr/src/libevent-1.4.11-stable/
 # ./configure ;make ;make install
 # tar xf memcached-1.4.22.tar.gz -C /usr/src/
 # cd /usr/src/memcached-1.4.22/
 # ./configure --with-libevent=/usr/local/ ;make ;make install
 
 # /usr/local/bin/memcached -d -m 100 -u root
 
 # lsof -i:11211
 
 
 第五步:
 我这里nginx,tomcat1,tomcat2是合起来做一个应用,所以它们的家目录里的内容应该是一样的,如何让一个应用内容在它们那里一致?
 方法1:远程实时rsync同步
 方法2:共享存储或分布式存储(后面课程会讲,但现在也可以使用nfs来模拟共享存储)
 
 在nginx的家目录/nginxroot/里,并且在tomcat1和tomcat2的家目录/usr/local/tomcat/webapps/ROOT/里建立一个测试文件(如果有nfs做共享存储,则只需要建立一次就可以了)
 # vim session.jsp
 SessionID:<%=session.getId()%> <BR>
 SessionIP:<%=request.getServerName()%> <BR>
 SessionPort:<%=request.getServerPort()%>
 
 第六步:
 确认nginx和tomcat1和tomcat2和memcached都是启动状态,客户端使用firefox来测试
 
 测试一:
 http://10.1.1.36/session.jsp  --不断F5刷新,sessionID是不变的
 
 elinks -dump http://10.1.1.36/session.jsp --不要使用这种方式来测,因为这样每次是一个新的连接,session id是会变的,但也会存储到memcache中
 
 在memcache服务器上进行下面的操作
 # echo "stats cachedump 3 0" | nc 1.1.1.130 11211 > /tmp/session.txt
 # cat /tmp/session.txt |head -1 --导出的第一行的session ID就等于上面页面刷新时的session id,说明session id确实存放在memcache里
 ITEM validity:A8F853F36B9931DD5ADF51DFB806A0CF-n1 [20 b; 1442225217 s]
 
 测试二:
 分别把tomcat1和tomcat2里的第三步做的加到/usr/local/tomcat/conf/context.xml这个文件里的一段给注释掉,重启tomcat,再做上面的测试
 
 http://10.1.1.36/session.jsp  --不断F5刷新,sessionID是会变化的
 在memcache服务器上进行下面的操作
 # echo "stats cachedump 3 0" | nc 1.1.1.130 11211 > /tmp/session.txt
 # cat /tmp/session.txt   --这次不会记录与firefox页面刷的session ID,说明session ID没有记录到memcache里
 
 =======================================================
 --上面的实验测试了tomcat集群并解决了session同步的问题,但并没有上应用
 
 client  10.1.1.35
 |
 | 10.1.1.36
 nginx
 |     1.1.1.127
 |
 |----------|
 tomcat1          tomcat2
 1.1.1.128     1.1.1.129
 
 |        |
 |----------------------|
 |
 |
 1.1.1.130  memcached服务器,nfs,mysql
 在上面的基础上再继续做
 1,在1.1.1.130上使用NFS做共享存储
 做一个NFS把jsprun给共享出去
 # mkdir /jsprun
 # unzip JspRun_v6.0.0_UTF8.zip -d /jsprun/
 # cd /jsprun
 # mv JspRun\!_6.0.0_UTF8/upload/* .
 # rm JspRun\!_6.0.0_UTF8/ -rf
 
 # vim /etc/exports
 /jsprun  *(rw,no_root_squash)
 # /etc/init.d/rpcbind restart
 # /etc/init.d/nfs restart
 2,在nginx上挂载
 先重启rpcbind服务
 # /etc/init.d/rpcbind restart
 再挂载
 # mount -t nfs -o vers=3 1.1.1.130:/jsprun /nginxroot/
 在tomcat1和tomcat2上挂载
 # mount -t nfs -o vers=3 1.1.1.130:/jsprun /usr/local/tomcat/webapps/ROOT/
 --上面做完,那么nginx和tomcat所有人的家目录都使用的是NFS共享存储上的,因为使用的是同一个存储,所以数据绝对一致
 
 3,在1.1.1.130上安装mysql数据库,并授权
 # yum install mysql* -y
 # /etc/init.d/mysqld restart
 # mysql
 mysql> create database jsprun;
 mysql> grant all on jsprun.* to 'li'@'1.1.1.128' identified by '123';
 mysql> grant all on jsprun.* to 'li'@'1.1.1.129' identified by '123';
 mysql> flush privileges;
 
 4,安装jsprun
 在nginx或tomcat1或tomcat2上安装jsprun
 我这里在tomcat1上安装
 http://1.1.1.128:8080/install.jsp
 
 =====================================================================
 课后扩展:
 client  10.1.1.35
 DNS轮循(同一域名轮循解析成两个nginx的公网IP)
 |
 10.1.1.36   | 10.1.1.37
 nginx1   nginx2
 1.1.1.126   |     1.1.1.127
 |
 |----------|
 tomcat1          tomcat2
 1.1.1.128     1.1.1.129
 
 |        |
 |----------------------|
 |
 |
 |
 |----------------------|
 memcached1  |   memcached2
 1.1.1.130  |    1.1.1.131
 |
 |
 |
 mysql集群+分布式存储(或nfs模拟)
 
 ===================================
 
 有兴趣可以去查一下一些老的做法如:session 复制,mod_jk等
 
 
 | 
 |