Apache_部署Java项目

jefxff 153,628 2020-04-30

部署实施时使用的集群

  • 在部署Java项目时, 可以使用Apache,或者 Nginx, 之前python项目使用过nginx, 但是Nginx的详细配置还是没有掌握; 在这里还是先学习一下Apache集群服务器(优势是: 负载均衡, 失败迁移)
  • 服务端集群分类:
    • 水平集群(失败迁移): 将服务器安装在各个不同的计算机上
    • 垂直集群(负载均衡): 一台计算机上安装多个服务

1. 搭建Apache集群

  • apache: 特点是处理静态资源)(HTML, img, js)
  • tomcat: 特点是处理动态资源
  • apache + tomcat: 实现动静分离

1.1 Apache 服务器请求的分流操作

1.2 配置 Apache

    1. 打开 conf/httpd.conf 文件; 修改(该路径就是上面解压的Apache的安装目录): Define SRVROOT "D:\dev\cluster\Apache24"
    1. 将Apache配置成Windows服务
    • 以管理员身份打开CMD, 执行命令
    • "D:\dev\cluster\Apache24\bin\httpd.exe" -k install -n apache24
    • 可能报错丢失 VCRUNTIME140.DLL, 需要下载安装 vc_redist.x64.exe 下载地址
    • 删除Apache服务: sc delete apache24
    1. 注册成功后, 查看localhost是否注册成功

1.3 配置 tomcat

  • 将Tomcat复制两份, 分别命名tomcat-a, tomcat-b 均放在D:\dev\cluster
  • 规划端口(tomvat-a|tomvat-b/conf/server.xml):
    • Tomcat-a:server端口: 1005; http端口:1080; ajp端口: 1009
    • Tomcat-b:server端口: 2005; http端口:2080; ajp端口: 2009
  • 配置Engine(tomvat-a|tomvat-b/conf/server.xml):
    • Tomcat-a: <Engine name="Catalina" defaultHost="localHost" jvmRoute="tomcat-a">
    • Tomcat-b: <Engine name="Catalina" defaultHost="localHost" jvmRoute="tomcat-b">
  • 打开集群开关(tomvat-a|tomvat-b/conf/server.xml)
    • 将以下注释打开: <Cluster ClassName="org.apache.catalina.ha.tcp.SimpleTcpCluster" />

1.4 将配置好的Apache和Tomcat结合起来

  • 需要下载mod_jk.so, 下载后解压将mod_jk.so文件复制到Apache的modules目录下
  • 在Apache/conf目录下新建 workers.properties文件
  • workers.properties文件内容
worker.list=controller,tomcat-a,tomcat-b
# tomcat-a
# 配置端口号
worker.tomcat-a.port=1009
# 配置ip地址, 部署时就是IP地址, 本机演示就是localhost
worker.tomcat-a.host=localhost
# 配置 
worker.tomcat-a.type=ajp13
# 配置负载均衡的比重
worker.tomcat-a.lbfactor=1

# tomcat-b
# 配置端口号
worker.tomcat-b.port=2009
# 配置ip地址, 部署时就是IP地址, 本机演示就是localhost
worker.tomcat-b.host=localhost
# 配置 
worker.tomcat-b.type=ajp13
# 配置负载均衡的比重
worker.tomcat-b.lbfactor=2

# controller 
# 配置分流器的类型(负载均衡)
worker.controller.type=lb
# 配置两个需要分流的列表
worker.controller.balanced_workers=tomcat-a,tomcat-b
# true: session使用sticky策略(固定在一个服务器); false: session使用session广播的策略
worker.controller.sticky_session=false
1.4.1 配置worker.properties是session策略:
  • sticky策略: 固定将每一个用户的请求分配个特定的服务器, 后期的请求不会分给其他的服务器; 弊端是无法失败迁移(理解就是x第一次通过Apache访问了tomcat-a, tamcat-a保存了x的session, 后期x再来时, 指定是配分配到tomcat-a, 而不会分给别的服务器)
  • session广播: 自动同步session; 弊端是容器造成广播风暴(理解就是x第一次通过Apache访问了tomcat-a, tamcat-a保存了x的session,tomcat-a会自动将x的session信息广播给其他的tamcat服务器, 结果就是每个服务器都保留的x的session信息, 这样x下次在来时, controller会按照指定的策略分配x到对应的服务器, 而不是分配给tomcat-a)
  • 集中管理方式(重点):理解就是将各个服务器的session集中到一个数据库或者容器进行管理, 下次来访问时, 服务器去这个专门管理session的数据库或容器去验证session是否存在, 以此来做判断

1.5 在Apache/conf下面配置mod_jk.conf(用于加载mod_jk.so和workers.properties)

  • 内容
# 加载mod_jk.so
LoadModule jk_module modules/mod_jk.so
# 加载workers.properties
JkWorkersFile conf/workers.properties
# /* 表示分流所有的(jsp, servlet, html)  /*.jsp 表示只分流jsp, /*.html 表示拦截.html文件, servlet可以自加后缀来拦截
JkMount /* controller

1.5 将mod_jk.conf加载到httpd.conf

  • 这就会使apache启动时加载mod_jk.conf, mod_jk.conf再连接Apache和tomcat, 最终完成配置
  • 再httpd.conf最后面加一句代码: include conf/mod_jk.conf

注意:

    1. 需要在具体的web项目里的web.xml中加一句<distributable/>
    1. CATALINA_HOME 会使启动tomcat时, 自动启动CATALINA_HOME指定的tomcat, 而集群中需要开启多个不同的tomcat, 因此再单机环境下, 需要删除 CATALINA_HOME 环境变量
    1. 依次启动Apache, tomcat-a, tomcat-b
    1. Apache中: worker.list-controller,tomcata,tomcatb; Tomcat配置中: jvmRoute="'tomcat-a",jvmRoute="'tomcat-a"; 以及tomcat服务器的目录名tomcata,tomcatb他们可以不一样, 之间没有什么关系
    1. 删除本机的 CATALINA_BASE:D:\Program Files (x86)\apache-tomcat-8.5.51
    1. 删除本机的 CATALINA_HOME:D:\Program Files (x86)\apache-tomcat-8.5.51
    1. 启动tomcat时报错"org.apache.catalina.LifecycleException", 解决办法是: 在<Connector protocol="AJP/1.3" port="10090"redirectPort="8443" secretRequired="" />中添加 secretRequired=""字段

# Java # Linux 部署