【Linux】基于Ubuntu搭建Apache + Tomcat+ Memcached集群

129 阅读6分钟

这又是一篇来自2015年的文章,当时因为要解决一个项目Session共享问题,需要搭建与生产环境一样的环境进行验证。同时,根据领导要求需要将生产环境做成水平扩展集群,因此也在本环境中进行验证。

1. 安装Ubuntu

1.png

其实ubuntu的安装没有什么好说的(虽然是CLI安装,但只要按照指示一步一步安装问题不大)。另外,虚拟机使用的是VirtualBox,用了“仅主机(Host-Only)适配器”的网络模式,所以在安装过程中需要配置子网ip,其他的没有什么好说的。

2.png

因为想安装一台“干净”的机器,在这个环节一个都没选直接下一步。其实真的需要时通过apt-get获取即可。10分钟后一台ubuntu裸机就可以使用了。

3.png

2. Ubuntu配置

2.1 配置root账号对应密码

为了方便操作采用root登录,先通过 sudo passwd root 来设置root对应的密码

4.png

2.2 设置静态网络地址

在root账号下再试试当前网络,ping了一下百度发现ping不通,但ping本机没有问题,这是因为我使用了Host-Only的方式设定了虚拟机的网络。

5.png

既然这样先修改**/etc/network/interfaces**让其自动获取ip,然后将虚拟机切换成NAT网络,让Ubuntu连上外网下载些软件再说。

6.png

iface eth0 inet dhcp行前方的“#”去掉,并且将下方三行给注释掉即可。接着就将虚拟机网络改成NAT模式

7.png

系统重启后再ping一下百度,可以ping通了。

8.png

吐槽:这里就能够看到当时自己的稚嫩的地方,我如果在安装之前就已经设置好虚拟机的NAT网络,这一步就不用做了。又或者在宿主机上增加一个虚拟网卡作为转发网关,那么Host-Only的网络也是可以访问外网的......这里还以为自己解决了什么难题,仔仔细细地写下来,现在感觉就很羞耻ε=(´ο`*)))唉

3 安装所需软件

既然能够连接互联网,那么通过apt-get来下载所需软件吧。

3.1 Apache2

通过apt-get install apahce2直接下载安装

9.png

3.2 Memcached

通过apt-get install memcached下载安装memcached

10.png

3.3 Unzip

为了后面方便也安装一个Unzip用来对zip文件进行解压,apt-get install unzip

11.png

3.4 PSCP

Windows与Linux之间文件传输直接从网上下载了一个pscp工具通过命令行执行数据传输。将pscp.exe文件放在C:/windows/system32文件夹里面就可以在cmd里面使用了。

12.png

3.5 JDK1.6

在Oracle官网下载1.6版本的JDK,先通过chmod修改操作权限后,再执行bin文件的安装

13.png

安装完成后在**/etc/profile**配置自己jdk的环境变量。

14.png

3.6 Tomcat

Tomcat解压后先配置一个来试运行项目,待运行成功后再将其复制两个出来做成三Tomcat的水平集群即可。

4. Apache配置

使用vim编辑apache2.conf文件,vim /etc/apache2/apache2.conf

15.png

将ServerRoot解封,并添加ServerName作为访问路径的前缀,最终是通过域名来访问的。

16.png

将Ubuntu中提供的端口关闭,这个我们不需要。

17.png

设置文件目录访问路径,以后测试用到的web工程都放在**/home/timss/tomcat/tomcat_webapps/ROOT/memcacheTest**文件夹里面,当然这个文件夹现在没有,稍后将会添加。

将需要使用到的mod开启,这个需要在命令行中启动

a2enmod slotmem_shm

a2enmod slotmem_plain

a2enmod lbmethod_bytraffic

a2enmod proxy

a2enmod proxy_balancer

a2enmod proxy_http

a2enmod proxy_ajp

mod启动完成后可以进去/etc/apache2/mods-enabled中确认一下看mod是否都开启了

18.png

最后在sites-available 建立配置文件timss.conf

19.png

Listen:是监听那个端口

ServerName:是网络主机的名称

ServerAlias:是网络别名,这个是以后访问的域名后缀

DocumentRoot:是访问文件目录

DirectoryIndex:配置首页

除此之外,其他的都是负载均衡相关配置。由于Apache使用的是粘性Session复制方法,按照官方的说法Apahce会将Session指定到一台机器上面进行保存,但是会存在Tomcat宕机后Session丢失的风险。而现在我们将这个Session指定到Memcached里保存基本上规避了Session丢失的风险了。此外,以后若要添加多一台服务器,直接可以在这里添加负载成员(BalancerMember)就可以,其他配置可以不用动了。

最后,还需要为Apache创建一个sites-enabled的超链接,因为Apache启动时将读取sites-enabled里面的超链接,之后再通过超链接访问sites-available中指定文件,所以这里先加一个超链接。

20.png

至此Apache已全部配置完毕。

5. Memcached配置

使用vim /etc/memcached.conf对配置文件进行修改

21.png

这里只需修改最大内存数量即可。

6. Tomcat配置

将集群配置需要的jar包上传到指定位置

22.png

在${TOMCAT_HOME}目录下创建一个tomcat_webapps文件夹,并且在里面也创建一个ROOT文件夹

23.png

进入${TOMCAT_HOME}/tomcat7_8080/bin目录中并用./startup.sh启动tomcat,启动完成后通过本地ip访问,看是否成功

24.png

验证成功后先关掉tomcat,进入${TOMCAT_HOME}/conf目录下配置context.xml文件

25.png

由于要做Session复制所以要在Context标签中加上distributable属性,如果这里不加也可以在项目的web.xml里面加上< distributable/>标签的。接下来还要写上这个

26.png

这个是Memcached的Tomcat配置信息,而这里面又分两种配置,一个是基于kryo的序列化,而另外一个是基于javolution的序列化。经过测试两种方式都是可以执行的,但是kryo效率明显比javolution的要高,所以这里就选择用kryo的配置。

其中memcachedNodes里面配置的是memcached的ip和端口,由于memcached支持分布式部署的,所以这里可以填写多个,用逗号隔开就可以了。若部署多个的话在这里还要加多一个属性failoverNodes="n1",让Tomcat知道应该将缓存的内容不放在那个memcached服务器。

之后就轮到server.xml配置,先在Engine标签中添加一个jvmRoute的属性,里面指定的是Apache的节点名称。

27.png

然后将Cluster的标签解开

28.png

由于是测试用的,所以集群就用Tomcat提供的最简单的就可以了。下面找到Host标签并在里面配置alias和context

29.png

Tomcat启动的时候不直接读取自身的webapps文件夹中的内容,而是读${TOMCAT_HOME}/tomcat_webapps/ROOT里面的,这样就可以多个Tomcat读取同一份文件,也只需要发布一次即可。

Tomcat配置完之后先别急着启动,先配置一下网络别名vim /etc/hosts

30.png

添加Apache访问的域名mctest.com

31.png

上传测试用的web项目

32.png

上传后解压并测试启动

33.png

项目启动后若需要使用宿主机通过域名访问,则需要修改宿主机的hosts文件,路径为C:\windows\system32\drivers\etc\hosts

34.png

之后可以在宿主机通过域名访问试试

35.png

看到这个画面证明已经能够正常访问了,接下来就将tomcat7_8080的内容复制两份并修改端口,这时就需要修改对应服务端口来区分,譬如server.xml中shutdown的端口

36.png

容器端口

37.png

如果tomcat中需要使用ajp服务那对应的ajp端口也需要修改

38.png

除了端口需要修改外,Engine标签内容在扩展容器中可以删除

39.png

完成上述的配置后,分别启动三个Tomcat容器,通过域名访问可以看到以下页面

40.png

若将8080端口的tomcat关闭掉,再次刷新可以看到

41.png

SessionID后缀发生了改变,从原来的tm改为了ts这就证明服务已经切换到另一台tomcat容器里面了。若将三个集群节点都关闭,重新刷新页面则会发生无法访问的情况。

42.png

在无法访问的状态下重新将tomcat7_8080的容器开启,可以看到

43.png

虽然三个Tomcat节点都曾经关闭过,但由于Session已经缓存到Memcached中了因此会话还是会保留的,只要服务恢复使用用户并不需要重新登录。

7. 补充说明

Apache提供两种Session复制的方式,一种是粘性Session复制,另一种是非粘性Session复制。

  • 粘性Session复制,是将所有的Session复制到指定的一台Tomcat服务器中,这种方式的复制效率高而且简单,但是当指定的Tomcat服务器宕机之后,所有的Session将会失去。

  • 非粘性Session复制,采用广播的方式,将Session复制到每一台Tomcat服务器中,每一次Session发生变动都会重新序列化,并将网络中的每台Tomcat服务器的Session进行覆盖。这种方式虽然保险,但是资源浪费极大。