(文中的主机均在kvm上虚拟)

linux + tomcat/jboss/weblogic/websphere/resin +  mysql/oracle/db2 + java

====================================================================================================================

名词
jdk (jre,jvm)       (跑任何java程序或软件,都需要先安装jdk)
j2ee	javaee  Enterprise Edition 
j2se    javase  Standard Edition 
j2me    javame  Micro Edition
中间件

j2ee平台由一整套服务,应用程序接口和协议规范组成

Java 2 Platform,Enterprise Edition


tomcat  (apache软件基金会)
jboss	wildfly  (redhat)
weblogic  (oracle)
websphere	(IBM)
resin		(CAUCHO)

====================================================================================================================
	tomcat   
   
	apache + tomcat  

官网地址:
http://tomcat.apache.org/	

JDK  (java   development  kit)  ,JDK是整个JAVA的核心,包括了JAVA运行环境,JAVA工具和基础类库等。


tomcat8.0.20的安装过程

1,解压安装jdk
# tar xf jdk-8u45-linux-x64.tar.gz -C /usr/local/

# ls /usr/local/jdk1.8.0_45/		--确认解压成功
bin        javafx-src.zip  man          THIRDPARTYLICENSEREADME-JAVAFX.txt
COPYRIGHT  jre             README.html  THIRDPARTYLICENSEREADME.txt
db         lib             release
include    LICENSE         src.zip

2,解压安装新版本tomcat
# tar xf apache-tomcat-8.0.20.tar.gz -C /usr/local/

# mv /usr/local/apache-tomcat-8.0.20/ /usr/local/tomcat


3,tomcat的环境变量的定义

定义在单个tomcat的启动和关闭程序里
# vim /usr/local/tomcat/bin/startup.sh 
# vim /usr/local/tomcat/bin/shutdown.sh 

把startup.sh和shutdown.sh这两个脚本里的最前面(但要在#!/bin/bash下在)加上下面一段

export JAVA_HOME=/usr/local/jdk1.8.0_45/
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/jdk1.8.0_45/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/jdk1.8.0_45/
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(你的ip地址):8080

可以加到rc.local里做成开机自动启动
# echo /usr/local/tomcat/bin/startup.sh >> /etc/rc.local


关闭方法
# /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端口


=============================================================================

总结一个小错误:
在执行/usr/local/tomcat/bin/shutdown.sh关闭时,如果有下面的错误信息
...... 
Jul 28, 2017 11:56:26 AM org.apache.catalina.startup.Catalina stopServer
SEVERE: Could not contact localhost:8005. Tomcat may not be running.
Jul 28, 2017 11:56:26 AM org.apache.catalina.startup.Catalina stopServer
SEVERE: Catalina.stop: 
......


解决方法:
# vim /usr/local/jdk1.8.0_45/jre/lib/security/java.security 

117 securerandom.source=file:/dev/urandom	--找到这一行,把random改成urandom

再kill杀掉进程重启测试

-------------------------------------

目录布署

# 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>

=====================================================================

安装完tomcat后,就可以将开发的java应用装上进行测试了
因为java开发的开源应用非常少,并且很多不支持较新版本的tomcat,我们这里又是实验环境,所以这里简单安装一个jspxcms让大家看下效果


一个开源的java cms系统jspxcms(java内容管理系统)

软件包:
jspxcms-5.2.4-release.zip


步骤:
1,解压jspxcms
# rm /usr/local/tomcat/webapps/ROOT/*  -rf   --解压之前先删除原来家目录里的文件
# unzip jspxcms-5.2.4-release.zip -d /usr/local/tomcat/webapps/

2,去mysql建一个库,进行授权
# yum install mariadb mariadb-server -y
# systemctl restart mariadb.service
# systemctl status mariadb.service
# systemctl enable mariadb.service

# mysql
MariaDB [(none)]> create database jspxcms;
Query OK, 1 row affected (0.00 sec)

MariaDB [(none)]> grant all on jspxcms.* to 'li'@'localhost' identified by '123';
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> flush privileges;


3,使用firefox的下面路径按照它的步骤进行安装
http://IP:8080/


5,重启tomcat后,再使用下面路径访问就可以了
/usr/local/tomcat/bin/shutdown.sh 
/usr/local/tomcat/bin/startup.sh 
前台访问地址:
http://IP:8080/
后台访问地址:(需要admin用户和其密码登录才有权限)
http://IP:8080/cmscp/index.do

==================================================================================


以前apache+tomcat+mod_jk进行整合
现在nginx替代apache,也不需要mod_jk模块

				nginx


			tomcat1		tomcat2

			      memcached


下面就配置nginx+tomcat+msm(memcached-session-manager)做综合应用


由于http是无状态的协议,你访问了页面A,然后在访问B,http无法确定这2个访问来自一个人
,因此要用cookie或session来跟踪用户,根据授权和用户身份来显示不同的页面。
比如用户A登陆了,那么能看到自己的个人信息,而B没登陆,无法看到个人信息。
还有A可能在购物,把商品放入购物车,此时B也有这个过程,你无法确定A,B的身份和购物信息,所以需要一个session ID来维持这个过程。

cookie是服务器发给客户端,并且保持在客户端的一个文件,里面包含了用户的访问信息(账户密码等),可以手动删除或设置有效期,在下次访问的时候,会返给服务器。
注意:cookie可以被禁用,所以要想其他办法,这就是session。
比如:你去商场购物,商场会给你办一张会员卡,下次你来出示该卡,会有打折优惠.该卡可以自己保存(cookie),或是商场代为保管,由于会员太多,个人需要保存卡号信息(session ID)


--------------------------------------------------------


关于session的讨论

方法大概有:

一,用cookies

二,用nginx里的ip_hash,做成类似sticky session(粘贴会话在一台服务器上)的做法

upstream tomcat {
	ip_hash;
	server 172.16.25.2:8080 weight=1;
	server 172.16.25.3: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


		张三		李四
		tomcat1		tomcat2


		     王五memcached

==========================================

下图中:
192.168.100.0/24网络我模拟外网(这里我用kvm的virbr1来模拟)
172.16.25.0/24网络我模拟内网(这里我用kvm的桥接网络来模拟)
	
nginx解析静态页面并将动态负载均衡调度给后面多个tomcat
tomcat解析java动态程序

				client  192.168.100.1
				  |
				  |	192.168.100.5
			        nginx
				  |     172.16.25.5
				  |
			 |----------|
			tomcat1          tomcat2

		172.16.25.2		   172.16.25.3
	
                      |			     |
		      |----------------------|
			         |
			         |		
                         172.16.25.4  memcached服务器

实验前准备:
1,主机名三步绑定
172.16.25.5	nginx.cluster.com
172.16.25.2	tomcat1.cluster.com
172.16.25.3	tomcat2.cluster.com
172.16.25.4	memcached.cluster.com

2,时间同步
3,关闭iptables,selinux
4,配置yum 


第一步:
1,在172.16.25.5上安装nginx

# yum install nginx -y



2,配置nginx
# cat /etc/nginx/nginx.conf |grep -v '#'

user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

include /usr/share/nginx/modules/*.conf;

events {
    worker_connections 1024;
}

http {
    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  /var/log/nginx/access.log  main;

    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 2048;

    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;

    include /etc/nginx/conf.d/*.conf;

upstream tomcat {
	server 172.16.25.2:8080 weight=1;
	server 172.16.25.3:8080 weight=1;
}


    server {
        listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  192.168.100.5;
        root         /usr/share/nginx/html;

        include /etc/nginx/default.d/*.conf;


	location ~ .*\.jsp$ {
	    proxy_pass   http://tomcat;
            proxy_set_header Host $host;
            proxy_set_header X-Forwarded-For $remote_addr;
	}


        error_page 404 /404.html;
            location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
    }


}


# systemctl start nginx
# systemctl status nginx
# systemctl enable nginx


第二步:
在172.16.25.2和172.16.25.3上安装两台tomcat(过程省略,建议tomcat重新安装,因为如果前面tomcat安装了jspxcms这个应用的话,会对后面的测试造成影响)


tomcat1和tomcat2上把下面的软件包都scp到/usr/local/tomcat/lib/目录下

# ls    --这些软件包是针对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:172.16.25.4:11211" 	  --这里的ip为memcached服务器的IP,如果有多个memcached服务器,用逗号隔开
  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

第四步:
在172.16.25.4上安装并启动memcached

# yum install memcached 

# systemctl start memcached.service 	
# systemctl status memcached.service
# systemctl enable memcached.service

# lsof -i:11211


第五步:
我这里nginx,tomcat1,tomcat2是合起来做一个应用,所以它们的家目录里的内容应该是一样的,如何让一个应用内容在它们那里一致?
方法1:远程实时rsync同步
方法2:共享存储或分布式存储(后面课程会讲,但现在也可以使用nfs来模拟共享存储)


在nginx的家目录/usr/share/nginx/html里,并且在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://192.168.100.5/session.jsp  --不断F5刷新,sessionID是不变的


elinks -dump http://192.168.100.5/session.jsp --不要使用这种方式来测,这样测试session id是会变的(elinks不能像firefox那样存放session id),但也会存储到memcache中


在memcache服务器上进行下面的操作
# echo "stats cachedump 3 0" | nc 172.16.25.4 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]

============================================================================

Logo

更多推荐